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

ドライバーの休憩

SWAT最適化APIと統合APIはどちらもドライバーの休憩をサポートしており、運用上のニーズや法的要件に合わせて動的に割り当てることができます。たとえば、ルート最適化では、他の設定された制約を尊重しながら、特定の運転時間の後に必要な休憩の長さを実行計画に組み込むことができます。2つの主なユースケースが適用され、最適化にドライバーの休憩を追加することをシミュレートする場合に相互に排他的な方法で使用できます。

  • 車両トリップの単一ドライバー休憩
  • 車両トリップの複数ドライバー休憩

以下で説明するパラメータは、車両に適用される最適化(ステートレス)APIペイロードの一部ですapi

{
"agent_id": "78e07d0f-abbc-4c7d-921e-54ba7bab1041",
"capacity": {
"goods": 13
},
"characteristics": {},
"lat": 1.3309909478620003,
"lon": 103.86845911685897,
// 単一および複数休憩の場合
"dynamic_break_duration": 3600,

// 単一休憩の場合
"dynamic_break_min_path_duration": 120,
"dynamic_break_start_time": "2019-08-24T14:15:22Z",
"dynamic_break_end_time": "2019-08-24T14:15:22Z",

// 複数休憩の場合
"dynamic_break_avg_time_between_breaks": 360,
"dynamic_break_max_latency": 0,
"max_pickup_locations": 10
}
ヒント

計画されたドライバーの休憩は、最終的にノードのスラックに追加され、ルート最適化の目的でノードでの標準的なスラック(待機時間)と見なされます。

dynamic_break_avg_time_between_breaksを特定の値に設定すると、単一または複数のドライバー休憩モードを使用するかどうかが決まります。この値が設定されていない場合、単一のドライバー休憩が適用されます。それ以外の場合は、複数の休憩モードが適用されます。ドライバーの休憩は、予約レベルではなくノードレベルで適用されます。

ドライバーの休憩は、車両に割り当てられたノード

でのみ許可されます。ドライバーの休憩に割り当てられた時間は、ノードのスラック時間に追加されます。休憩ノードは、パス内で最もスラックが大きいノードの1つから選択されます。休憩ノードは、パスの最初または最後になることはできません。スラックが同じ場合、休憩ノードはprebook_cvrptwモードではパスの中央にできるだけ近くなるように選択されるか、prebookモードでは可能な限り最小の需要を持つように選択されます。

警告

ドライバーの休憩はハードな制約です。割り当てられたドライバーの休憩を持つという要件が有効な場合、ドライバーの休憩によって想定される追加の時間制約を満たさなくなった場合、一部の予約が拒否される場合があります。

単一休憩

単一休憩シナリオでは、車両の1回のトリップ(最適化実行)で1回または休憩なしのみが許可されると想定しています。ドライバーの休憩は、次の4つのパラメータで管理されます。

  • dynamic_break_duration(秒単位)
  • dynamic_break_min_path_duration(秒単位)
  • dynamic_break_start_time(日付/タイムスタンプとして)
  • dynamic_break_end_time(日付/タイムスタンプとして)

dynamic_break_durationパラメータは、スケジュールする必要がある休憩の期間を指定します。dynamic_break_min_path_durationパラメータは、ドライバーの休憩をいつ、またはスケジュールするかどうかを制御します。休憩は、車両がdynamic_break_min_path_durationより長く走行した場合にのみスケジュールされます。

予想される車両のパス期間がdynamic_break_min_path_durationより短い場合、ドライバーの休憩は追加されません。ただし、パラメータがゼロの場合、車両のパス期間はゼロより大きいため、ドライバーの休憩は常にスケジュールされます。dynamic_break_min_path_durationは、計算中に、車両の合計移動時間、ノードのスラック時間、およびノードのサービス時間を考慮に入れます。

車両のパスにノードが1つしかない場合、ドライバーの休憩は追加されません。

dynamic_break_start_timeおよびdynamic_break_end_timeパラメータは、ドライバーの休憩をスケジュールできる時間枠を定義します。最大または最小の時間境界のみを指定することができ、その場合はその制約のみが適用されます。

複数休憩

複数休憩シナリオでは、1回のトリップ(最適化実行)で車両に複数1回、または休憩なしが割り当てられる可能性があると想定しています。この場合、ドライバーの休憩は3つのパラメータで管理されます。

  • dynamic_break_avg_time_between_breaks(秒単位)
  • dynamic_break_duration(秒単位)
  • dynamic_break_max_latency(秒単位)

dynamic_break_durationパラメータは、スケジュールする必要がある休憩の期間を指定します。計画された各休憩の期間は同じになります。

dynamic_break_avg_time_between_breaksパラメータは、車両が休憩なしで運転できる最大平均時間を管理します。計算には、累積的な車両の移動時間、ノードのスラック時間、およびノードのサービス時間が含まれます。休憩間の所定の最小間隔はないため、同じノードで複数の連続した休憩が可能です。

dynamic_break_max_latencyを使用すると、ドライバーの休憩の制約を、遅延を許容するより柔軟な制約に変換できます。この値は、休憩の最大許容遅延を指定します。

車両割り当てからの結果の解釈

最適化(ステートレス)APIでは、ドライバーの休憩スケジュールは、車両に割り当てられたすべてのノードを列挙する車両割り当てリスト内にありますapi

警告

予約には2つのノード(ピックアップとドロップオフ)との関連付けが必要です。ルート最適化のため、車両は複数のピックアップとドロップオフを実行する場合があります。したがって、車両ルートの割り当てはノードレベルで処理されます。最適化(ステートレス)APIは、予約ではなく、車両に割り当てられたノードのシーケンシャルリストを提供します。

次の例は、ノードで割り当てられた2つの休憩を示しています。slackで示される値は、その特定のノードでの合計待機時間を示し、このインスタンスでは2*<dynamic_break_duration>+node_slack値が組み込まれています。

{
"booking_uid": "some_booking", // このノードが属する予約UID
"dynamic_break": 2,
"lat": 30.0,
"location_code": null,
"location_name": null,
"lon": 130.0,
"matrix_timestamp": null,
"node_type": "pickup",
"scheduled_cumulative_distance": 0,
"scheduled_ts": "2022-08-01T14:34:18.600504+00:00",
"service_time": 0,
"slack": 18349.5,
"stop_id": "warehouse",
"uid": "some_uid" // このノードのUID
}

dynamic_break休憩がnullに設定されている場合、そのノードでは休憩はスケジュールされません。

よくある質問

一般的なユースケースをいくつか以下に示します。

**Q:**トリップ中にドライバーの休憩が1回しかないと仮定して、トリップが4時間を超えた場合にドライバーが30分の休憩を取らなければならない状況をどのようにモデル化しますか? **A:**ドライバーに割り当てられた車両には、次のパラメータが構成されている必要があります。計画された車両のパスが4時間未満の場合、休憩はスケジュールされません。さらに、開始時刻と終了時刻の制約が設定されていないため、休憩はパス上の任意の時点(ノードに添付)で割り当てることができます。

{
// ...
"dynamic_break_duration": 1800,
"dynamic_break_min_path_duration": 14400
// ...
}

**Q:**休憩時間(dynamic_break_duration)が30分、休憩間の時間(dynamic_break_avg_time_between_breaks)が4時間に設定されている場合、スラックとサービス時間が異なる複数のドライバー休憩を含むシナリオの例を教えてください。 **A:**次のタイムダイアグラムを参照してください。

ドライバー休憩シナリオ