Bu kılavuzda loadDemands
ve loadLimits
ile bunların birbirleriyle olan ilişkisi açıklanmaktadır.
Arama 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. Birkaç OptimizeToursRequest
mülkü yükleme kısıtlamalarını temsil eder.
Araçlar ve kargoların, rota planlanırken dikkate alınması gereken fiziksel özellikleri vardır.
- Araçlar:
loadLimits
mülkü, aracın taşıyabileceği maksimum yükü belirtir.Vehicle
mesajının (REST, gRPC) belgelerine bakın. - Gönderimler:
loadDemands
mülkü, belirli bir gönderimin ne kadar yük tükettiğini belirtir.Shipment
mesajının (REST, gRPC) belgelerine bakın.
Bu iki kısıtlama birlikte, optimizasyon aracının kargoları filo kapasitenize ve kargo taleplerinize en uygun şekilde araçlara uygun şekilde 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ırlama kısıtlamasını bir tür olarak 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ılmaktadır.
Hem Shipment.loadDemands
hem de Vehicle.loadLimits
, yük türlerini temsil eden string
anahtarlarıyla Protokol Tamponlarımap
türünü kullanır.
Shipment.loadDemands
değerleri Load
mesajını kullanır (REST, gRPC).
Load
mesajında, belirtilen türde gönderimi tamamlamak için ne kadar kapasite gerektiğini temsil eden tek bir amount
özelliği bulunur.
Vehicle.loadLimits
değerleri, LoadLimit
mesajını (REST,gRPC) kullanır. LoadLimit
mesajında çeşitli özellikler bulunur. maxLoad
, aracın belirtilen türdeki maksimum yük kapasitesini temsil eder.
Bir gönderinin loadDemands
, yalnızca ikisinin eşleşen yükleme türü anahtarlarına sahip olması durumunda atanmış aracının loadLimits
'unu tüketir. Örneğin, loadDemands
içeren bir gönderim:
"loadDemands": {
"weightKg": {
"amount": 50
}
}
gönderimin tamamlanması için weightKg
türündeki 50 yük birimi gerekir. Aşağıdakilerden loadLimits
'ü içeren bir araç:
"loadLimits": {
"weightKg": {
"maxLoad": 100
}
}
Araç, weightKg
türündeki maxLoad
değerine sahip olduğu için gönderim, weightKg
türündeki loadDemands
değerine sahip olduğu için tamamlanabilir. Ancak aşağıdakilerden loadLimits
olan bir araç:
"loadLimits": {
"equipmentRackStorage": {
"maxLoad": 10
}
}
weightKg
yük sınırı olmadığı için weightKg
kapasitesi sınırsız olduğundan araç, gönderinin ağırlık talebiyle sınırlı değildir.
Gönderiler ve araçlar arasında yük aktarımı
Gönderiler araçlar tarafından teslim alındığında, gönderinin loadDemand
gönderi ile araç arasında aktarılır. Aracın yüklerini, belirli bir araç için OptimizeToursResponse
mesajının (REST, gRPC)routes.transitions
girişinde görebilirsiniz. Sıralama aşağıdaki gibidir:
- Gönderim için gerekli yük kapasitesi
loadDemand
olarak tanımlanır. - Gönderi, atanan aracı tarafından alınır ve aracın
vehicleLoads
değeri, gönderininloadDemand
değeri kadar artar. Bu aktarım, yanıt mesajında pozitifvisits.loadDemands
ile gösterilir. - Araç, gönderimi teslim eder ve aracın
vehicleLoads
değeri, teslim edilen gönderiminloadDemand
değeri kadar azalır. Bu aktarım, yanıt mesajında negatifvisits.loadDemands
ile gösterilir.
Bir aracın vehicleLoads
değeri, rota üzerindeki hiçbir noktada belirtilen loadLimits
değerini aşamaz.
Yükleme talepleri ve sınırlarını içeren tam bir örnek
Yük talepleri ve sınırlar 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" } ], "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 birkaç parametre içerir:
shipments[0]
, 50weightKg
yük talebine sahiptir.shipments[1]
, 10weightKg
yük talebine sahip.shipments[2]
'in yük talebi 80weightKg
.vehicles[0]
için yükleme sınırı 100weightKg
'tür.
Yük talepleri ve sınırlarını içeren istek yanıtını 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
'ün sırasını etkiler:
shipment[0]
teslim alındıshipment[1]
teslim alındıshipment[0]
yayınlandıshipment[1]
yayınlandıshipment[2]
teslim alındıshipment[2]
yayınlandı
Bu sipariş, toplam loadDemands
'leri aracın loadLimits
'unu aştığı için üç gönderimin aynı anda araç tarafından tamamlanamadığını gösterir.
Her visits
girişi, Visit
'un tamamlanmasından kaynaklanan araç yükünde meydana gelen değişikliği içerir. Pozitif yükleme değerleri, kargo yüklemeyi, negatif yükleme değerleri ise kargo boşaltmayı temsil eder.
Her transitions
girişi, Transition
sırasındaki toplam araç yükünü içerir. Örneğin, transitions[2]
'ün weightKg
yükü 60'tır. Bu değer, shipment[0]
ve shipment[1]
'in birleşik yüklerini temsil eder.
routes[0].metrics
ve metrics.aggregatedRouteMetrics
metrik nesneleri bir maxLoads
özelliği içeriyor. weightKg
türü için değer 80'dir ve aracın rotasının shipments[2]
'yi teslimat konumuna taşıyan kısmını temsil eder.
Sanal yükleme sınırı kısıtlamaları
Araç Alma ve Teslimat Zaman Aralığı Kısıtlamaları bölümünde açıklanan zaman aralıkları gibi, yükleme sınırı kısıtlamalarının da katı ve yumuşak varyantları vardır. LoadLimit
mesajının maxLoad
mülkü katı bir kısıtlamayı ifade eder: Araç hiçbir zaman belirtilen türdeki maxLoad
değerini aşan yük taşımamalıdır. softMaxLoad
ve costPerUnitAboveSoftMax
özellikleri, softMaxLoad
'ü aşan her bir birimin costPerUnitAboveSoftMax
maliyeti olmasını sağlayan yumuşak bir kısıtlama ifade eder.
Yumuşak yükleme sınırı kısıtlamalarının çeşitli kullanım alanları vardır. Örneğin:
- Maliyet etkin olduğunda gönderimleri gerekli minimum sayıdan daha fazla araç arasında dengeleme
- Sürücünün, belirli bir rotada rahatça alıp teslim edebileceği öğe sayısıyla ilgili tercihini belirtmesi
- Araçları, aşınmayı sınırlamak ve bakım maliyetlerini azaltmak için maksimum fiziksel kapasitelerinin altında yükleme
Sert ve yumuşak yükleme sınırı kısıtlamaları birlikte kullanılabilir. Örneğin, katı yükleme sınırı, bir aracın güvenli bir şekilde taşıyabileceği maksimum kargo ağırlığını veya bir araca tek seferde sığabilecek maksimum öğe sayısını ifade edebilir. Öte yandan, yumuşak yükleme sınırı, sürücünün her şeyi araca sığdırma kapasitesini zorlayan maksimum ağırlık veya öğe sayısı olabilir.