メインコンテンツまでスキップ

イコライザー (Equalizers)

複雑な車両ルーティングシナリオでは、総コストの最小化のみに焦点を当てた最適化が、バランスの取れていないルートを生成することが一般的です。ある車両に18件の配送が割り当てられる一方で別の車両には4件しか割り当てられない、あるいはあるドライバーは早朝から夜遅くまで稼働する一方で別のドライバーは昼前に終業する、といった状況です。いずれの計画も安価ですが、その背後にあるシフトパターンは営業所の管理者がドライバーにそのまま提示できるものではなく、ドライバーの公平性、残業代、および一貫性のない車両使用率の問題につながります。

SWAT はこれに対応する2つの独立したイコライザーを提供しています。両者は均等化する対象が異なり、設定する場所も異なります。

パスイコライザー稼働時間イコライザー
均等化の対象車両ごとの 停留所数フリート全体の 時間枠(メイクスパン)
測定方法各車両の平均停留所数からの乖離の二乗最も遅いルート終了時刻 − 最も早いルート開始時刻
設定場所calculation_parametersmodel_parameters
フィールドuse_path_equalizerpath_equalizer_weightworking_hours_equalizer

課題が 各ドライバーの配送件数 にある場合は パスイコライザー を、シフト時刻 にある場合は 稼働時間イコライザー をご利用ください。両者は独立しており、併用も可能です。

停留所数は稼働時間ではありません

どちらのイコライザーも他方の代替にはなりません。停留所間の距離に大きな差がある場合、停留所数を均等に分割してもシフト長は不均等になり得ます。また、共通の狭いシフト枠を実現しても、配送件数の大きな偏りが隠れている場合があります。

パスイコライザー (Path Equalizer)

パスイコライザーは、フリート内のすべての車両にわたってワークロード(各車両が担当する 停留所数 で測定)のより公平な配分を促進します。その目標は停留所数の 分散 を最小化し、あるドライバーが別のドライバーよりも大幅に多い配送リストを担当しないようにすることです。

仕組み (How it works)

ソルバーは各車両に割り当てられたノード数を数え、それをフリート平均と比較し、その 差の二乗path_equalizer_weight を掛けた値を課金します。

二乗である点が重要です。これにより、極端に偏った1台の車両は、わずかに不均等な複数の車両よりもはるかに高いコストとなるため、ソルバーは最も偏りの大きい車両の是正に最も注力します。

この公平性コストは、他のすべてのコスト(移動時間、車両使用料、ペナルティ)とともに最小化されます。これを削減するために、ソルバーは車両間で停留所を再割り当てします。公平性ペナルティの低下が全体としてより良いソリューションをもたらすため、フリートの総移動距離がわずかに増加したとしても、停留所数の多い車両から少ない車両へ停留所を移動する場合があります。

例。 2台の車両と22件の停留所が、当初18件/4件に分割されているとします。フリート平均は11件であるため、一方は7件上回り、他方は7件下回っています。それぞれの差を二乗すると、これは高コストな不均衡です。パスイコライザーを有効にすると、ソルバーは12件/10件に再調整する場合があります。総移動距離はわずかに増加するかもしれませんが、配送リストははるかに均等になります。

設定 (Configuration)

"calculation_parameters": {
...
"use_path_equalizer": true,
"path_equalizer_weight": 1000,
...
}
calculation_parameters に指定してください

どちらのフィールドも model_parameters ではなく calculation_parameters に属します。API は未知のフィールドを拒否せず無視するため、誤ったオブジェクトに指定したリクエストはそのまま受理され、パスイコライザーが無効のまま計算されます。有効にしても結果が変わらないように見える場合は、まずこの点を確認してください。

パラメータデフォルト内容
use_path_equalizerbooleanfalseパスイコライザーのヒューリスティックを有効にするには true を設定します。
path_equalizer_weightnumber100停留所数が不均等な場合のペナルティの重み。値を大きくすると、均等な分割が重要であり、そのために高い移動コストを受け入れるべきであるとソルバーに伝わります。

適切な重みを見つけるには、通常、ご利用の運用におけるルートの公平性と全体的な効率のバランスを取るための実験が必要です。

稼働時間イコライザー (Working Hours Equalizer)

稼働時間イコライザーは、フリート全体のスケジュール枠を圧縮します。これにより、実務上はフリート全体の始業時刻と終業時刻が互いに近づきます。

何を最適化するのか (What it optimises)

working_hours_equalizer は、ソルバーの時間ディメンションの グローバルスパン (global span) に適用されるコスト係数です。

グローバルスパン = (全車両で最も遅いルート終了時刻) - (全車両で最も早いルート開始時刻)

ソルバーは、モデル内の他のすべてのコストに加えて working_hours_equalizer × グローバルスパン を支払います。したがって、値を大きくするほど、総移動時間や総距離の増加を受け入れてでも、共通の狭い時間枠へと強く誘導されます。

これは メイクスパン (makespan) の項であるため、何を行い、何を行わないのかを正確に理解しておく価値があります。

  • フリート全体の稼働日の 全体的な広がり にペナルティを課します。
  • ルートを1対1で比較することは なく、最も長いルートと最も短いルートの差に直接ペナルティを課すこともありません。

実務上の帰結として、注文の時間枠によってある車両が早く開始し、別の車両が遅く終了することが既に確定している場合、その2台がグローバルスパンを決定してしまうため、イコライザーが改善できる余地はほとんど残りません。

待機時間に関する注意点 (The waiting-time caveat)

ペナルティは各ルートではなく、フリート全体の時間枠に適用されます。そのため、ソルバーにはスパンを狭めるための第二の、より安価な手段が残されています。短いルートに作業を移す代わりに、その車両を単に待機させればよいのです。時間枠内の待機時間には、それ自体のコストは発生しません。

その結果、シフトの枠は揃って見えるものの、その中身の作業量は揃っていない計画が生まれることがあります。

cost_per_hour と併用してください

working_hours_equalizer と併せて、cost_per_hour を(model_parameters でグローバルに、または車両ごとに)設定してください。cost_per_hour は各車両 自身 のルート所要時間に価格を付けるため、短いルートを待機時間で埋めることが無料ではなくなり、ソルバーは実際の作業を再配分せざるを得なくなります。

設定 (Configuration)

"model_parameters": {
...
"working_hours_equalizer": 1000,
...
}
パラメータデフォルト内容
working_hours_equalizerintegernull時間ディメンションのフリート全体のグローバルスパンに適用されるコスト係数。値が大きいほど、移動コストに対して共通の狭い時間枠がより重視されます。

次の2つの場合、このパラメータは 無視されます

  • リクエストに含まれる車両が 1台のみ の場合(縮小すべき広がりが存在しません)
  • 値が 0 または null の場合(この項が完全に無効化されます)

普遍的に正しい重みは存在しません。これは同一の目的関数の中で移動時間・距離・車両コストと競合する相対的なコスト係数であるため、適切な値はご利用のリクエストにおける他の項の大きさに依存します。小さい値から始め、必要な範囲でシフト枠が狭まるまで徐々に上げていき、その過程で総移動コストを確認してください。

提供範囲 (Availability)

working_hours_equalizer は Stateless API のパラメータです。現時点では、Integration API の logistics_api_settings からは利用できません。

両者の併用 (Using both together)

2つの項は同一の目的関数に加算され、互いに競合しません。したがって、均等な配送リスト 狭いシフト枠の両方を実現したい場合は、両方を有効にすることが妥当です。ただし、いずれの項も全体的な効率と均等性を引き換えにし、それぞれの重みは移動コストだけでなく互いにも競合することに留意してください。重みは同時にではなく1つずつ上げ、変更ごとにフリートの総移動時間と総距離を確認してください。

警告

他のバランス調整の項と同様に、どちらのイコライザーも全体的な効率と均等性を引き換えにします。重みを上げるほど、フリートの総移動時間または総距離は増加すると想定してください。

プレイグラウンド (Playgrounds)

パスイコライザー (Path Equalizer)

2台の車両と2つのジョブクラスタを定義し、停留所数の均等な分割を促すために use_path_equalizer を高い重みで true に設定しています。 false に変更して、ソルバーがコストと距離のみに基づいてルートを割り当てる場合との違いを確認してみてください。

Loading...

稼働時間イコライザー (Working Hours Equalizer)

同じ2台の車両とジョブクラスタに対し、共通の狭いシフト枠を促すために working_hours_equalizer に大きな重みを設定し、併せて短いルートを待機時間で埋めることが無料にならないよう cost_per_hour を設定しています。 working_hours_equalizer0 に下げて、コストのみに基づいてソルバーが構築するスケジュールと比較してみてください。

Loading...