この例では、遷移属性を使用して、近くの集荷と配達が同じ車両によって 1 つの時間ブロックで行われる場合のルートの優先度を設定する方法を示します。遷移属性の詳細については、遷移属性を使用してビジネス ロジックをモデル化するをご覧ください。
この例では、次のようになります。
- 荷物 A、B、C の配達先が同じ道路で近接している。
- 今後、さらに配信地域を拡大する予定です。
- 配達時間は指定されていません。
- 訪問スケジュールに関係なく、車両はこの道路を 2 回走行する必要があります。1 回目は朝にデポから、2 回目は夕方にデポに戻る際に走行します。
- ルートの総移動距離と所要時間は、A、B、C の実行時間に関係なく常に同じです。
この状況で、1 時間あたりの費用と 1 キロメートルあたりの費用のみを使用するリクエストの場合、最適化されたルートで A と B を午前中に処理し、C を午後に処理できます。このソリューションの費用は、3 つすべてを同時に処理する場合と同じになります。
キロメートルあたりの費用(しきい値あり)
近隣の訪問をグループ化するには、まずしきい値の距離を選択する必要があります。これは、近くにあるとみなされる 2 回の訪問間の最大距離です。この例では、都市部の 1 ブロックにほぼ相当する 100 メートルのしきい値を使用しています。しきい値は、ビジネスニーズやドライバーの設定に合わせて増減できます。
100 m 以内の近接訪問をグループ化するには、各経路の最初の 100 m に高い費用を設定し、それ以降の距離には低い費用を設定します。最初の 100 メートルが最も費用がかかるため、ルートが長くなる場合でも、100 メートルのしきい値より短い経路を使用すると、オプティマイザーは最大限の費用削減を実現できます。
費用を設定するには、ShipmentModel.transition_attributes
に次のプロパティを使用して新しいエントリを追加します。
- すべての遷移を照合するには、モデルのどこでも使用されていないタグ(
UNUSED_TAG
など)を選択します。このタグにTransitionAttributes.excluded_src_tag
とTransitionAttributes.excluded_dst_tag
を設定します。 - しきい値の距離と費用を使用して
TransitionAttributes.distance_limit
を設定します。DistanceLimit.soft_max_meters
を選択したしきい値に設定します。DistanceLimit.cost_per_kilometer_below_soft_max
を、しきい値を下回る 1 キロメートルあたりの費用に設定します。DistanceLimit.cost_per_kilometer_above_soft_max
を、しきい値を超える 1 キロメートルあたりの費用に設定します。
{
"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 つあります。
移行 | 距離 | しきい値より下 | しきい値より上 | ||
---|---|---|---|---|---|
距離 | 費用 | 距離 | 費用 | ||
デポ → 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 | 930 m | 0.93 |
その他→C | 1,000 m | 100 m | 5 | 900 m | 0.9 |
C→デポ | 1,080 m | 100 m | 5 | 980 m | 0.98 |
合計 | 450 m | 22.5 | 3710 m | 3.71 |
総費用は、次の 2 つの費用を 1 キロメートルあたりの費用として合計したものです。
- しきい値未満の 1 km あたりの費用(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 つありますが、長さと構成は異なります。
移行 | 距離 | しきい値より下 | しきい値より上 | ||
---|---|---|---|---|---|
距離 | 費用 | 距離 | 費用 | ||
デポ → A | 1,000 m | 100 m | 5 | 900 m | 0.9 |
A→B | 50 m | 50 m | 2.5 | 0 分 | 0 |
B→C | 30 m | 30 m | 1.5 | 0 分 | 0 |
C→その他 | 1,000 m | 100 m | 5 | 900 m | 0.9 |
other→depot | 2080 m | 100 m | 5 | 1,980 m | 1.98 |
合計 | 380 m | 19 | 3780 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 km あたりの費用を高くし、短い経路には 1 km あたりの費用を低く設定したくなるかもしれません。しかし、これは逆の効果をもたらします。移行の最初の 100 メートルは最も費用が低いため、オプティマイザーは、100 メートルに近いまたは 100 メートルを超える移行を優先することで、これらの「低価格」のメートルを最大限に活用します。
この効果は、2 つのサンプル ソリューションで確認できます。しきい値未満と超える 1 キロあたりの費用を入れ替えると、ルートの費用は次のように変わります。
費用の上限を超えている | しきい値を下回る高コスト | |||
---|---|---|---|---|
解答 1 | 解決策 2 | 解答 1 | 解決策 2 | |
しきい値を下回る KM | 0.45 | 0.38 | 0.45 | 0.38 |
1 km あたりの費用が基準を下回っている | 1.00 | 1.00 | 50.00 | 50.00 |
しきい値を超える KM | 3.71 | 3.78 | 3.71 | 3.78 |
1 km あたりの費用が基準を超えている | 50.00 | 50.00 | 1.00 | 1.00 |
総費用 | 185.95 | 189.38 | 26.21 | 22.78 |
各バージョンで、2 つのソリューションの合計費用のうち低い方の金額が太字でハイライト表示されます。しきい値を超える高コストを使用すると、訪問がグループ化されたルートのルート費用の合計が高くなることがわかります。これは、達成したい結果とは逆です。