遷移属性を使用して近隣の訪問に優先度を付ける

この例では、移行属性を使用して、近くの集荷と配達が同じ車両で 1 つの時間ブロック内で行われるルートを優先する方法を示します。移行属性の詳細については、移行属性を使用したビジネス ロジックのモデル化をご覧ください。

この例では、次のようになります。

  • 荷物 A、B、C の配達場所が同じ道路沿いに近い。
  • 追加の配信は今後行われます。
  • 配達には指定された配達時間はありません。
  • 訪問スケジュールに関係なく、車両はこの道路を 2 回走行する必要があります。1 回目は朝にデポから出発するとき、2 回目は夕方に帰るときです。
  • A、B、C の実行時期に関係なく、ルートの合計移動距離と所要時間は常に同じです。

同じ道路で荷物を配達する例。配送センターから他の配送に向かう配送 A、B、C があります。A は車庫から 1,000 m、B は車庫からさらに 50 m、C は同じ方向にさらに 30 m 離れています。C から 1,000 m 離れた場所に他の荷物があります。

この状況で、1 時間あたりの費用と 1 キロメートルあたりの費用のみを使用するリクエストの場合、最適化されたルートでは、A と B が午前中に処理され、C が午後に処理される可能性があります。このソリューションの費用は、3 つすべてが同時に処理される場合と同じになります。

しきい値付きのキロメートルあたりの費用

近くの訪問をグループ化するには、まずしきい値の距離を選択する必要があります。これは、近くにあると見なす 2 つの訪問間の最大距離です。この例では、都市部の 1 ブロックにほぼ相当する 100 メートルのしきい値を使用します。しきい値は、ビジネスのニーズやドライバーの好みに合わせて増減できます。

互いに 100 メートル以内の近隣の訪問をグループ化するには、各トランジションの最初の 100 メートルに高いコストを設定し、トランジションの追加のメートルには低いコストを設定します。最初の 100 メートルが最もコストが高いため、オプティマイザーは、ルートの全長が長くなるとしても、100 メートルのしきい値よりも短いトランジションを使用することで、最大の節約を実現します。

費用を設定するには、次のプロパティを使用して ShipmentModel.transition_attributes に新しいエントリを追加します。

{
  "model": {
    "transitionAttributes": [
      {
        "excluded_dst_tag": "UNUSED_TAG",
        "excluded_src_tag": "UNUSED_TAG",
        "distanceLimit": {
          "softMaxMeters": 100,
          "costPerKilometerBelowSoftMax": 50,
          "costPerKilometerAboveSoftMax": 1,
        }
      }
    ]
  }
}

タグ #unused_tag# は、考えられるすべての遷移を照合するために、荷物や車両で使用してはなりません。詳しくは、すべてのアクセス リクエストを照合する方法をご覧ください。

しきい値を下回る高額費用の仕組み

このセクションでは、しきい値を下回る費用としきい値を上回る費用が、サンプル シナリオのさまざまなソリューションの全体的な費用にどのように影響するかを示します。

解決策 1: 行きに A と B を実行し、帰りに C を実行する

このソリューションでは、配送は道路の 2 つのトラバーサルに分割されます。そのうちの 2 つは最初のトラバーサルで配信され、残りの 1 つは 2 回目のトラバーサルで配信されます。5 つのトランジションがあります。

移行 距離 しきい値より下 しきい値より上
距離 費用 距離 費用
depot →A 1,000 m 100 m 5 900 m 0.9
A→B 50 m 50 m 2.5 0 分 0
B→その他 1,030 m 100 m 5 9 億 3,000 万 0.93
other→C 1,000 m 100 m 5 900 m 0.9
C→depot 1080 m 100 m 5 9 億 8,000 万 0.98
合計 450 m 22.5 3,710 m 3.71

総費用は、2 つの費用(1 キロメートルあたり)の合計として計算されます。

  • しきい値(50)を下回るキロメートルあたりの費用に、しきい値(450 m = 0.45 km)を下回る総移動距離を掛けた値。
  • しきい値を超える 1 km あたりの費用(1)に、しきい値を超える総走行距離(3,710 m = 3.71 km)を掛けた値。

したがって、総費用は 0.45 * 50 + 3.71 * 1 = 22.5 + 3.71 = 26.21 となります。

解決策 2: 行きに A、B、C を実行し、帰りは何も実行しない

このソリューションでは、ソリューション 1 とは異なり、3 つの荷物がすべて道路の 1 回の通過中に「グループとして」配達されます。もう一方のトラバーサルでは、車両はまったく停車しません。ここでも 5 つのトランジションがありますが、長さと構成が異なります。

移行 距離 しきい値より下 しきい値より上
距離 費用 距離 費用
depot →A 1,000 m 100 m 5 900 m 0.9
A→B 50 m 50 m 2.5 0 分 0
B→C 30 分 30 分 1.5 0 分 0
C→その他 1,000 m 100 m 5 900 m 0.9
other→depot 2,080 m 100 m 5 1,980 m 1.98
合計 3 億 8,000 万 19 3,780 m 3.78

ソリューション 1 と同じ計算を使用すると、総費用は 0.38 * 50 + 3.78 * 1 = 19 + 3.78 = 22.78 となり、すべての訪問を 1 つの時間ブロックで実行する方が、2 つのグループで実行するよりも費用が低くなります。DistanceLimit.cost_per_kilometer_below_soft_max を増やすと、この効果を強化できます。

1 キロメートルあたりの費用がしきい値を下回っているのに、目標が達成されない理由

長い乗り換えよりも短い乗り換えを優先したい場合は、長い乗り換えのキロメートルあたりの費用を高くし、短い乗り換えのキロメートルあたりの費用を低く設定したくなるかもしれません。しかし、実際には逆の効果があります。最初の 100 メートルの移行が最も安価であるため、オプティマイザーは、100 メートルに近いかそれ以上の移行を優先することで、これらの「安価な」メートルを最大限に活用します。

この効果は、2 つのソリューション例で確認できます。しきい値の上下で 1 キロメートルあたりの費用を入れ替えると、ルートの費用は次のように変化します。

しきい値を超える高コスト しきい値を下回る高コスト
解答 1 解決策 2 解答 1 解決策 2
しきい値を下回る KM 0.45 0.38 0.45 0.38
しきい値を下回った KM あたりの費用 1.00 1.00 50.00 50.00
しきい値を超過した KM 3.71 3.78 3.71 3.78
しきい値を超える KM あたりの費用 50.00 50.00 1.00 1.00
総費用 185.95 189.38 26.21 22.78

バージョンごとに、2 つのソリューションの合計費用のうち低い方が太字でハイライト表示されます。しきい値を超える高いコストを使用すると、訪問がグループ化されたルートの合計コストが高くなり、目的とは逆の結果になることがわかります。