Bu kılavuzda loadDemands
ve loadLimits
ile bunların birbiriyle ilişkisi açıklanmaktadır.
Teslim Alma ve Teslimat Zaman Aralığı Kısıtlamaları bölümünde belirtildiği gibi, OptimizeToursRequest
mesajı (REST, gRPC), optimize edilen sorunla ilgili kısıtlamaları belirten bir dizi özellik içerir. Çeşitli OptimizeToursRequest
özellikleri yük kısıtlamalarını temsil eder.
Araçların ve gönderilerin, rota planlanırken dikkate alınması gereken fiziksel özellikleri vardır.
- Araçlar:
loadLimits
mülk özelliği, aracın taşıyabileceği maksimum yükü belirtir.Vehicle
Mesajın (REST, gRPC) dokümanlarına bakın. - Gönderimler:
loadDemands
özelliği, belirli bir gönderimin ne kadar yük tükettiğini belirtir.Shipment
Mesajın (REST, gRPC) dokümanlarına bakın.
Bu iki kısıtlama, optimizasyon aracının gönderileri filonuzun kapasitesine ve gönderi taleplerinize en uygun şekilde araçlara atamasını sağlar.
Bu belgenin geri kalanında loadLimits
ve loadDemands
ayrıntılı olarak ele alınmaktadır.
Yük talepleri ve sınırları: türler
Her yük talebini ve sınır kısıtlamasını bir tür olarak ifade edersiniz.
Aşağıdaki örneklerde olduğu gibi kendi yük türlerinizi belirtebilirsiniz:
- 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ılmaktadır.
Hem Shipment.loadDemands
hem de Vehicle.loadLimits
, yük türlerini temsil eden string
anahtarlarıyla birlikte Protocol Buffers
map
türünü kullanır.
Shipment.loadDemands
değerleri, Load
mesajını (REST, gRPC) kullanır.
Load
mesajında, belirtilen türde gönderimin tamamlanması için ne kadar kapasite gerektiğini gösteren tek bir amount
özelliği bulunur.
Vehicle.loadLimits
değerleri, LoadLimit
mesajını (REST,
gRPC) kullanır. LoadLimit
mesajı çeşitli özelliklere sahiptir. maxLoad
, belirtilen türdeki aracın maksimum yük kapasitesini gösterir.
Bir gönderimin loadDemands
, yalnızca ikisinin yük türü anahtarları eşleşiyorsa kendisine atanan aracın loadLimits
tüketir. Örneğin, aşağıdakileri içeren bir gönderim:loadDemands
"loadDemands": {
"weightKg": {
"amount": 50
}
}
gönderimin tamamlanması için weightKg
türünde 50 yük birimi gerektirir. Aşağıdakilerden loadLimits
'e sahip bir araç:
"loadLimits": {
"weightKg": {
"maxLoad": 100
}
}
weightKg
türündeki aracın maxLoad
değeri, weightKg
türündeki kargonun loadDemands
değerine eşit veya daha yüksek olduğundan kargo tamamlanabilir. Ancak aşağıdaki özelliklere sahip araçlar:loadLimits
"loadLimits": {
"equipmentRackStorage": {
"maxLoad": 10
}
}
weightKg
yük sınırı olmadığı için sınırsız weightKg
kapasiteye sahiptir. Bu nedenle, araç gönderinin ağırlık talebiyle sınırlanmaz.
Gönderiler ve araçlar arasında yük aktarımı
Gönderiler araçlarla teslim alındığı ve teslim edildiği için gönderinin loadDemand
, gönderi ile araç arasında aktarılır. Belirli bir araç için OptimizeToursResponse
mesajının (REST, gRPC) routes.transitions
girişinde aracın yüklerini görebilirsiniz. Sıra aşağıdaki gibidir:
- Gerekli yük kapasitesi, gönderi için
loadDemand
olarak tanımlanır. - Gönderi, kendisine atanan araç tarafından alınır ve aracın
vehicleLoads
, gönderininloadDemand
miktarı kadar artar. Bu aktarım, yanıt mesajında pozitifvisits.loadDemands
ile gösterilir. - Araç, gönderiyi teslim eder ve aracın
vehicleLoads
, teslim edilen gönderininloadDemand
miktarı kadar azalır. Bu aktarım, yanıt mesajında negatifvisits.loadDemands
ile gösterilir.
Bir aracın vehicleLoads
değeri, rotası üzerindeki hiçbir noktada belirtilen loadLimits
değerini aşamaz.
Yükleme talepleri ve sınırları içeren eksiksiz bir örnek
Yük talepleri ve sınırları içeren örnek bir istek
{ "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üklemeyle ilgili çeşitli parametreler içerir:
shipments[0]
, 50weightKg
yük talebine sahip.shipments[1]
, 10weightKg
yük talebine sahip.shipments[2]
, 80weightKg
yük talebine sahip.vehicles[0]
için 100weightKg
yükleme sınırı vardır.
Yük talepleri ve sınırlarla ilgili isteğe verilen yanıtı görme
{ "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
sırasını etkiler:
shipment[0]
teslim alındıshipment[1]
teslim alındıshipment[0]
teslim edildishipment[1]
teslim edildishipment[2]
teslim alındıshipment[2]
teslim edildi
Bu sipariş, toplam loadDemands
değeri aracın loadLimits
değerini aştığı için üç gönderimin aynı anda araçla tamamlanamayacağını gösteriyor.
Her visits
girişi, Visit
tamamlanmasından kaynaklanan araç yükündeki değişikliği içerir. Pozitif yük değerleri sevkiyat yüklemesini, negatif değerler ise sevkiyat boşaltmasını temsil eder.
Her transitions
girişi, Transition
sırasındaki toplam araç yükünü içerir. Örneğin, transitions[2]
için shipment[0]
ve shipment[1]
yüklerinin birleşimi olan 60 weightKg
yükü vardır.
Metrik nesneleri routes[0].metrics
ve metrics.aggregatedRouteMetrics
, maxLoads
özelliğini içerir. weightKg
türünün değeri 80'dir. Bu değer, aracın shipments[2]
öğesini teslimat konumuna taşıdığı rotanın bölümünü gösterir.
Yükleme sınırı kısıtlamaları
Teslim Alma ve Teslimat Zaman Aralığı Kısıtlamaları'nda açıklanan zaman aralıklarında olduğu gibi, yük sınırı kısıtlamalarının da kesin ve esnek varyantları vardır. LoadLimit
mesajının maxLoad
özelliği, kesin bir kısıtlamayı ifade eder: Araç, belirtilen türde hiçbir zaman maxLoad
değerini aşan bir yük taşımamalıdır. softMaxLoad
ve costPerUnitAboveSoftMax
özellikleri, her birimin softMaxLoad
'yı aşması durumunda costPerUnitAboveSoftMax
maliyetine neden olan yumuşak bir kısıtlamayı ifade eder.
Yumuşak yükleme sınırı kısıtlamalarının çeşitli kullanım alanları vardır. Örneğin:
- Maliyet açısından avantajlı olduğunda, gönderileri gerekli minimum araç sayısından daha fazla araca dağıtmak
- sürücünün, belirli bir rotada rahatça alıp teslim edebileceği öğe sayısı tercihini ifade etme
- Aşınmayı sınırlamak ve bakım maliyetlerini azaltmak için araçları maksimum fiziksel kapasitelerinin altında yükleme
Kesin ve esnek yükleme sınırı kısıtlamaları birlikte kullanılabilir. Örneğin, katı bir yük sınırı, bir aracın güvenli bir şekilde taşıyabileceği maksimum kargo ağırlığını veya araca aynı anda sığabilecek maksimum öğe sayısını ifade edebilir. Esnek bir yük sınırı ise sürücünün her şeyi araca sığdırma becerisini zorlayacak maksimum ağırlık veya öğe sayısı olabilir.