Bu kılavuzda loadDemands
, loadLimits
ve bunların birbirleriyle ilişkisi açıklanmaktadır.
Teslim Alma ve Teslimat Süresi Aralığı Kısıtlamaları bölümünde belirtildiği gibi, OptimizeToursRequest
mesajı (REST, gRPC), optimize edilmekte olan sorunla ilgili kısıtlamaları belirten çeşitli özellikler içerir. Bazı OptimizeToursRequest
özelliği yük kısıtlamalarını temsil eder.
Araçlar ve sevkıyatlar, rota planlanırken dikkate alınması gereken fiziksel özelliklere sahiptir.
- Taşıtlar:
loadLimits
özelliği, aracın kaldırabileceği maksimum yükü belirtir.Vehicle
iletisinin (REST, gRPC) belgelerine bakın. - Sevkiyatlar:
loadDemands
özelliği, belirli bir gönderinin ne kadar yük tükettiğini belirtir.Shipment
iletisinin (REST, gRPC) belgelerine bakın.
Bu iki kısıtlama birlikte, optimize edicinin araçları filo kapasitenize ve sevkiyat taleplerine en uygun şekilde uygun şekilde araçlarına atamasını mümkün kılar.
Bu dokümanın geri kalanında loadLimits
ve loadDemands
ayrıntılı olarak açıklanmaktadır.
Yükleme talepleri ve sınırları: türler
Her bir yük talebini ve sınır kısıtlamasını bir tür bazında ifade edersiniz.
Aşağıdaki örnekler gibi kendi yükleme türlerinizi sağlayabilirsiniz:
- ağırlık
- ses düzeyi
- doğrusal ölçümler
- taşınan öğelerin veya ekipmanların adları
Bu kılavuzda örnek tür olarak weightKg
kullanılmıştır.
Hem Shipment.loadDemands
hem de Vehicle.loadLimits
, yük türlerini temsil eden string
anahtarlarıyla Protokol Arabelleklerimap
türünü kullanır.
Shipment.loadDemands
değerleri Load
mesajını (REST, gRPC) kullanır.
Load
mesajında, belirtilen türde gönderimi tamamlamak için ne kadar kapasitenin gerekli olduğunu gösteren tek bir amount
özelliği bulunur.
Vehicle.loadLimits
değerleri LoadLimit
mesajını (REST, gRPC) kullanır. LoadLimit
mesajında birkaç özellik vardır. maxLoad
, aracın belirtilen türdeki maksimum yük kapasitesini gösterir.
Bir gönderimin loadDemands
özelliği, kendisine atanan aracın loadLimits
değerlerini yalnızca eşleşen yük türü anahtarları varsa tüketir. Örneğin, loadDemands
değeri olan bir gönderim:
"loadDemands": {
"weightKg": {
"amount": 50
}
}
gönderinin tamamlanması için weightKg
türünde 50 yükleme birimi gerektirir. loadLimits
metriğine sahip araç:
"loadLimits": {
"weightKg": {
"maxLoad": 100
}
}
Aracın weightKg
türündeki maxLoad
değeri, weightKg
türündeki gönderinin loadDemands
değerine eşit veya bu değerden büyük olduğu için gönderimi tamamlayabilir. Ancak loadLimits
sahip bir araç:
"loadLimits": {
"equipmentRackStorage": {
"maxLoad": 10
}
}
weightKg
yük sınırı olmadığı için dolaylı olarak sınırsız weightKg
kapasiteye sahiptir. Bu sayede araç, kargonun ağırlığı talebiyle kısıtlanmaz.
Sevkiyatlar ve araçlar arasında yük aktarımı
Sevkiyatlar araç tarafından alınıp teslim edilirken, gönderinin loadDemand
değeri gönderim ile araç arasında aktarılır. Araç yüklerini belirli bir araç için OptimizeToursResponse
mesajının (REST, gRPC)routes.transitions
girişinde görebilirsiniz. Sıralama şu şekildedir:
- Gönderim için gerekli yük kapasitesi
loadDemand
olarak tanımlanmış. - Gönderi, atandığı araç tarafından teslim alınır ve aracın
vehicleLoads
değeri, gönderimloadDemand
tutarında artar. Bu aktarım, yanıt mesajında pozitifvisits.loadDemands
ile temsil edilir. - Araç, gönderimi teslim eder ve aracın
vehicleLoads
değeri, teslim edilen gönderiminloadDemand
miktarı kadar azalır. Bu aktarım, yanıt mesajında negatifvisits.loadDemands
ile temsil edilir.
Bir aracın vehicleLoads
değeri, rota üzerindeki hiçbir noktada belirtilen loadLimits
değerini aşamaz.
Yük talepleri ve sınırları hakkında eksiksiz bir örnek
Yük taleplerini ve sınırlarını 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" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 100.0, "loadDemands": { "weightKg": { "amount": 50 } } }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 15.0, "loadDemands": { "weightKg": { "amount": 10 } } }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 50.0, "loadDemands": { "weightKg": { "amount": 80 } } } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerHour": 40.0, "costPerKilometer": 10.0, "loadLimits": { "weightKg": { "maxLoad": 100 } } } ] } }
Örnek istek, yükle ilgili çeşitli parametreler içerir:
shipments[0]
için 50weightKg
yük talebi var.shipments[1]
için 10weightKg
yük talebi var.shipments[2]
için 80weightKg
yük talebi var.vehicles[0]
için yük sınırı 100weightKg
.
Yük talepleri ve sınırları içeren isteğe verilen yanıtı görün
{ "routes": [ { "vehicleStartTime": "2023-01-13T16:00:00Z", "vehicleEndTime": "2023-01-13T16:43:27Z", "visits": [ { "isPickup": true, "startTime": "2023-01-13T16:00:00Z", "detour": "0s", "loadDemands": { "weightKg": { "amount": "50" } } }, { "shipmentIndex": 1, "isPickup": true, "startTime": "2023-01-13T16:02:30Z", "detour": "150s", "loadDemands": { "weightKg": { "amount": "10" } } }, { "startTime": "2023-01-13T16:08:55Z", "detour": "150s", "loadDemands": { "weightKg": { "amount": "-50" } } }, { "shipmentIndex": 1, "startTime": "2023-01-13T16:16:37Z", "detour": "343s", "loadDemands": { "weightKg": { "amount": "-10" } } }, { "shipmentIndex": 2, "isPickup": true, "startTime": "2023-01-13T16:27:07Z", "detour": "1627s", "loadDemands": { "weightKg": { "amount": "80" } } }, { "shipmentIndex": 2, "startTime": "2023-01-13T16:36:26Z", "detour": "0s", "loadDemands": { "weightKg": { "amount": "-80" } } } ], "transitions": [ { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-13T16:00:00Z", "vehicleLoads": { "weightKg": {} } }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-13T16:02:30Z", "vehicleLoads": { "weightKg": { "amount": "50" } } }, { "travelDuration": "235s", "travelDistanceMeters": 795, "waitDuration": "0s", "totalDuration": "235s", "startTime": "2023-01-13T16:05:00Z", "vehicleLoads": { "weightKg": { "amount": "60" } } }, { "travelDuration": "212s", "travelDistanceMeters": 791, "waitDuration": "0s", "totalDuration": "212s", "startTime": "2023-01-13T16:13:05Z", "vehicleLoads": { "weightKg": { "amount": "10" } } }, { "travelDuration": "380s", "travelDistanceMeters": 1190, "waitDuration": "0s", "totalDuration": "380s", "startTime": "2023-01-13T16:20:47Z", "vehicleLoads": { "weightKg": {} } }, { "travelDuration": "409s", "travelDistanceMeters": 1371, "waitDuration": "0s", "totalDuration": "409s", "startTime": "2023-01-13T16:29:37Z", "vehicleLoads": { "weightKg": { "amount": "80" } } }, { "travelDuration": "171s", "travelDistanceMeters": 665, "waitDuration": "0s", "totalDuration": "171s", "startTime": "2023-01-13T16:40:36Z", "vehicleLoads": { "weightKg": {} } } ], "metrics": { "performedShipmentCount": 3, "travelDuration": "1407s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2607s", "travelDistanceMeters": 4812, "maxLoads": { "weightKg": { "amount": "80" } } }, "routeCosts": { "model.vehicles.cost_per_kilometer": 48.12, "model.vehicles.cost_per_hour": 28.966666666666665 }, "routeTotalCost": 77.086666666666659 } ], "metrics": { "aggregatedRouteMetrics": { "performedShipmentCount": 3, "travelDuration": "1407s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2607s", "travelDistanceMeters": 4812, "maxLoads": { "weightKg": { "amount": "80" } } }, "usedVehicleCount": 1, "earliestVehicleStartTime": "2023-01-13T16:00:00Z", "latestVehicleEndTime": "2023-01-13T16:43:27Z", "totalCost": 77.086666666666659, "costs": { "model.vehicles.cost_per_hour": 28.966666666666665, "model.vehicles.cost_per_kilometer": 48.12 } } }
Eklenen yük kısıtlamaları visits
öğesinin sırasını etkiler:
shipment[0]
alındıshipment[1]
alındıshipment[0]
teslim edildishipment[1]
teslim edildishipment[2]
alındıshipment[2]
teslim edildi
Bu sipariş, toplam loadDemands
aracın loadLimits
tutarını aştığından araç tarafından aynı anda üç gönderimin tamamlanamadığını belirtmektedir.
Her visits
girişi, Visit
işleminin tamamlanmasından kaynaklanan araç yükündeki değişikliği içerir. Pozitif yük değerleri gönderim yüklemeyi, negatif değerler ise gönderi boşaltmayı temsil eder.
Her transitions
girişi, Transition
sırasındaki toplam araç yükünü içerir. Örneğin transitions[2]
, shipment[0]
ve shipment[1]
değerlerinin birleşik yükünü temsil eden 60 weightKg
yüküne sahiptir.
routes[0].metrics
ve metrics.aggregatedRouteMetrics
metrik nesneleri maxLoads
özelliği içerir. weightKg
türü değeri 80'dir. Bu değer, araç rotasının shipments[2]
öğesini teslim konumuna taşıyan kısmını temsil eder.
Esnek yük sınırı kısıtlamaları
Teslim Alma ve Teslimat Süresi Aralığı Kısıtlamaları bölümünde açıklanan zaman aralıklarında olduğu gibi, yük sınırı kısıtlamalarının sabit ve hafif varyantları vardır. LoadLimit
mesajının maxLoad
özelliği sabit bir kısıtlama ifade eder: Araç, belirtilen türde hiçbir zaman maxLoad
değerini aşan bir yük taşımamalıdır. softMaxLoad
ve costPerUnitAboveSoftMax
mülkleri bir hafif kısıtlama ifade eder. softMaxLoad
değerini aşan her birim, costPerUnitAboveSoftMax
maliyetine neden olur.
Esnek yük sınırı kısıtlamalarının çeşitli kullanım alanları vardır. Örneğin:
- daha fazla araç arasında sevkiyat dengesi sağlamak
- Sürücünün belirli bir rotadan rahatça alıp teslim edebileceği öğe sayısına dair tercihini belirtmesi
- aşınmayı sınırlandırmak ve bakım maliyetlerini azaltmak için araçları maksimum fiziksel kapasitelerinin altında yükleme
Sabit ve yumuşak yük sınır kısıtlamaları birlikte kullanılabilir. Örneğin, katı yük sınırı, bir aracın güvenli bir şekilde taşıyabileceği kargonun maksimum ağırlığını veya bir araca aynı anda sığabilecek maksimum öğe sayısını belirtirken hafif yük sınırı, sürücünün araçtaki her şeyi sığdırma yeteneğini vergilendirecek maksimum ağırlık ya da öğe sayısı olabilir.