負荷の需要と制限

このガイドでは、loadDemandsloadLimits について説明し、それぞれとの関係について説明します あります。

受け取りと配達の時間帯の制約で説明したように、 OptimizeToursRequest メッセージ(RESTgRPC)には、 最適化する問題に対する制約を指定するプロパティ複数 OptimizeToursRequest プロパティは読み込みの制約を表します。

車両や貨物には物理的な特性があり、 ルートを計画しています。

  • 車両: loadLimits プロパティは、車両の最大負荷を指定します。 制御する必要があります。Vehicle メッセージ(RESTgRPC)を確認する ご覧ください
  • Shipments(配送): loadDemands プロパティは、特定の荷物の積荷量を指定します。 消費しますShipment メッセージ(RESTgRPC)を確認する ご覧ください

これら 2 つの制約を組み合わせることで、オプティマイザーは 最適な方法で出荷を車両に適切に割り当てる フリートの容量と配送の需要に応じて調整できます。

このドキュメントの残りの部分では、loadLimitsloadDemands について詳しく説明します。

負荷の需要と制限: タイプ

各負荷の需要と上限の制約をタイプで表現します。

次の例のように、独自の読み込みタイプのセットを指定できます。

  • weight
  • 音量
  • 線形測定
  • 輸送する品目または機器の名前

このガイドでは、weightKg をタイプとして使用します。

Shipment.loadDemandsVehicle.loadLimits はどちらもプロトコル バッファを使用する map。負荷のタイプを表す string キーを使用します。

Shipment.loadDemands 値は、Load メッセージ(RESTgRPC)を使用します。 Load メッセージには、容量を表す単一の amount プロパティが含まれます。 指定されたタイプで発送を完了する必要があります。

Vehicle.loadLimits 値では、LoadLimit メッセージ(RESTgRPC)。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 メッセージ(RESTgRPCroutes.transitions エントリ。シーケンスは次のとおりです。 次のようになります。

  1. 配送に必要な積載量は loadDemand として定義されています。
  2. 荷物の集荷は、割り当てられた車両と車両の vehicleLoads は、配送の loadDemand の金額だけ増加します。この 転送はレスポンスでvisits.loadDemands で表される 表示されます。
  3. 車両が荷物を配達し、車両の 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] の読み込み需要は 50 weightKg です。
  • shipments[1] の読み込み需要は 10 weightKg です。
  • shipments[2] の読み込み需要は 80 weightKg です。
  • vehicles[0] の読み込み上限は 100 weightKg です。

リクエストに対するレスポンスを確認して負荷の要求と 制限

{
  "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 の順序に影響します。

  1. shipment[0] に乗車
  2. shipment[1] に乗車
  3. shipment[0] が配達されました
  4. shipment[1] が配達されました
  5. shipment[2] に乗車
  6. shipment[2] が配達されました

この注文は、車両で 3 回の配送を完了できないことを示しています。 合計 loadDemands が車両の金額を上回っているためです。 loadLimits

visits エントリには、車両の負荷の変化によって生じる車両負荷の変化が含まれます。 Visit の完了。正の負荷の値は荷物の積載量を表し、 負の値は荷物の積み下ろしを表します。

transitions エントリには、期間中の車両の総積載量が含まれます。 Transition。たとえば、transitions[2]weightKg 負荷は 60 です。 shipment[0]shipment[1] の合計負荷を表します。

指標オブジェクト routes[0].metricsmetrics.aggregatedRouteMetrics には次のものがあります。 maxLoads プロパティ。weightKg タイプの値は 80 で、 ルート上で shipments[2] を 配送場所を指定します。

ソフトロード制限の制約

店舗受け取りと配送の時間帯」で説明されている時間帯と同様です。 制約: 負荷制限の制約には、ハード バリアントとソフト バリアントがあります。「 LoadLimit メッセージの maxLoad プロパティは、ハード制約を表します。 車両は指定された範囲内の maxLoad 値を超える荷物を運ぶことはできません あります。プロパティ softMaxLoadcostPerUnitAboveSoftMax はソフト 制約があり、softMaxLoad を超えるユニットごとに 費用は costPerUnitAboveSoftMax です。

ソフトロード制限の制約には、次のような用途があります。

  • 必要最小限の車両数を超える数の車両に荷物のバランスを取る その方が費用対効果に優れている場合
  • ドライバーが快適に購入できる商品数を好む 指定されたルートで受け取りと配達
  • 摩耗を抑えるため、車両に積載可能な最大物量以下に メンテナンス費用を削減

ハード負荷制限とソフト負荷制限は併用できます。たとえば、ハードコードされた 積載量制限は、車両で安全に運送できる貨物の最大重量を表します 1 台に一度に搭載できるアイテムの最大数、 ソフトロードの制限は、課税対象になるアイテムの ドライバーが車に何でも収納できる状態を維持します。