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

この例では、移行属性を使用して、近くの集荷と配達が同じ車両で 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)を下回る 1 km あたりの費用に、しきい値(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→other 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 キロメートルあたりの費用がしきい値を下回っているのに、広告が表示されない理由

長い乗り換えよりも短い乗り換えを優先したい場合は、長い乗り換えの 1 キロメートルあたりの費用を高くし、短い乗り換えの 1 キロメートルあたりの費用を低く設定したくなるかもしれません。しかし、実際には逆の効果があります。最初の 100 メートルの移行が最も安価であるため、オプティマイザーは、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 つのソリューションの合計費用のうち低い方が太字でハイライト表示されます。しきい値を超える高いコストを使用すると、訪問がグループ化されたルートの合計コストが、目的とは逆に高くなっていることがわかります。