Skenario ini mengoptimalkan urutan perhentian yang ditetapkan untuk kendaraan dengan parameter biaya. Ini adalah mode paling sederhana dari operasi Pengoptimalan Rute, dan memastikan semua perhentian dikunjungi dalam jangka waktu yang ditentukan.
Contoh berikut mengilustrasikan skenario dasar dengan satu dan tiga kendaraan pengiriman, semuanya berasal dari satu lokasi yang disebut depot.
Lihat contoh permintaan
{ "populatePolylines": true, "populateTransitionPolylines": true, "model": { "globalStartTime": "2023-01-13T16:00:00-08:00", "globalEndTime": "2023-01-14T16:00:00-08:00", "shipments": [ { "deliveries": [ { "arrivalLocation": { "latitude": 37.789456, "longitude": -122.390192 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ] }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ] }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ] } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerKilometer": 10.0, "costPerHour": 40.0 } ] } }
Kolom permintaan Pengoptimalan Rute
Seperti disebutkan dalam Ringkasan, permintaan Pengoptimalan Rute yang paling penting
properti adalah vehicles
dan shipments
.
Selain kendaraan dan pengiriman, permintaan tersebut mencakup hal-hal berikut bidang:
Polyline
populatePolylines
dan populateTransitionPolylines
menentukan apakah Rute
Pengoptimalan akan menampilkan polyline.
Layanan ini mengenkode Polyline menggunakan codec polyline Maps JS, yang mewakili
data polyline biner menggunakan karakter ASCII yang dapat dicetak. Anda dapat menggunakan
Utilitas Encoder Polyline Interaktif untuk memvisualisasikan jalur yang dihitung oleh
Pengoptimalan Rute. Contoh dalam panduan ini menetapkan populatePolylines
dan
populateTransitionPolylines
ke benar, tetapi panduan lain menetapkannya ke salah (false) ke
mengurangi ukuran respons.
Lihat Format Algoritme Polyline yang Dienkode untuk mengetahui deskripsi encoding format font.
Batasan waktu global
model.globalStartTime
dan model.globalEndTime
ditetapkan ke 24 arbitrer
periode jam. Hal ini membuat stempel waktu output lebih mudah ditafsirkan.
Kunjungi lokasi
Contoh permintaan hanya menggunakan model.shipments[].pickups[].arrivalLocation
dan
model.shipments[].deliveries[].arrivalLocation
. Tersedia juga
Properti departureLocation
untuk situasi saat kendaraan berangkat dari
titik yang berbeda dari tempat kedatangannya, seperti kompleks parkir dengan pintu masuk
di satu sisi gedung dan
jalan keluar di sisi yang lain. Dalam kolom ini dan berikutnya
dengan pemandu, titik kedatangan dan keberangkatan diasumsikan sama.
waypoint
juga ada sebagai alternatif untuk latLng
.
Kolom Waypoint
mendukung penggunaan ID Tempat Google sebagai alternatif untuk LatLng
,
dan juga dapat menentukan arah kendaraan. Lihat dokumentasi referensi
(REST, gRPC) untuk detail selengkapnya.
Batasan dalam contoh
Skenario ini membatasi pengoptimal dalam beberapa cara:
- Semua aktivitas harus diselesaikan antara waktu mulai dan berakhir global. Dalam skenario ini, waktu mulai dan berakhir merupakan kendala yang sangat longgar mengingat jarak pengiriman yang dekat dan rentang waktu global yang lebar.
- Semua pengiriman harus selesai. Ini adalah perilaku {i>default<i} ketika
Biaya penalti tidak ditentukan di
shipments
. costPerKilometer
dancostPerHour
ditetapkan pada kendaraan.
Biaya dibahas dalam Parameter Model Biaya.
Properti respons Pengoptimalan Rute
Lihat respons terhadap contoh permintaan
{ "routes": [ { "vehicleStartTime": "2023-01-14T00:00:00Z", "vehicleEndTime": "2023-01-14T00:36:41Z", "visits": [ { "shipmentIndex": 2, "isPickup": true, "startTime": "2023-01-14T00:00:00Z", "detour": "0s" }, { "shipmentIndex": 1, "isPickup": true, "startTime": "2023-01-14T00:02:30Z", "detour": "150s" }, { "isPickup": true, "startTime": "2023-01-14T00:05:00Z", "detour": "300s" }, { "startTime": "2023-01-14T00:11:25Z", "detour": "0s" }, { "shipmentIndex": 1, "startTime": "2023-01-14T00:19:29Z", "detour": "503s" }, { "shipmentIndex": 2, "startTime": "2023-01-14T00:29:02Z", "detour": "1324s" } ], "transitions": [ { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:00:00Z", "routePolyline": {} }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:02:30Z", "routePolyline": {} }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:05:00Z", "routePolyline": {} }, { "travelDuration": "235s", "travelDistanceMeters": 795, "waitDuration": "0s", "totalDuration": "235s", "startTime": "2023-01-14T00:07:30Z", "routePolyline": { "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@" } }, { "travelDuration": "234s", "travelDistanceMeters": 793, "waitDuration": "0s", "totalDuration": "234s", "startTime": "2023-01-14T00:15:35Z", "routePolyline": { "points": "cwseFti_jVRWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[`@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@" } }, { "travelDuration": "323s", "travelDistanceMeters": 1204, "waitDuration": "0s", "totalDuration": "323s", "startTime": "2023-01-14T00:23:39Z", "routePolyline": { "points": "cuseFhjVSTY`@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@" } }, { "travelDuration": "209s", "travelDistanceMeters": 665, "waitDuration": "0s", "totalDuration": "209s", "startTime": "2023-01-14T00:33:12Z", "routePolyline": { "points": "{zteFxbajV?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A" } } ], "routePolyline": { "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@RWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@STY@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A" }, "metrics": { "performedShipmentCount": 3, "travelDuration": "1001s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2201s", "travelDistanceMeters": 3457 }, "travelSteps": [ { "duration": "0s", "routePolyline": {} }, { "duration": "0s", "routePolyline": {} }, { "duration": "0s", "routePolyline": {} }, { "duration": "227s", "distanceMeters": 794, "routePolyline": { "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@" } }, { "duration": "233s", "distanceMeters": 791, "routePolyline": { "points": "cwseFti_jVRWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[`@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@" } }, { "duration": "322s", "distanceMeters": 1205, "routePolyline": { "points": "cuseFhjVSTY`@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@" } }, { "duration": "208s", "distanceMeters": 666, "routePolyline": { "points": "{zteFxbajV?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A" } } ], "vehicleDetour": "2201s", "routeCosts": { "model.vehicles.cost_per_hour": 24.455555555555556, "model.vehicles.cost_per_kilometer": 34.57 }, "routeTotalCost": 59.025555555555556 } ], "totalCost": 59.025555555555556, "metrics": { "aggregatedRouteMetrics": { "performedShipmentCount": 3, "travelDuration": "1001s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2201s", "travelDistanceMeters": 3457 }, "usedVehicleCount": 1, "earliestVehicleStartTime": "2023-01-14T00:00:00Z", "latestVehicleEndTime": "2023-01-14T00:36:41Z", "totalCost": 59.025555555555556, "costs": { "model.vehicles.cost_per_kilometer": 34.57, "model.vehicles.cost_per_hour": 24.455555555555556 } } }
Respons Pengoptimalan Rute menyertakan kolom routes
tingkat atas yang
mewakili rute yang diusulkan, dengan satu rute per kendaraan. Karena contohnya
permintaan dalam panduan ini hanya menentukan satu kendaraan, routes
mencakup satu kendaraan
ShipmentRoute
pesan.
ShipmentRoute
properti
Dua properti terpenting untuk jenis pesan ShipmentRoute
adalah
visits
dan transitions
.
Setiap Visit
merepresentasikan penyelesaian pengambilan atau pengantaran dari salah satu
VisitRequest
pesan permintaan. Kunjungan diberikan pekerjaan
secara efektif ke
diselesaikan oleh kendaraan
di tempat dan pada waktu tertentu.
Setiap Transition
mewakili kendaraan yang melakukan perjalanan dari satu lokasi ke
lokasi berikutnya. Transisi dapat terjadi antara sepasang titik awal kendaraan, kunjungan
lokasi, dan endpoint kendaraan.
Untuk merekonstruksi rute lengkap kendaraan, visits
ShipmentRoute
dan
transitions
harus digabungkan. Kombinasi {i>field <i}menjadi kemajuan
aktivitas kendaraan terlihat seperti berikut:
request.vehicles[0].startLocation -> transitions[0] -> visits[0] ->
transitions[1] -> visits[1] -> transitions[2] -> ... -> visits[3] ->
transitions[4] -> request.vehicles[0].endLocation
ShipmentRoute
selalu memiliki satu transitions
lebih banyak daripada visits
, karena
kendaraan harus melakukan perjalanan dari lokasi awal ke kunjungan pertamanya di awal
dari rute tersebut dan dari kunjungan terakhirnya
ke lokasi akhir rute di akhir
rute perjalanan. Jika kendaraan tidak memiliki lokasi awal atau akhir, akan tetap ada satu
lebih banyak transitions
daripada visits
karena lokasi kunjungan pertama atau terakhir adalah
digunakan sebagai lokasi awal atau akhir kendaraan.
Dalam contoh ini, tiga kunjungan pengambilan pertama memiliki transisi di antaranya dengan jarak dan durasi nol karena ketiga pengangkutan berbagi lokasi yang sama dalam permintaan.
Lihat dokumentasi referensi ShipmentRoute
(REST, gRPC) untuk mengetahui detail
selengkapnya.
Pengoptimalan urutan titik jalan yang sederhana
Seperti yang ditunjukkan contoh ini, model Pengoptimalan Rute berkunjung sebagai properti
pengiriman dan tidak memiliki gagasan titik jalan atau perhentian sebagai
entitas. Namun, perhentian atau titik jalan dapat direpresentasikan sebagai pengiriman
dengan hanya satu VisitRequest
sebagai layanan pengambilan atau pengantaran. Kendaraan harus tetap
ditetapkan costPerHour
atau costPerKilometer
bagi pengoptimal untuk menemukan
rute yang optimal (bukan menemukan rute yang memungkinkan).