Bu senaryoda, basit maliyet parametreleriyle bir araca atanan durakların sırası optimize edilir. Bu, rota optimizasyonu işleminin en basit modudur ve tüm durakların belirtilen zaman aralığında ziyaret edilmesini sağlar.
Aşağıdaki örnekte, depo adı verilen tek bir konumdan gelen bir araç ve üç gönderim içeren temel bir senaryo gösterilmektedir.
Örnek istek
{ "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 } ] } }
Rota Optimizasyonu istek alanları
Genel Bakış bölümünde belirtildiği gibi, en önemli rota optimizasyonu istek özellikleri vehicles
ve shipments
'dır.
İstek, araca ve gönderimlere ek olarak aşağıdaki alanları içerir:
Çoklu çizgiler
populatePolylines
ve populateTransitionPolylines
, Rota Optimizasyonu'nun çoklu çizgiler döndürüp döndürmeyeceğini belirtir.
Hizmet, poli çizgileri kodlarken Maps JS poli çizgisi codec'ini kullanır. Bu codec, yazdırılabilir ASCII karakterlerini kullanarak ikili poli çizgisi verilerini temsil eder. Rota Optimizasyonu tarafından hesaplanan yolları görselleştirmek için Etkileşimli Poli Çizgi Kodlayıcı Yardımcı Programı'nı kullanabilirsiniz. Bu kılavuzdaki örnekte populatePolylines
ve populateTransitionPolylines
doğru olarak ayarlanmıştır ancak diğer kılavuzlarda yanıt boyutunu azaltmak için bu değerler yanlış olarak ayarlanmıştır.
Kodlama biçiminin açıklaması için Kodlanmış Poli Çizgi Algoritması Biçimi başlıklı makaleyi inceleyin.
Küresel zaman kısıtlamaları
model.globalStartTime
ve model.globalEndTime
, rastgele bir 24 saatlik döneme ayarlanmıştır. Bu sayede, çıkış zaman damgalarının yorumlanması kolaylaşır.
Konumları ziyaret etme
Örnek istekte yalnızca model.shipments[].pickups[].arrivalLocation
ve model.shipments[].deliveries[].arrivalLocation
kullanılmaktadır. Aracın, geldiği yerden farklı bir noktadan ayrıldığı durumlar için de departureLocation
mülkü vardır (ör. binanın bir tarafında girişi, diğer tarafında çıkışı olan bir otopark kompleksi). Bu ve sonraki kılavuzlarda, varış ve kalkış noktalarının aynı olduğu varsayılır.
waypoint
, latLng
'e alternatif olarak da kullanılabilir.
Waypoint
alanları, LatLng
yerine Google yer kimliklerinin kullanılmasını destekler ve araç başlıklarını da belirtebilir. Daha fazla ayrıntı için referans dokümanlarını (REST, gRPC) inceleyin.
Örnekteki kısıtlamalar
Bu senaryo, optimizatör için çeşitli kısıtlamalar getirir:
- Tüm etkinlikler, genel başlangıç ve bitiş saatleri arasında tamamlanmalıdır. Bu senaryoda, gönderimlerin yakınlığı ve geniş küresel zaman aralığı göz önüne alındığında başlangıç ve bitiş zamanları çok gevşek bir kısıtlamadır.
- Tüm gönderimler tamamlanmış olmalıdır.
shipments
'te ceza maliyetleri belirtilmediğinde varsayılan davranış budur. costPerKilometer
vecostPerHour
, araçta ayarlanır.
Maliyetler Maliyet Modeli Parametreleri bölümünde ele alınmıştır.
Rota Optimizasyonu yanıt özellikleri
Örnek isteğe verilen yanıtı görme
{ "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 } } }
Rota Optimizasyonu yanıtı, önerilen rotaları temsil eden ve araç başına bir rota içeren üst düzey bir routes
alanı içerir. Bu kılavuzdaki örnek istekte yalnızca bir araç belirtildiğinden routes
, bir ShipmentRoute
mesajı içerir.
ShipmentRoute
tesis
ShipmentRoute
mesaj türü için en önemli iki özellik visits
ve transitions
'tir.
Her Visit
, istek mesajındaki VisitRequest
lardan birinde teslimat veya teslim alma işleminin tamamlandığını gösterir. Ziyaret, bir aracın belirli bir yerde ve zamanda tamamlaması için atanan bir iştir.
Her Transition
, bir konumdan diğerine giden aracı temsil eder. Araç başlangıç noktası, ziyaret konumu ve araç bitiş noktası arasında geçişler olabilir.
Aracın tüm rotasını yeniden oluşturmak için ShipmentRoute
'nin visits
ve transitions
değerleri birleştirilmelidir. Alanların araç etkinliği ilerleme durumuna göre kombinasyonu aşağıdaki gibi görünür:
request.vehicles[0].startLocation -> transitions[0] -> visits[0] ->
transitions[1] -> visits[1] -> transitions[2] -> ... -> visits[3] ->
transitions[4] -> request.vehicles[0].endLocation
Araç, başlangıç konumundan rotanın başındaki ilk ziyaretine ve son ziyaretinden rotanın sonundaki bitiş konumuna gitmesi gerektiğinden, ShipmentRoute
her zaman visits
'den bir transitions
daha fazladır. Aracın başlangıç veya bitiş konumu yoksa ilk veya son ziyaretin konumu, aracın sırasıyla başlangıç veya bitiş konumu olarak kullanılacağından visits
'ten bir fazla transitions
olacaktır.
Bu örnekte, ilk üç teslim alma ziyareti arasında sıfır mesafe ve süreyle geçişler vardır. Bunun nedeni, üç teslim alma işleminin de istekte aynı konumu paylaşmasıdır.
Daha fazla bilgi için ShipmentRoute
referans dokümanlarını (REST, gRPC) inceleyin.
Basit yol noktası sırası optimizasyonu
Bu örnekte gösterildiği gibi, rota optimizasyonu, ziyaretleri gönderimlerin özellikleri olarak modeller ve bağımsız bir öğe olarak yol işaretleri veya durak kavramına sahip değildir. Ancak, durakları veya yol noktalarını, teslim alma veya teslimat olarak tam olarak bir VisitRequest
içeren gönderimler olarak temsil etmek mümkündür. Optimize edici, en uygun rotayı (uygun bir rota bulmak yerine) bulmak için araca yine de bir costPerHour
veya costPerKilometer
atamalıdır.