この例では、移行属性を使用して、近くの集荷と配達が同じ車両で 1 つの時間ブロック内で行われるルートを優先する方法を示します。移行属性の詳細については、移行属性を使用したビジネス ロジックのモデル化をご覧ください。
この例では、次のようになります。
- 荷物 A、B、C の配達場所が同じ道路沿いに近い。
- 追加の配信は今後行われます。
- 配達には指定された配達時間はありません。
- 訪問スケジュールに関係なく、車両はこの道路を 2 回走行する必要があります。1 回目は朝に拠点から出発する際、2 回目は夕方に帰る際です。
- 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
を、基準値を下回る 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 つのトランジションがあります。
移行 | 距離 | しきい値より下 | しきい値より上 | ||
---|---|---|---|---|---|
距離 | 費用 | 距離 | 費用 | ||
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 つのソリューションの合計費用のうち低い方が太字でハイライト表示されます。しきい値を超える高いコストを使用すると、訪問がグループ化されたルートの合計コストが、目的とは逆に高くなっていることがわかります。