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 planlarken dikkate alınması gereken fiziksel özellikleri vardır.
- Araçlar:
loadLimitsmülk özelliği, aracın taşıyabileceği maksimum yükü belirtir.VehicleMesajı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.ShipmentMesajı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ılmıştı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 gerekir. 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 loadLimits değerlerine sahip araçlar:
"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 transferi
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
loadDemandolarak tanımlanır. - Gönderi, kendisine atanan araç tarafından alınır ve aracın
vehicleLoads, gönderininloadDemandmiktarı kadar artar. Bu aktarım, yanıt mesajında pozitifvisits.loadDemandsile gösterilir. - Araç, gönderiyi teslim eder ve aracın
vehicleLoads, teslim edilen gönderininloadDemandmiktarı kadar azalır. Bu aktarım, yanıt mesajında negatifvisits.loadDemandsile 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], 50weightKgyük talebine sahip.shipments[1], 10weightKgyük talebine sahip.shipments[2], 80weightKgyük talebine sahiptir.vehicles[0]için 100weightKgyü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ında toplam araç yükünü içerir. Örneğin, transitions[2] weightKg yükü 60'tır. Bu değer, shipment[0] ve shipment[1] yüklerinin birleşimidir.
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ığı Sınırlamaları'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 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 uygun 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ı tercihi
- 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.