負荷費用

積載コストは、`ShipmentModel` の `Vehicle` の `loadLimits` プロパティで定義されます。

積載費用は、配送の集荷と配達の間で車両が運ぶ積載量に基づいて車両に発生する費用またはペナルティを指定します。これらの費用は、costPerKilometer で移動距離に基づいて構成するか、costPerTraveledHour で移動時間に基づいて構成するか、両方を同時に使用できます。

次のような目標をサポートするように、ロードコストを構成します。

  • 貨物の重量に応じて増加する燃料費を考慮に入れます。
  • 積載量の多い車両を長距離にわたってルート設定することは避けてください。
  • 重い荷物による車両の摩耗を考慮します。

プロパティ

Vehicle の loadLimits プロパティ内で読み込み費用を指定します。他のすべての費用パラメータと同様に、ロード費用は無次元の相対費用単位を使用します。

次のプロパティを使用して、読み込み費用を定義できます。

プロパティ タイプ 説明
costPerKilometer オブジェクト 移動距離に基づいて移動費用を計算する LoadCost オブジェクト タイプが含まれています。
costPerTraveledHour オブジェクト LoadCost オブジェクト タイプが含まれています。このオブジェクト タイプは、移動時間に基づいて移動費用を計算します(待機時間、訪問時間、休憩時間は除きます)。

LoadCost

LoadCost メッセージ タイプは、特定の荷物を運ぶ際の移動費用を定義します。これにより、負荷のしきい値を設定し、そのしきい値を下回る負荷と上回る負荷の両方に対して、負荷の単位ごとに異なる費用レートを指定できます。

LoadCost オブジェクトには、次の構成パラメータが含まれています。

パラメータ 型 説明
loadThreshold 文字列(int64 形式) 費用計算率が変化する負荷レベル。デフォルトは、0 です。
costPerUnitAboveThreshold 数値 loadThreshold を超える各ロード単位に適用される費用。デフォルトは 0 です。
costPerUnitBelowThreshold 数値 loadThreshold 以下の各ロード単位に適用される費用。デフォルトは 0 です。

荷物の積み込み費用と配送を照合する

車両の積載量がルート上の荷物の loadDemands タイプと一致する場合、積載費用が適用されます。荷物の種類は、重量や体積などの任意の文字列です。ロードタイプの構成の詳細については、ロードタイプをご覧ください。

例

このセクションでは、次の 3 種類の例について説明します。

コードサンプル

次の例は、使用可能なすべての構成パラメータを使用してロードコストを構造化する方法を示しています。このサンプルでは costPerKilometer を使用していますが、costPerTraveledHour に置き換えて、距離ではなく移動時間に基づいて費用を計算することもできます。

{
  "model": {
    "vehicles": [{
      "loadLimits": {
        "LOAD_TYPE": {
          "maxLoad": "MAX_LOAD",
          "costPerKilometer": {
            "loadThreshold": "LOAD_THRESHOLD",
            "costPerUnitAboveThreshold": COST_ABOVE,
            "costPerUnitBelowThreshold": COST_BELOW
          }
        }
      }
    }]
  }
}

シナリオ例

このセクションでは、燃料消費量を最適化するシナリオについて説明します。このシナリオでは、燃料消費量は距離と貨物の重量に比例します。車両は積載量が多いほど燃料を消費するため、重い荷物を先に配達するルートを計画します。

この動作を設定するには、重い荷物を積んで長距離を移動する車両にペナルティを科すようにリクエストを構成します。この例では、リクエストで次のプロパティ値を使用します。

親 プロパティ タイプ 値 シナリオ
loadLimits 読み込みのタイプ 文字列 weightKg 追跡する容量のタイプを定義します。この例では、weightKg を使用して貨物の重量をキログラム単位で表します。
loadLimits maxLoad 文字列 100 車両が運搬できる最大貨物重量。
costPerKilometer loadThreshold 文字列 15 ベースラインの負荷しきい値を設定します。15 kg を超える貨物重量には、積載量に基づく燃料費のペナルティが課せられます。
costPerKilometer costPerUnitAboveThreshold 数値 1 燃料費の係数として機能します。移動距離 1 km ごとに、15 kg を超える貨物 1 kg あたり 1 費用単位が発生します。
loadDemands amount 文字列 配送 1: 50
配送 2: 10
配送 3: 80
3 つの荷物それぞれの重量を指定します。

このシナリオでは、構成された値は次のように機能します。

  • 最適化ツールは、最も重い荷物を最初に配達するようにルートを調整します。ソルバーは、重い荷物を積んだ状態で移動する距離を最小限に抑えるため、ルートの最初に 80 kg と 50 kg の配達をスケジュールします。
  • オプティマイザーは、重い荷物を運ぶ距離を最小限に抑えるようにルートを調整します。これらの設定がルートに与える影響を確認するには、costPerUnitAboveThreshold を 1 から 5 に増やします。重みペナルティを大きくすると、重い荷物を運ぶ距離を最小限に抑えるために、オプティマイザーがさらに努力するようになります。これにより、配送順序が変更されたり、複数の車両に荷物が分割されたりする可能性があります。

リクエストの例

次の例は、シナリオ例のロードコスト値を取り込んだ基本的な optimizeTours リクエストの構造を示しています。

{
  "model": {
    "shipments": [
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789456,
              "longitude": -122.390192
            },
            "duration": "250s"
          }
        ],
        "penaltyCost": 100.0,
        "loadDemands": {
          "weightKg": {
            "amount": "50"
          }
        }
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s"
          }
        ],
        "penaltyCost": 30.0,
        "loadDemands": {
          "weightKg": {
            "amount": "10"
          }
        }
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s"
          }
        ],
        "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",
            "costPerKilometer": {
              "loadThreshold": "15",
              "costPerUnitAboveThreshold": 1
            }
          }
        }
      }
    ]
  }
}

計算式

オプティマイザーは、次の式を使用してロード費用を計算します。

完全なしきい値の計算

costPerUnitAboveThreshold と costPerUnitBelowThreshold の両方を指定すると、loadThreshold を超える負荷量と下回る負荷量の両方で、個別の移動費用が発生します。式は次のとおりです。

cost = max(carried_load - load_threshold, 0) * distance_or_time * cost_per_unit_above_threshold
       + min(carried_load, load_threshold) * distance_or_time * cost_per_unit_below_threshold

たとえば、リクエストの例の値を使用し、costPerUnitBelowThreshold の値が 2 の場合、車両が 50 の荷物を積んで 10 km 走行すると、計算は次のようになります。

max(50 - 15, 0) * 10 * 1 + min(50, 15) * 10 * 2 = 650 cost units

しきい値を超える場合の計算

costPerUnitAboveThreshold のみを指定すると、計算は完全なしきい値の数式の特殊なケースになります。しきい値を下回る費用はゼロであるため、完全な式の後半はゼロと評価されます。式は次のとおりです。

cost = max(carried_load - load_threshold, 0) * distance_or_time * cost_per_unit_above_threshold

たとえば、リクエストの例の値を使用し、loadThreshold が 15、costPerUnitAboveThreshold が 1 の場合、車両が 50 の荷物を積んで 10 キロメートル走行すると、計算は次のようになります。

max(50 - 15, 0) * 10 * 1 = 350 cost units

しきい値を下回る場合の計算

同様に、costPerUnitBelowThreshold のみを指定すると、しきい値を超える費用がゼロになる、しきい値の完全な数式における別の特殊なケースが計算されます。式は次のとおりです。

cost = min(carried_load, load_threshold) * distance_or_time * cost_per_unit_below_threshold