この例では、トランジション属性を使用して、近くの集荷と配送を同じ車両が 1 つの時間帯で行うルートを優先する方法を示します。トランジション属性について詳しくは、トランジション属性を使用したモデルのビジネスロジック をご覧ください。
この例では、次のようになります。
- 荷物 A、B、C の配送先は、同じ道路沿いの近くにあります。
- 追加の配送先は、さらに先にあります。
- 配送には、指定されたお届け日数がありません。
- 訪問スケジュールに関係なく、車両はこの道路を 2 回走行する必要があります。1 回は朝にデポから向かうとき、もう 1 回は夕方に帰るときです。
- A、B、C の実行時期に関係なく、ルートの総移動距離と所要時間は常に同じです。

この状況で、1 時間あたりの費用と 1 キロメートルあたりの費用のみを使用するリクエストの場合、最適化されたルートでは、A と B は午前中に処理され、C は夕方に処理される可能性があります。このソリューションの費用は、3 つすべてを同時に処理する場合と同じになります。
しきい値を使用したキロメートルあたりの費用
近くの訪問をグループ化するには、まずしきい値距離を選択する必要があります。これは、近くにあると見なされる 2 つの訪問間の最大距離です。この例では、都市部の 1 ブロックに相当する 100 メートルのしきい値を使用します。しきい値は、ビジネスニーズとドライバーの好みに合わせて増減できます。
互いに 100 メートル以内の近くの訪問をグループ化するには、各トランジションの最初の 100 メートルに高い費用を設定し、トランジションの追加のメートル数には低い費用を設定します。最初の 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を、しきい値未満のキロメートルあたりの費用に設定します。DistanceLimit.cost_per_kilometer_above_soft_maxをしきい値を超えるキロメートルあたりの費用に設定します。
{
"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 m | 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 | 3,710 m | 3.71 | |
総費用は、キロメートルあたりの 2 つの費用の合計として計算されます。
- しきい値未満のキロメートルあたりの費用(50)に、しきい値未満の総移動距離(450 m = 0.45 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 回の走行中に「グループとして」配送されます。もう 1 回の走行では、車両はまったく停止しません。ここでもトランジションは 5 つありますが、長さと構成が異なります。
| 移行 | 距離 | しきい値より下 | しきい値より上 | ||
|---|---|---|---|---|---|
| 距離 | 費用 | 距離 | 費用 | ||
| デポ → A | 1,000 m | 100 m | 5 | 900 m | 0.9 |
| A→B | 50 m | 50 m | 2.5 | 0 m | 0 |
| B→C | 30 m | 30 m | 1.5 | 0 m | 0 |
| C → その他 | 1,000 m | 100 m | 5 | 900 m | 0.9 |
| その他 → デポ | 2,080 m | 100 m | 5 | 1,980 m | 1.98 |
| 合計 | 380 m | 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ことで強化できます。
しきい値未満のキロメートルあたりの費用が低いと機能しない理由
長いトランジションよりも短いトランジションを優先したい場合は、長いトランジションに高いキロメートルあたりの費用を設定し、短いトランジションには低いキロメートルあたりの費用を維持したくなるかもしれません。しかし、実際には逆の効果があります。トランジションの最初の 100 メートルが最も安いため、最適化ツールは、100 メートルに近いトランジションや 100 メートルを超えるトランジションを優先することで、これらの「安い」メートルを最大限に活用します。
この効果は、2 つのサンプル ソリューションで確認できます。しきい値未満と超えるキロメートルあたりの費用を入れ替えると、ルート費用が変わります。
| しきい値を超える高費用 | しきい値未満の高費用 | |||
|---|---|---|---|---|
| ソリューション 1 | ソリューション 2 | ソリューション 1 | ソリューション 2 | |
| しきい値未満のキロメートル数 | 0.45 | 0.38 | 0.45 | 0.38 |
| しきい値未満のキロメートルあたりの費用 | 1.00 | 1.00 | 50.00 | 50.00 |
| しきい値を超えるキロメートル数 | 3.71 | 3.78 | 3.71 | 3.78 |
| しきい値を超えるキロメートルあたりの費用 | 50.00 | 50.00 | 1.00 | 1.00 |
| 総費用 | 185.95 | 189.38 | 26.21 | 22.78 |
各バージョンで、2 つのソリューションの総費用のうち低い方が太字でハイライト表示されます。しきい値を超える費用が高い場合、訪問がグループ化されたルートの総費用が、達成したい目標とは逆に高くなっていることがわかります。