負荷の需要と制限

このガイドでは、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 メッセージ(RESTgRPC)の routes.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 台に一度に搭載できるアイテムの最大数、 ソフトロードの制限は、課税対象になるアイテムの ドライバーが車に何でも収まります