このガイドでは、loadDemands
と loadLimits
について説明し、それぞれとの関係について説明します
あります。
受け取りと配達の時間帯の制約で説明したように、
OptimizeToursRequest
メッセージ(REST、gRPC)には、
最適化する問題に対する制約を指定するプロパティ複数
OptimizeToursRequest
プロパティは読み込みの制約を表します。
車両や貨物には物理的な特性があり、 ルートを計画しています。
- 車両:
loadLimits
プロパティは、車両の最大負荷を指定します。 制御する必要があります。Vehicle
メッセージ(REST、gRPC)を確認する ご覧ください - Shipments(配送):
loadDemands
プロパティは、特定の荷物の積荷量を指定します。 消費しますShipment
メッセージ(REST、gRPC)を確認する ご覧ください
これら 2 つの制約を組み合わせることで、オプティマイザーは 最適な方法で出荷を車両に適切に割り当てる フリートの容量と配送の需要に応じて調整できます。
このドキュメントの残りの部分では、loadLimits
と loadDemands
について詳しく説明します。
負荷の需要と制限: タイプ
各負荷の需要と上限の制約をタイプで表現します。
次の例のように、独自の読み込みタイプのセットを指定できます。
- weight
- 音量
- 線形測定
- 輸送する品目または機器の名前
このガイドでは、weightKg
をタイプとして使用します。
Shipment.loadDemands
と Vehicle.loadLimits
はどちらもプロトコル バッファを使用する
map
型。負荷のタイプを表す string
キーを使用します。
Shipment.loadDemands
値は、Load
メッセージ(REST、gRPC)を使用します。
Load
メッセージには、容量を表す単一の amount
プロパティが含まれます。
指定されたタイプで発送を完了する必要があります。
Vehicle.loadLimits
値では、LoadLimit
メッセージ(REST、
gRPC)。LoadLimit
メッセージには、maxLoad
を含むいくつかのプロパティがあります。
指定されたタイプでの車両の最大積載量を表す。
次の場合にのみ、配送の loadDemands
は割り当てられた車両の loadLimits
を消費します。
一致する読み込みタイプのキーがあります。たとえば、
次の loadDemands
件:
"loadDemands": {
"weightKg": {
"amount": 50
}
}
配送のために weightKg
タイプのロード ユニットが 50 個必要
完了していません。以下の loadLimits
の車両:
"loadLimits": {
"weightKg": {
"maxLoad": 100
}
}
車両のmaxLoad
は、
weightKg
のタイプが、配送の loadDemands
以上
weightKg
型。以下の loadLimits
の車両:
"loadLimits": {
"equipmentRackStorage": {
"maxLoad": 10
}
}
リソースがないため、暗黙的に weightKg
の容量が無制限になる
積載量の上限は weightKg
のため、車両は荷物の配送状況によって制約を受けません。
重み需要。
配送と車両間の負荷の移動
荷物の集荷と配達は車両で行われるため、荷物の
loadDemand
による配送と車両間の転送詳しくは、
OptimizeToursResponse
メッセージ(REST、
gRPC)routes.transitions
エントリ。シーケンスは次のとおりです。
次のようになります。
- 配送に必要な積載量は
loadDemand
として定義されています。 - 荷物の集荷は、割り当てられた車両と車両の
vehicleLoads
は、配送のloadDemand
の金額だけ増加します。この 転送はレスポンスで正のvisits.loadDemands
で表される 表示されます。 - 車両が荷物を配達し、車両の
vehicleLoads
が減少した 注文した商品のloadDemand
の割合で計算されます。この送金は レスポンス メッセージでは負visits.loadDemands
で表されます。
いかなる時点でも車両の vehicleLoads
が指定の loadLimits
を超えることはできません
表示されます。
負荷の需要と制限を含む完全な例
負荷の要求とリクエストの例を 制限
{ "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 } } } ] } }
このリクエスト例には、負荷関連のパラメータがいくつか含まれています。
shipments[0]
の読み込み需要は 50weightKg
です。shipments[1]
の読み込み需要は 10weightKg
です。shipments[2]
の読み込み需要は 80weightKg
です。vehicles[0]
の読み込み上限は 100weightKg
です。
リクエストに対するレスポンスを確認して負荷の要求と 制限
{ "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 } } }
追加された読み込み制約は、visits
の順序に影響します。
shipment[0]
に乗車shipment[1]
に乗車shipment[0]
が配達されましたshipment[1]
が配達されましたshipment[2]
に乗車shipment[2]
が配達されました
この注文は、車両で 3 回の配送を完了できないことを示しています。
合計 loadDemands
が車両の金額を上回っているためです。
loadLimits
。
各 visits
エントリには、車両の負荷の変化によって生じる車両負荷の変化が含まれます。
Visit
の完了。正の負荷の値は荷物の積載量を表し、
負の値は荷物の積み下ろしを表します。
各 transitions
エントリには、期間中の車両の総積載量が含まれます。
Transition
。たとえば、transitions[2]
の weightKg
負荷は 60 です。
shipment[0]
と shipment[1]
の合計負荷を表します。
指標オブジェクト routes[0].metrics
と metrics.aggregatedRouteMetrics
には次のものがあります。
maxLoads
プロパティ。weightKg
タイプの値は 80 で、
ルート上で shipments[2]
を
配送場所を指定します。
ソフトロード制限の制約
「店舗受け取りと配送の時間帯」で説明されている時間帯と同様です。
制約: 負荷制限の制約には、ハード バリアントとソフト バリアントがあります。「
LoadLimit
メッセージの maxLoad
プロパティは、ハード制約を表します。
車両は指定された範囲内の maxLoad
値を超える荷物を運ぶことはできません
あります。プロパティ softMaxLoad
と costPerUnitAboveSoftMax
はソフト
制約があり、softMaxLoad
を超えるユニットごとに
費用は costPerUnitAboveSoftMax
です。
ソフトロード制限の制約には、次のような用途があります。
- 必要最小限の車両数を超える数の車両に荷物のバランスを取る その方が費用対効果に優れている場合
- ドライバーが快適に購入できる商品数を好む 指定されたルートで受け取りと配達
- 摩耗を抑えるため、車両に積載可能な最大物量以下に メンテナンス費用を削減
ハード負荷制限とソフト負荷制限は併用できます。たとえば、 積載量制限は、車両で安全に運送できる貨物の最大重量を表すことがあります 1 台に一度に搭載できるアイテムの最大数、 ソフトロードの制限は、課税対象になるアイテムの ドライバーがすべての車に 収納できるかを考えます