OptimizeToursRequest
aşağıdakiler için kısıtlamalar uygular:
- Kargolar, kargoların nasıl yapıldığını etkiler.
- Araç rotalarının hesaplanma şeklini etkileyen araçlar
- Tüm dünyada bu, hem araçları hem de gönderimleri etkiliyor.
Bu kılavuzda, temel bir kargo kısıtlamasına odaklanılmıştır: zaman aralıkları.
Zaman aralıkları,
belirtmek için OptimizeToursRequest
mesajı (REST, gRPC)
süreye dayalı sınırlamalar belirledi. Bu tür kısıtlamalar, bir gönderimin ne zaman ve nasıl yapılabileceğinin yanı sıra gönderim için araç atamasını da etkiler. Bu kısıtlamalarla birlikte optimize edici,
sevkiyatın zaman kısıtlamalarını en iyi şekilde karşılayabilecek araçlar.
Gönderim kısıtlamaları: zaman aralıkları
Teslim alma veya teslimatın Shipment.VisitRequest
içinde gerçekleşeceği zamanı belirtirsiniz
şu mesajı görebilirsiniz:
- Mesajda
timeWindows
özelliğini kullanın (REST, gRPC) TimeWindow
mesajında başlangıç ve bitiş zamanını belirtin (REST, gRPC) ekleyin.
Zaman aralığı kısıtlamaları içeren örnek istek
Bu örnekte, her biri kendi teslimat aralığına sahip üç farklı gönderim gösterilmektedir. Basitlik açısından bu örnekte yalnızca deliveries
için zaman aralıkları ayarlanmıştır ancak zaman aralıkları teslim alma işlemlerine de uygulanabilir. Birden fazla zaman aralığı belirtilebilir ancak bu örnekte her yayın için yalnızca bir tane VisitRequest
kullanılır.
Zaman aralıkları içeren örnek bir isteği inceleyin
{ "populatePolylines": false, "populateTransitionPolylines": false, "model": { "globalStartTime": "2023-01-13T16:00:00Z", "globalEndTime": "2023-01-14T16:00:00Z", "shipments": [ { "deliveries": [ { "arrivalLocation": { "latitude": 37.789456, "longitude": -122.390192 }, "duration": "250s", "timeWindows": [ { "startTime": "2023-01-13T18:00:00Z", "endTime": "2023-01-13T19:00:00Z" } ] } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 100.0 }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s", "timeWindows": [ { "startTime": "2023-01-13T18:00:00Z", "endTime": "2023-01-13T18:30:00Z" } ] } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 20.0 }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s", "timeWindows": [ { "startTime": "2023-01-13T17:30:00Z", "endTime": "2023-01-13T18:00:00Z" } ] } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 50.0 } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerHour": 40.0, "costPerKilometer": 10.0 } ] } }
Zaman aralığı kısıtlamaları içeren örnek yanıt
Örnek yanıtta aracın başlangıç ve bitiş zamanı 17:35:50 ve
18:17:24. Bu zamanlar, optimize edicinin zamanı en aza indirdiğini gösterir.
istekte belirtilen aracı costPerHour
olarak çalıştırması gerekir.
tüm zaman aralığı kısıtlamalarını karşılamalı. Başlangıç zamanı olarak 17:35:50 kullanılıyor
aracın ziyaret edilen konumda
ziyaretin zaman aralığı başlar. Bu, yanıtta sıfır waitDuration
değeri olarak görünür.
Örnek istek için zaman aralıkları içeren bir yanıtı görme
{ "routes": [ { "vehicleStartTime": "2023-01-13T17:35:50Z", "vehicleEndTime": "2023-01-13T18:17:24Z", "visits": [ { "isPickup": true, "startTime": "2023-01-13T17:35:50Z", "detour": "0s" }, { "shipmentIndex": 1, "isPickup": true, "startTime": "2023-01-13T17:38:20Z", "detour": "150s" }, { "shipmentIndex": 2, "isPickup": true, "startTime": "2023-01-13T17:40:50Z", "detour": "300s" }, { "shipmentIndex": 2, "startTime": "2023-01-13T17:50:09Z", "detour": "0s" }, { "shipmentIndex": 1, "startTime": "2023-01-13T18:00:00Z", "detour": "796s" }, { "startTime": "2023-01-13T18:07:35Z", "detour": "1520s" } ], "transitions": [ { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-13T17:35:50Z" }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-13T17:38:20Z" }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-13T17:40:50Z" }, { "travelDuration": "409s", "travelDistanceMeters": 1371, "waitDuration": "0s", "totalDuration": "409s", "startTime": "2023-01-13T17:43:20Z" }, { "travelDuration": "341s", "travelDistanceMeters": 1312, "waitDuration": "0s", "totalDuration": "341s", "startTime": "2023-01-13T17:54:19Z" }, { "travelDuration": "205s", "travelDistanceMeters": 636, "waitDuration": "0s", "totalDuration": "205s", "startTime": "2023-01-13T18:04:10Z" }, { "travelDuration": "339s", "travelDistanceMeters": 1276, "waitDuration": "0s", "totalDuration": "339s", "startTime": "2023-01-13T18:11:45Z" } ], "metrics": { "performedShipmentCount": 3, "travelDuration": "1294s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2494s", "travelDistanceMeters": 4595 }, "routeCosts": { "model.vehicles.cost_per_hour": 27.711111111111112, "model.vehicles.cost_per_kilometer": 45.95 }, "routeTotalCost": 73.661111111111111 } ], "metrics": { "aggregatedRouteMetrics": { "performedShipmentCount": 3, "travelDuration": "1294s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2494s", "travelDistanceMeters": 4595 }, "usedVehicleCount": 1, "earliestVehicleStartTime": "2023-01-13T17:35:50Z", "latestVehicleEndTime": "2023-01-13T18:17:24Z", "totalCost": 73.661111111111111, "costs": { "model.vehicles.cost_per_hour": 27.711111111111112, "model.vehicles.cost_per_kilometer": 45.95 } } }
Zaman aralıkları, en erken zaman aralığına sahip gönderimlerin önce teslim edilmesi için aracın visits
'ünü sipariş etti.
shipments[2]
, 17:50'de teslim edildishipments[1]
, saat 18:00'de teslim edildishipments[0]
, 18:07'de teslim edildi
Örnek istek sabit zaman aralığı kısıtlamalarını belirtiyor.
tamamlanması gereken teslimatları belirleyebilirsiniz. Bir kargonun
VisitRequests
herhangi bir zaman aralığında uygun değil ya da
daha uygun maliyetliyse optimize edici gönderimi atlar. Gönderimde penaltyCost
varsa optimizatör, yanıt olarak bildirilen maliyetlere metrics
ekler. Aksi takdirde, OptimizeToursResponse
mesajının (REST, gRPC) skippedMandatoryShipmentCount
özelliği artar.
shipment[1]
zaman aralığını birkaç saat kaydırarak zaman aralıklarını değiştirirseniz
18:00'den 21:00'e kadar),
örneklere göz atın.
İzin verilmeyen zaman aralıklarına sahip örnek bir isteği inceleyin memnun etmek
{ "populatePolylines": false, "populateTransitionPolylines": false, "model": { "globalStartTime": "2023-01-13T16:00:00Z", "globalEndTime": "2023-01-14T16:00:00Z", "shipments": [ { "deliveries": [ { "arrivalLocation": { "latitude": 37.789456, "longitude": -122.390192 }, "duration": "250s", "timeWindows": [ { "startTime": "2023-01-13T18:00:00Z", "endTime": "2023-01-13T19:00:00Z" } ] } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 100.0 }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s", "timeWindows": [ { "startTime": "2023-01-13T21:00:00Z", "endTime": "2023-01-13T21:30:00Z" } ] } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 20.0 }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s", "timeWindows": [ { "startTime": "2023-01-13T17:30:00Z", "endTime": "2023-01-13T18:00:00Z" } ] } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 50.0 } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerHour": 40.0, "costPerKilometer": 10.0 } ] } }
İkinci örnek isteğe verilen yanıta bakın: bir gönderinin atlandığı zaman aralıkları
{ "routes": [ { "vehicleStartTime": "2023-01-13T17:37:49Z", "vehicleEndTime": "2023-01-13T18:09:49Z", "visits": [ { "isPickup": true, "startTime": "2023-01-13T17:37:49Z", "detour": "0s" }, { "shipmentIndex": 2, "isPickup": true, "startTime": "2023-01-13T17:40:19Z", "detour": "150s" }, { "shipmentIndex": 2, "startTime": "2023-01-13T17:49:38Z", "detour": "0s" }, { "startTime": "2023-01-13T18:00:00Z", "detour": "946s" } ], "transitions": [ { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-13T17:37:49Z" }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-13T17:40:19Z" }, { "travelDuration": "409s", "travelDistanceMeters": 1371, "waitDuration": "0s", "totalDuration": "409s", "startTime": "2023-01-13T17:42:49Z" }, { "travelDuration": "372s", "travelDistanceMeters": 1348, "waitDuration": "0s", "totalDuration": "372s", "startTime": "2023-01-13T17:53:48Z" }, { "travelDuration": "339s", "travelDistanceMeters": 1276, "waitDuration": "0s", "totalDuration": "339s", "startTime": "2023-01-13T18:04:10Z" } ], "metrics": { "performedShipmentCount": 2, "travelDuration": "1120s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "800s", "totalDuration": "1920s", "travelDistanceMeters": 3995 }, "routeCosts": { "model.vehicles.cost_per_kilometer": 39.95, "model.vehicles.cost_per_hour": 21.333333333333332 }, "routeTotalCost": 61.283333333333331 } ], "skippedShipments": [ { "index": 1 } ], "metrics": { "aggregatedRouteMetrics": { "performedShipmentCount": 2, "travelDuration": "1120s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "800s", "totalDuration": "1920s", "travelDistanceMeters": 3995 }, "usedVehicleCount": 1, "earliestVehicleStartTime": "2023-01-13T17:37:49Z", "latestVehicleEndTime": "2023-01-13T18:09:49Z", "totalCost": 81.283333333333331, "costs": { "model.shipments.penalty_cost": 20, "model.vehicles.cost_per_hour": 21.333333333333332, "model.vehicles.cost_per_kilometer": 39.95 } } }
Bu örnekte, gönderinin belirtilen zaman aralığında teslim edilmesi için gereken ek araç çalışma süresi, gönderinin ceza maliyetini aştığından daha sonraki zaman aralığı shipment[1]
'ün atlanmasına neden olmuştur.
shipment[1]
için ceza maliyeti metrics.costs
'te, dizini ise skippedShipments
'de görünür.
Esnek zaman aralığı kısıtlamaları
Maliyet Modeli Parametreleri bölümünde kısaca belirtildiği gibi, zaman aralıkları yumuşak kısıtlamalar olarak uygulanabilir. Geçici kısıtlamalar, aşağıdaki gibi katı kısıtlamalardan farklıdır:
- Katı kısıtlamalar: İhlal edilemez ve optimizatör, bir gönderimi atlama anlamına gelse bile kısıtlamayı ihlal eden bir çözüm sunmaz.
- Yumuşak kısıtlamalar: İhlal edilebilir. Bu, optimizasyon aracının yumuşak bir kısıtlamayı ihlal eden bir çözüm sunabileceği anlamına gelir. Ancak, optimize edici Ayrıca tüm ihlallere maliyet uygular. Bu maliyeti ek mülk sağlar. Bu, genellikle bir sonraki mağaza için etkinliğin gerçekleştiği zaman aralığından önceki veya sonraki her saat için
Zaman aralıkları, şu yerine softStartTime
veya softEndTime
kullanılarak yumuşatılır:
Sırasıyla startTime
veya endTime
costPerHourBeforeSoftStartTime
veya costPerHourAfterSoftEndTime
.
Belirli bir zaman aralığında teslimat veya teslim alma işlemi yapılması gerekir ancak bu zaman aralığında teslimat veya teslim alma işleminin yapılması kesinlikle zorunlu değildir. Sabit ve geçici zaman aralığı kısıtlamalarını birlikte kullanabilirsiniz. işletme hedeflerini ifade etmek için kullanılan bir araçtır. Örneğin:
- Kısıtlı zaman aralığı: Müşterinin çalışma saatlerini gösterir, örneğin şuradan: 09:00 - 17:00 arası.
- Geçici zaman aralığı: Teslimat veya teslim alma için zaman aralığını belirtir. müşteriye gönderilen bildirimle eşleşir (ör. 09:00-13:00).
Bu örnekte, zamanı geldiğinden dolayı daha önce atlanan kargo çok geç başlayan pencerenin başlangıç zamanı kısıtlaması yumuşatılmıştır. Diğer gönderimlerin zaman aralığının bitiş zamanları da uzatıldı.
Sabit ve esnek zaman aralıkları içeren örnek bir isteğe bakın
{ "populatePolylines": false, "populateTransitionPolylines": false, "model": { "globalStartTime": "2023-01-13T16:00:00Z", "globalEndTime": "2023-01-14T16:00:00Z", "shipments": [ { "deliveries": [ { "arrivalLocation": { "latitude": 37.789456, "longitude": -122.390192 }, "duration": "250s", "timeWindows": [ { "startTime": "2023-01-13T18:00:00Z", "softEndTime": "2023-01-13T19:00:00Z", "costPerHourAfterSoftEndTime": 2.0 } ] } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 100.0 }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s", "timeWindows": [ { "softStartTime": "2023-01-13T21:00:00Z", "endTime": "2023-01-13T21:30:00Z", "costPerHourBeforeSoftStartTime": 2.0 } ] } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 20.0 }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s", "timeWindows": [ { "startTime": "2023-01-13T17:30:00Z", "softEndTime": "2023-01-13T18:00:00Z", "costPerHourAfterSoftEndTime": 2.0 } ] } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 50.0 } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerHour": 40.0, "costPerKilometer": 10.0 } ] } }
Örnek istek için katı ve esnek zaman aralıkları içeren bir yanıt
{ "routes": [ { "vehicleStartTime": "2023-01-13T17:48:35Z", "vehicleEndTime": "2023-01-13T18:24:28Z", "visits": [ { "isPickup": true, "startTime": "2023-01-13T17:48:35Z", "detour": "0s" }, { "shipmentIndex": 1, "isPickup": true, "startTime": "2023-01-13T17:51:05Z", "detour": "150s" }, { "shipmentIndex": 2, "isPickup": true, "startTime": "2023-01-13T17:53:35Z", "detour": "300s" }, { "startTime": "2023-01-13T18:00:00Z", "detour": "300s" }, { "shipmentIndex": 1, "startTime": "2023-01-13T18:07:42Z", "detour": "493s" }, { "shipmentIndex": 2, "startTime": "2023-01-13T18:17:27Z", "detour": "873s" } ], "transitions": [ { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-13T17:48:35Z" }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-13T17:51:05Z" }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-13T17:53:35Z" }, { "travelDuration": "235s", "travelDistanceMeters": 795, "waitDuration": "0s", "totalDuration": "235s", "startTime": "2023-01-13T17:56:05Z" }, { "travelDuration": "212s", "travelDistanceMeters": 791, "waitDuration": "0s", "totalDuration": "212s", "startTime": "2023-01-13T18:04:10Z" }, { "travelDuration": "335s", "travelDistanceMeters": 1204, "waitDuration": "0s", "totalDuration": "335s", "startTime": "2023-01-13T18:11:52Z" }, { "travelDuration": "171s", "travelDistanceMeters": 665, "waitDuration": "0s", "totalDuration": "171s", "startTime": "2023-01-13T18:21:37Z" } ], "metrics": { "performedShipmentCount": 3, "travelDuration": "953s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2153s", "travelDistanceMeters": 3455 }, "routeCosts": { "model.shipments.deliveries.time_windows.cost_per_hour_after_soft_end_time": 0.58166666666666667, "model.shipments.deliveries.time_windows.cost_per_hour_before_soft_start_time": 5.7433333333333332, "model.vehicles.cost_per_hour": 23.922222222222221, "model.vehicles.cost_per_kilometer": 34.55 }, "routeTotalCost": 64.797222222222217 } ], "metrics": { "aggregatedRouteMetrics": { "performedShipmentCount": 3, "travelDuration": "953s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2153s", "travelDistanceMeters": 3455 }, "usedVehicleCount": 1, "earliestVehicleStartTime": "2023-01-13T17:48:35Z", "latestVehicleEndTime": "2023-01-13T18:24:28Z", "totalCost": 64.797222222222217, "costs": { "model.vehicles.cost_per_kilometer": 34.55, "model.shipments.deliveries.time_windows.cost_per_hour_before_soft_start_time": 5.7433333333333332, "model.shipments.deliveries.time_windows.cost_per_hour_after_soft_end_time": 0.58166666666666667, "model.vehicles.cost_per_hour": 23.922222222222221 } } }
Yalnızca katı zaman aralığı kısıtlamaları olan örnekte shipment[1]
tamamen atlanmışken, teslimat zaman aralığının yumuşatılması, zaman aralığı başlangıç zamanından önce teslim edilmesine neden olur. Benzer şekilde, satır içi metinlerin bitiş zamanlarını
shipment[2]
diğer gönderimlerin kendi zaman aralığından sonra teslim edilmesine izin verildi
sona eriyor.
Aynı zamanda hem maliyetler hem de toplam sevkiyatlar değişti:
totalCost
: 81,283'ten 64,797'ye düşerek- toplam tamamlanan gönderim sayısı: 2'den 3'e yükseldi
Zaman aralığı kısıtlamaları önceki örneğe kıyasla daha az olduğu için optimizatör daha ucuz bir çözüm buldu.
Son olarak metrics.costs
mülkü, kısıtlamanın çarpımına ve teslimat aralığının kaçırılmasının süresine göre oluşan gerçek maliyeti belirtmek için yeni bir anahtar da içerir. Yani:
costPerHourBeforeSoftStartTime
/ 2.0 ve- gerçek teslimat ile zaman aralığının başlangıcı arasındaki süre: 2,83583 saat
Sonuç:
model.shipments.deliveries.time_windows.cost_per_hour_before_soft_start_time
:
5,6716666666666669.
Bu metrikler, katı kısıtlamalar ile yumuşak kısıtlamalar arasındaki dengeyi görmek için maliyet analizi yapmanıza olanak tanır. Bu analizleri, kısıtlamalarınızı belirli işletme kurallarınıza daha uygun olacak şekilde ayarlamak için kullanabilirsiniz. Bu durumda toplam maliyet
20,0 sürümünün shipment[1].penalty_cost
değerinden daha az. Optimize Edici, Search Ads 360'ta
teslimatın beklenenden erken yapılmasının daha uygun maliyetli olduğunu
kargoyu atlamaktır.