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