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ılmıştı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ının çeşitli özellikleri vardır. 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 gönderimi tamamlayabilir. Ancak loadLimits
değeri aşağıdaki durumlarda:
"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ığı ve alındığı için 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. - Kargo, atanan aracı tarafından alınır ve aracın
vehicleLoads
değeri, kargoloadDemand
değerine göre 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 sahiptir.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]
teslim edildishipment[1]
yayınlandıshipment[2]
teslim alındıshipment[2]
teslim edildi
Bu sipariş, toplam loadDemands
'leri aracın loadLimits
'unu aştığı için üç gönderimin araç tarafından aynı anda 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, gönderimin yüklenmesini, negatif yükleme değerleri ise gönderimin boşaltılmasını 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çerir. 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 esnek 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ın aşınmasını 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.