Hướng dẫn này mô tả về loadDemands
và loadLimits
, cũng như mối liên hệ giữa các thành phần này
khác.
Như đã đề cập trong Giới hạn về khoảng thời gian nhận hàng và giao hàng,
Thông báo OptimizeToursRequest
(REST, gRPC) chứa một số
các thuộc tính chỉ định các hạn chế đối với vấn đề đang được tối ưu hoá. Nhiều
Các thuộc tính OptimizeToursRequest
biểu thị các giới hạn tải.
Xe và gói hàng có những đặc điểm thực tế phải được xem xét khi lên kế hoạch cho một tuyến đường.
- Xe: Thuộc tính
loadLimits
nêu cụ thể tải trọng tối đa của xe mà xe có thể xử lý. Xem (REST, gRPC) của thông báoVehicle
tài liệu. - Lô hàng: Thuộc tính
loadDemands
xác định tải trọng của một sản phẩm cụ thể hàng tiêu thụ. Xem (REST, gRPC) của thông báoShipment
tài liệu.
Đồng thời, hai điều kiện ràng buộc này giúp trình tối ưu hoá có thể chỉ định lô hàng cho xe theo cách phù hợp nhất sức chứa của đội xe cũng như nhu cầu vận chuyển.
Phần còn lại của tài liệu này sẽ thảo luận chi tiết về loadLimits
và loadDemands
.
Nhu cầu và giới hạn tải: loại
Bạn thể hiện từng nhu cầu tải và giới hạn giới hạn theo một loại.
Bạn có thể cung cấp nhóm các loại tải của riêng mình, chẳng hạn như các ví dụ sau:
- cân nặng
- thể tích
- phép đo tuyến tính
- tên của mặt hàng hoặc thiết bị được vận chuyển
Hướng dẫn này dùng weightKg
làm loại ví dụ.
Cả Shipment.loadDemands
và Vehicle.loadLimits
đều sử dụng Vùng đệm giao thức
Loại map
, với string
khoá đại diện cho các loại tải.
Giá trị Shipment.loadDemands
sử dụng thông báo Load
(REST, gRPC).
Thông báo Load
có một thuộc tính amount
duy nhất biểu thị dung lượng
cần phải hoàn tất lô hàng theo loại đã chỉ định.
Giá trị Vehicle.loadLimits
sử dụng thông báo LoadLimit
(REST,
gRPC). Thông báo LoadLimit
có một số thuộc tính, trong đó maxLoad
thể hiện khả năng tải tối đa của xe trong loại được chỉ định.
loadDemands
của lô hàng chỉ tiêu thụ loadLimits
của xe được chỉ định nếu
cả hai có khoá loại tải phù hợp. Ví dụ: một lô hàng có
loadDemands
trong số:
"loadDemands": {
"weightKg": {
"amount": 50
}
}
cần 50 đơn vị tải thuộc loại weightKg
thì lô hàng mới
đã hoàn tất. Một chiếc xe có loadLimits
trong số:
"loadLimits": {
"weightKg": {
"maxLoad": 100
}
}
có thể hoàn thành lô hàng giao hàng, vì maxLoad
của chiếc xe trong
Loại weightKg
lớn hơn hoặc bằng loadDemands
của lô hàng tính theo
loại weightKg
. Tuy nhiên, xe có loadLimits
trong số:
"loadLimits": {
"equipmentRackStorage": {
"maxLoad": 10
}
}
ngầm định có dung lượng weightKg
không giới hạn do không có
Tải trọng tối đa là weightKg
, vì vậy xe không bị hạn chế về lượng hàng
nhu cầu cân nặng.
Di chuyển tải giữa các lô hàng và phương tiện vận tải
Khi hàng được vận chuyển bằng xe,
loadDemand
chuyển giữa phương tiện vận chuyển và xe. Bạn có thể thấy
tải của xe trong thông báo OptimizeToursResponse
(REST,
Mục nhập gRPC)routes.transitions
cho một chiếc xe cụ thể. Trình tự là
sau:
- Tải trọng cần thiết được xác định cho lô hàng là
loadDemand
. - Lô hàng được đến lấy bởi xe được chỉ định và xe
vehicleLoads
tăng lênloadDemand
của lô hàng. Chiến dịch này quá trình chuyển được biểu thị bằngvisits.loadDemands
dương trong phản hồi . - Xe giao hàng và
vehicleLoads
của xe giảm trị giáloadDemand
của lô hàng đã giao. Quá trình chuyển này là được biểu thị bằngvisits.loadDemands
tiêu cực trong tin nhắn phản hồi.
vehicleLoads
của xe không được vượt quá loadLimits
đã chỉ định tại bất cứ thời điểm nào
trên tuyến đường của mình.
Một ví dụ hoàn chỉnh về nhu cầu và giới hạn tải
Xem một yêu cầu mẫu có các yêu cầu tải và giới hạ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 } } } ] } }
Yêu cầu mẫu chứa một vài tham số liên quan đến tải:
shipments[0]
có nhu cầu tải là 50weightKg
.shipments[1]
có nhu cầu tải là 10weightKg
.shipments[2]
có nhu cầu tải là 80weightKg
.vehicles[0]
có giới hạn tải là 100weightKg
.
Xem phản hồi cho yêu cầu có yêu cầu tải và giới hạ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 } } }
Các điều kiện ràng buộc tải thêm sẽ ảnh hưởng đến thứ tự của visits
:
- Đã nhận
shipment[0]
- Đã nhận
shipment[1]
- Đã giao
shipment[0]
- Đã giao
shipment[1]
- Đã nhận
shipment[2]
- Đã giao
shipment[2]
Đơn đặt hàng này phản ánh rằng xe không thể hoàn tất ba lô hàng tại
cùng lúc vì tổng loadDemands
của chúng vượt quá tải của xe
loadLimits
.
Mỗi mục visits
bao gồm sự thay đổi về tải trọng xe do
hoàn thành Visit
. Giá trị số lượng dương thể hiện mức tải hàng trong khi vận chuyển
giá trị âm thể hiện việc dỡ hàng.
Mỗi mục transitions
bao gồm tổng tải trọng xe trong thời gian diễn ra
Transition
. Ví dụ: transitions[2]
có tải weightKg
là 60,
biểu thị tổng tải của shipment[0]
và shipment[1]
.
Các đối tượng chỉ số routes[0].metrics
và metrics.aggregatedRouteMetrics
bao gồm
thuộc tính maxLoads
. Giá trị của loại weightKg
là 80, đại diện cho
phần tuyến đường của phương tiện đã vận chuyển shipments[2]
đến
địa điểm giao hàng.
Các hạn chế đối với giới hạn tải mềm
Như với khung thời gian được mô tả trong Khung thời gian đến lấy hàng và giao hàng
Quy tắc ràng buộc, giới hạn giới hạn tải có các biến thể cứng và mềm. Chiến lược phát hành đĩa đơn
Thuộc tính maxLoad
của thông báo LoadLimit
thể hiện một quy tắc ràng buộc cố định:
xe không được tải trọng vượt quá giá trị maxLoad
trong thuộc tính được chỉ định
loại. Các thuộc tính softMaxLoad
và costPerUnitAboveSoftMax
thể hiện mềm
ràng buộc, với mỗi đơn vị vượt quá softMaxLoad
sẽ gây ra một
Chi phí là costPerUnitAboveSoftMax
.
Các ràng buộc đối với giới hạn tải mềm có một số công dụng, chẳng hạn như:
- cân bằng các lô hàng trên nhiều xe hơn số lượng tối thiểu cần thiết khi nào thì hiệu quả về chi phí để làm như vậy
- thể hiện sự lựa chọn ưu tiên của người lái xe đối với số lượng mặt hàng mà họ có thể thoải mái chọn đến lấy hàng và giao hàng theo một tuyến đường cụ thể
- tải xe dưới mức trọng tải vật lý tối đa để hạn chế hao mòn và giảm chi phí bảo trì
Bạn có thể sử dụng đồng thời các giới hạn đối với tải cứng và tải mềm. Ví dụ: một chế độ cài đặt khó giới hạn tải có thể biểu thị trọng lượng tối đa của hàng hoá mà xe có thể chuyên chở an toàn hoặc số lượng tối đa có thể cho vào một chiếc xe tại một thời điểm, trong khi giới hạn tải mềm có thể là trọng lượng tối đa hoặc số lượng mặt hàng cần chịu thuế khả năng bố trí mọi thứ trong xe.