OptimizeToursRequest
aşağıdakiler için kısıtlamalar uygular:
- Gönderimlerin nasıl yapıldığını etkileyen gönderimler
- 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 bir kısıtlama,
sevkiyatın ne zaman ve nasıl gerçekleştirilebileceğinin yanı sıra
teslim edilir. 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
Buradaki örnekte her biri ayrı bir gönderime sahip üç farklı gönderim gösterilmektedir
teslimat aralığı. Kolaylık sağlaması açısından bu örnekte zaman aralıkları deliveries
üzerinde ayarlanmaktadır.
Ancak zaman aralıkları teslim almalara da uygulanabilir. Birden fazla zaman aralığı
belirtilmelidir, ancak bu örnekte yayın başına yalnızca bir tanesi (VisitRequest
) kullanılmaktadı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 değer, yanıtta sıfır olarak görünür waitDuration
değerler.
Örnek isteğe ilişkin yanıtı zaman aralıkları
{ "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ında aracın visits
numarası sıralanmıştır, böylece
en erken teslim edilen zaman aralıkları
belirlenir.
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
, optimize edici bunu yanıt olarak raporlanan maliyetlere ekler.
metrics
. Aksi halde, skippedMandatoryShipmentCount
OptimizeToursResponse
mesajı (REST, gRPC) 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, daha sonraki bir zaman aralığı shipment[1]
değerinin atlanmasına neden olmuştur.
Çünkü sevkiyatın tamamlanması için gereken ekstra çalışma süresi
belirtilen süre içinde teslimat, gönderimin ceza maliyetini aştı.
shipment[1]
için ceza maliyeti metrics.costs
dilinde ve dizininde görünüyor
skippedShipments
konumunda görünüyor.
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 gösterilebilir. Geçici kısıtlamalar, aşağıdaki gibi katı kısıtlamalardan farklıdır:
- Katı kısıtlamalar: İhlal edilemez ve optimize edici bir bir adımı atlamak anlamına gelirse bile, kısıtlamayı ihlal eden bir gönderim.
- Esnek kısıtlamalar: İhlal edilebilir. Bu durum, optimize edicinin yumuşak kısıtlamayı ihlal eden bir çözüm sunmaktır. 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
.
Teslim almaların veya teslimatların gerçekleşmesi gerektiğinde yumuşak zaman aralığı kısıtlamalarından yararlanın Ancak bu süre içinde teslim alma veya teslimat şarttır. 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 belirli bir zaman dilimi içinde zaman da yumuşatılmıştır.
Zor ve sakin zamanları içeren örnek bir isteğe bakın pencereler
{ "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 isteğe verilen yanıtı sabit ve geçici zaman aralıkları
{ "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 zor zaman aralığı kısıtlamaları içeren örneğin tamamen atlandığı
shipment[1]
, teslim zaman aralığının yumuşatılması teslimin teslim edilmesine neden olur
başlangıç zamanından önce. Benzer şekilde, satır içi metinlerin bitiş zamanlarını
shipment[2]
ürününün, belirtilen 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
Optimize edici, zaman aralığı nedeniyle daha az pahalı bir çözüm buldu. kısıtları önceki örneğe göre gevşetilmiştir.
Son olarak, metrics.costs
özelliği
kısıtın çarpımı ve uzunluğuna bağlı olarak oluşan gerçek maliyet
teslim edilen zaman aralığı kaçırılmış olabilir. 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, en yüksek yatırım maliyetiyle farklı kanallar arasındaki dengeyi görmek için
kısıtlarınızı ayarlamak için kullanabileceğiniz, esnek kısıtları
daha iyi anlamanızı sağlayabilir. 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.