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ığında ziyaret edilmesini sağlar.
Aşağıdaki örnekte, tek bir araç ve üç gönderi içeren temel bir senaryo gösterilmektedir. Tüm gönderiler, depo adı verilen tek bir konumdan çıkmaktadır.
Örnek bir isteğe bakın
{ "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
'dir.
İstek, araç ve gönderilere ek olarak aşağıdaki alanları içerir:
Çoklu çizgiler
populatePolylines
ve populateTransitionPolylines
, Route
Optimization'ın çoklu çizgiler döndürüp döndürmeyeceğini belirtir.
Hizmet, Polylines'ı Maps JS polyline codec'i kullanarak kodlar. Bu codec, yazdırılabilir ASCII karakterlerini kullanarak ikili çoklu çizgi verilerini temsil eder. Etkileşimli Çoklu Çizgi Kodlayıcı Yardımcı Programı'nı kullanarak Rota Optimizasyonu tarafından hesaplanan rotaları görselleştirebilirsiniz. Bu kılavuzdaki örnekte populatePolylines
ve populateTransitionPolylines
değerleri doğru olarak ayarlanmıştır ancak diğer kılavuzlarda yanıt boyutunu küçültmek için bu değerler yanlış olarak ayarlanır.
Kodlama biçiminin açıklaması için Encoded Polyline Algorithm Format'a bakın.
Küresel zaman kısıtlamaları
model.globalStartTime
ve model.globalEndTime
için rastgele bir 24 saatlik süre ayarlanmıştır. Bu sayede çıkış zaman damgaları daha kolay yorumlanır.
Konumları ziyaret etme
Örnek istekte yalnızca model.shipments[].pickups[].arrivalLocation
ve model.shipments[].deliveries[].arrivalLocation
kullanılmaktadır. Ayrıca, aracın geldiği noktadan farklı bir noktadan ayrıldığı durumlar için de bir departureLocation
özelliği vardır. Örneğin, binanın bir tarafında giriş, 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.
Varış ve ayrılış waypoint
da latLng
yerine kullanılabilir.
Waypoint
alanları, LatLng
yerine Google yer kimliklerinin kullanılmasını destekler ve araç başlıklarını da belirtebilir. Daha fazla bilgi için referans belgelerine (REST, gRPC) bakın.
Örnekteki kısıtlamalar
Bu senaryo, optimizasyon aracını çeşitli şekillerde kısıtlar:
- Tüm etkinlikler, genel başlangıç ve bitiş zamanları arasında tamamlanmalıdır. Bu senaryoda, gönderilerin birbirine yakınlığı ve küresel zaman aralığının genişliği göz önüne alındığında başlangıç ve bitiş zamanları çok esnek bir kısıtlamadır.
- Tüm gönderimler tamamlanmalıdır. Bu,
shipments
üzerinde ceza maliyetleri belirtilmediğinde varsayılan davranıştır. costPerKilometer
vecostPerHour
araçta ayarlanır.
Maliyetler Maliyet Modeli Parametreleri'nde ele alını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 en üst düzey bir routes
alanı içerir. Her araç için bir rota bulunur. Bu kılavuzdaki örnek istekte yalnızca bir araç belirtildiği için routes
, bir ShipmentRoute
mesajı içerir.
ShipmentRoute
tesis
ShipmentRoute
mesaj türü için en önemli iki özellik visits
ve transitions
'dir.
Her Visit
, istek mesajının VisitRequest
'lerinden birinde teslim alma veya teslimat işleminin tamamlandığını gösterir. Ziyaret, bir aracın belirli bir yerde ve zamanda tamamlaması gereken bir iş olarak atanır.
Her Transition
, bir konumdan diğerine giden aracı temsil eder. Geçişler, aracın başlangıç noktası, ziyaret yeri ve aracın bitiş noktası arasında gerçekleşebilir.
Aracın rotasını eksiksiz şekilde yeniden oluşturmak için ShipmentRoute
'nın visits
ve transitions
birleştirilmelidir. Alanların araç etkinliği ilerlemesi şeklinde birleştirilmesi 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
Aracın rotanın başında başlangıç konumundan ilk ziyaretine, rotanın sonunda ise son ziyaretinden bitiş konumuna gitmesi gerektiğinden ShipmentRoute
sayısı her zaman visits
sayısından bir fazladır.transitions
Araçta başlangıç veya bitiş konumu yoksa ilk ya da son ziyaretin konumu sırasıyla aracın başlangıç veya bitiş konumu olarak kullanıldığından transitions
sayısı visits
sayısından bir fazla olur.
Bu örnekte, ilk üç teslim alma ziyaretinin 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 ayrıntı için ShipmentRoute
referans belgelerine (REST, gRPC) bakın.
Basit rota noktası sırası optimizasyonu
Bu örnekte gösterildiği gibi, Rota Optimizasyonu ziyaretleri gönderilerin özellikleri olarak modeller ve bağımsız bir varlık olarak ara noktalar veya duraklar kavramına sahip değildir. Ancak durakları veya ara noktaları, teslim alma ya da teslimat olarak tam olarak bir VisitRequest
içeren gönderiler şeklinde temsil etmek mümkündür. Optimizasyon aracının uygun bir rota bulabilmesi için araca costPerHour
veya costPerKilometer
atanmış olması gerekir (uygun herhangi bir rotayı bulmak yerine).