Bu senaryo, basit maliyet parametreleriyle bir araca atanan durakların sırasını optimize eder. Bu, Rota Optimizasyonu işleminin en basit modudur ve tüm durakların belirtilen zaman aralığı içinde ziyaret edilmesini sağlar.
Aşağıdaki örnekte, tümü depot adı verilen tek bir konumdan kaynaklanan bir araç ve üç gönderim içeren temel bir senaryo gösterilmektedir.
Örnek isteği inceleyin
{ "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 isteği özellikleri vehicles
ve shipments
'dır.
Talep, araç ve gönderimlere ek olarak aşağıdaki alanları da içerir:
Çoklu çizgiler
populatePolylines
ve populateTransitionPolylines
, Rota Optimizasyonu'nun çoklu çizgiler döndürüp döndürmeyeceğini belirtir.
Hizmet, Çoklu çizgileri Haritalar JS çoklu çizgi codec'ini kullanarak kodlar. Bu codec, yazdırılabilir ASCII karakterleri kullanan ikili çoklu çizgi verilerini temsil eder. Rota Optimizasyonu tarafından hesaplanan yolları görselleştirmek için Etkileşimli Çoklu Çizgi Kodlayıcı Yardımcı Programı'nı kullanabilirsiniz. Bu kılavuzdaki örnekte populatePolylines
ve populateTransitionPolylines
değerleri doğru olarak ayarlanır, diğer kılavuzlar ise yanıt boyutunu azaltmak için bunları "yanlış" olarak ayarlar.
Kodlama biçiminin açıklaması için Kodlanmış Çoklu Çizgi Algoritma Biçimi'ne bakın.
Küresel saat kısıtlamaları
model.globalStartTime
ve model.globalEndTime
rastgele 24 saatlik bir süreye ayarlandı. Bu, çıkış zaman damgalarının yorumlanmasını kolaylaştırır.
Konumları ziyaret edin
Örnek istekte yalnızca model.shipments[].pickups[].arrivalLocation
ve model.shipments[].deliveries[].arrivalLocation
kullanılır. Ayrıca aracın geldiği yerden farklı bir noktadan ayrıldığı durumlarda (ör. binanın bir tarafında girişi ve diğerinde çıkışı olan bir otopark) departureLocation
özelliği bulunur. Bu ve sonraki kılavuzlarda, varış ve kalkış noktalarının aynı olduğu varsayılır.
latLng
yerine varış ve kalkış noktası waypoint
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 belgelere (REST, gRPC) göz atın.
Örnekteki kısıtlamalar
Bu senaryo, optimize ediciyi çeşitli şekillerde kısıtlar:
- Tüm etkinlikler genel başlangıç ve bitiş zamanları arasında tamamlanmalıdır. Bu senaryoda başlangıç ve bitiş zamanları, gönderimlere yakınlık ve geniş küresel zaman aralığı göz önünde bulundurulduğunda oldukça esnek bir kısıtlamadır.
- Tüm gönderimlerin tamamlanması gerekir. Bu,
shipments
üzerinde ceza maliyetleri belirtilmediğinde varsayılan davranıştır. costPerKilometer
vecostPerHour
araçta ayarlandı.
Maliyetler Maliyet Modeli Parametreleri bölümünde ele alınır.
Rota optimizasyonu yanıtı özellikleri
Örnek isteğe verilen yanıtı görüntüleyin
{ "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ı, araç başına bir rota olacak şekilde, önerilen rotaları temsil eden üst düzey routes
alanını içerir. Bu kılavuzdaki örnek istek yalnızca bir araç belirttiğinden routes
, bir ShipmentRoute
mesajı içerir.
ShipmentRoute
tesis
ShipmentRoute
mesaj türü için en önemli iki özellik visits
ve transitions
şeklindedir.
Her Visit
, istek mesajındaki VisitRequest
öğelerin birinden teslim alma veya teslimatın tamamlandığını temsil eder. Ziyaret, bir yerde ve zamanda bir araç tarafından
tamamlanacak etkin bir şekilde atanır.
Her Transition
bir konumdan diğerine seyahat eden aracı temsil eder. Aracın başlangıç noktası çifti, ziyaret konumu ve aracın uç noktası arasında geçişler meydana gelebilir.
Aracın tam rotasının yeniden oluşturulması için ShipmentRoute
visits
ve transitions
birleştirilmelidir. Alanların araç etkinliği ilerlemesi şeklinde kombinasyonu şöyle 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
Bir ShipmentRoute
, visits
değerinden her zaman bir fazla transitions
değerine sahiptir. Bunun nedeni, aracın başlangıç konumundan rotanın başındaki ilk ziyaretine ve son ziyaretinden rotanın sonundaki bitiş konumuna kadar gitmesi gerekir. Aracın başlangıç veya bitiş konumu eksikse ilk veya son ziyaretin konumu sırasıyla aracın başlangıç veya bitiş konumu olarak kullanıldığından visits
ile kıyaslandığında bir transitions
fazla transitions
olacaktır.
Bu örnekte, ilk üç teslim alma ziyareti arasında mesafe ve süre sıfır olan geçişler vardır. Bunun nedeni, üç teslim almanın da istekte aynı konumu paylaşmasıdır.
Daha fazla bilgi için ShipmentRoute
referans belgelerine (REST, gRPC) bakın.
Basit ara nokta sırası optimizasyonu
Bu örneğin de gösterdiği gibi, Rota Optimizasyonu, ziyaretleri gönderim özellikleri olarak modeller ve bağımsız bir varlık olarak ara noktaları veya duraklar kavramı yoktur. Bununla birlikte, durakları veya ara noktaları teslim alma veya teslimat kapsamında tam olarak bir VisitRequest
ile gönderim olarak temsil etmek mümkündür. Optimize Edici'nin en uygun rotayı bulması (makul olan herhangi bir rotayı bulmak yerine) için araca yine de bir costPerHour
veya costPerKilometer
atanmalıdır.