車両ごとの最大トリップ数 (Maximum Trips Per Vehicle)
シナリオによっては、車両がデポから行うことができるトリップの数を制限する必要があります。たとえば、ドライバーがシフト内で実行できるルートの最大数がある場合や、特定の回数のツアー後に車両が再装填またはメンテナンスのためにデポに戻る必要がある場合があります。
この制約は、車両が複数のトリップを実行し、その間にデポに戻ることができる、ピックアップおよびドロップオフ (PDP) モデルを使用する運用に特に関連しています。
モデルは、ピックアップまたはドロップオフのいずれかのトリップ終了の設定をサポートしており、トリップとは何かを定義する柔軟性をさらに強化します。
仕組み (How It Works)
トリップの最大数を強制するには、Stateless API リクエストで2つの主要なパラメータを構成する必要があります。
number_of_trips: このパラメータはvehicleオブジェクトに設定され、車両が実行できるトリップの最大数を定義します。end_of_trip: true: このフラグは、ピックアップまたはドロップオフを表すnodeに設定する必要があります。これは、このノードを訪問するとトリップが完了することをオプティマイザーに通知し、制限に達していない場合、車両が新しいトリップを開始できるようにします。
トリップはいつ終わりますか? (When does a trip end?)
トリップがいつ終了するかを正確に理解することは、特にドロップオフ(戻り)とピックアップ(新しいジョブ)の両方が発生する可能性のあるデポの場所で、制約を正しく構成するために重要です。
- 配達がトリップを終了: 車両がデポで配達を実行する場合(そしてその特定の実行にそれ以上のアクションがない場合)、この配達はトリップの 終了 を示します。
- ピックアップがトリップを開始: 車両がデポでピックアップを実行する場合、このアクションは通常、新しいトリップの 開始 を示します。その後のドロップオフのいずれも、トリップの終了と見なすことができます。車両がピックアップのために戻ってきた場合、それは新しいトリップと見なされます。
- 同時配達とピックアップ: 車両がデポに到着して、商品(前の実行から)をドロップオフし、かつ 新しい商品(次の実行のため)をピックアップする場合:
- ドロップオフ は、現在のトリップ (Trip i) の 最後の停留所 を構成します。
- ピックアップ は、次のトリップ (Trip i+1) の 最初の停留所 を構成します。
車両が配達を完了し、end_of_trip: true とマークされたノードに戻ると、オプティマイザーはこれを1つの完了したトリップとしてカウントします。完了したトリップの合計数が number_of_trips 制限未満の場合にのみ、新しいトリップを車両に割り当てます。
バックホール対配達への影響 (Impact on Backhauls vs Deliveries)
特に number_of_trips が制限されている(例:1に設定されている)場合、end_of_trip: true がさまざまなロジスティクスモデルに与える影響を視覚化することが重要です。
- バックホール(デポ/DC への戻り): バックホールシナリオでは、車両は通常、ピックアップ(例:サプライヤーから)を実行し、配送センター (DC) に戻ってドロップオフします。ここで、DC ドロップオフは
end_of_trip: trueとしてマークされます。車両は1つの完全なサイクル(デポ -> サプライヤー -> DC)を完了し、これは 1つの完了したトリップ としてカウントされます。これが標準的な使用法です。 - 配達(ドロップオフ): すべて の顧客ドロップオフノードを
end_of_trip: trueとしてマークすることも許容されます。この構成は、これらの場所への連続した訪問(別々のトリップ)を禁止します。number_of_trips: 1の場合、車両は依然として配達実行(最適な場合は連続して複数のドロップオフを訪問)を実行できますが、これらの場所で構成される2番目の別々のトリップを開始することはできません。end_of_tripがtrueに設定されたノードのシーケンスの中断は、別のトリップと見なされる ことに注意してください。さらに、この構成は バックホールを防ぎます:最終的な配達がトリップの終了を示すため、その後のピックアップ(例:戻り荷物用)は、新しい(2番目の)トリップを開始すると見なされます。
関連する制約は、車両の ピックアップおよび/またはドロップオフ場所の最大数 です。
シミュレーション設定による Integration API でのトリップ終了 (End of Trip in Integration API through simulation settings)
Stateful API を使用する場合(例:注文アップロード経由)、シミュレーション の data オブジェクトに次のパラメータを追加することで、どの予約場所をトリップの終了と見なすべきかを指定できます。
is_dropoff_end_of_trip: この予約のドロップオフをトリップの終了と見なすことができる場合はtrueに設定します(トリップ数車両制約を制限)。is_pickup_end_of_trip: この予約のピックアップをトリップの終了と見なすことができる場合はtrueに設定します(トリップ数車両制約を制限)。
あるいは、すべてのノードを予約アップロード時にシミュレーションでマークする必要がない場合、ノード更新 API を使用して、選択したノードにフラグを設定できます。
例 (Example)
この制約を示す node_scheduler リクエストの JSON スニペットを次に示します。
- 車両は 1回のトリップ に制限されています。開始点は
partial_routeを使用してデポに明示的に設定されています。 - 3つの予約(A、B、C)があります。予約 A と B はデポに近く、1回のトリップでサービスを提供できます。予約 C は遠くにあり、後の時間枠があるため、A や B と同じトリップでサービスを提供することは不可能です。
- デポノードは
end_of_trip: trueでマークされています。
車両は1回のトリップに制限されているため、オプティマイザーは予約 A と B にサービスを提供し、予約 C を拒否します。
{
"current_time": "2025-11-21T08:00:00Z",
"engine_settings": {
"calculation_parameters": {
"calculations_mode": "sync",
"scheduling_mode": "prebook"
},
"model_parameters": {
"optimize_quantity": "total_time",
"booking_penalty": 100000
},
"routing_engine": {
"routing_engine_name": "osrme",
"url": "http://mapbox-osrm-proxy",
"road_network": "van"
}
},
"nodes": [
{
"uid": "depot",
"node_type": "depot",
"lat": 1.3521,
"lon": 103.8198,
"open_time_ts": "2025-11-21T08:00:00Z",
"close_time_ts": "2025-11-21T18:00:00Z",
"close_time_ts_dynamic": "2025-11-21T18:00:00Z",
"service_time": 0,
"demand": {},
"end_of_trip": true
},
{
"uid": "pickup_A",
"booking_uid": "booking_A",
"node_type": "pickup",
"lat": 1.306,
"lon": 103.832,
"open_time_ts": "2025-11-21T09:00:00Z",
"close_time_ts": "2025-11-21T10:00:00Z",
"close_time_ts_dynamic": "2025-11-21T10:00:00Z",
"service_time": 300,
"demand": { "units": 10 }
},
{
"uid": "dropoff_A",
"booking_uid": "booking_A",
"node_type": "dropoff",
"lat": 1.283,
"lon": 103.858,
"open_time_ts": "2025-11-21T10:00:00Z",
"close_time_ts": "2025-11-21T11:00:00Z",
"close_time_ts_dynamic": "2025-11-21T11:00:00Z",
"service_time": 300,
"demand": { "units": -10 }
},
{
"uid": "pickup_B",
"booking_uid": "booking_B",
"node_type": "pickup",
"lat": 1.32,
"lon": 103.9,
"open_time_ts": "2025-11-21T09:00:00Z",
"close_time_ts": "2025-11-21T10:00:00Z",
"close_time_ts_dynamic": "2025-11-21T10:00:00Z",
"service_time": 300,
"demand": { "units": 10 }
},
{
"uid": "dropoff_B",
"booking_uid": "booking_B",
"node_type": "dropoff",
"lat": 1.34,
"lon": 103.92,
"open_time_ts": "2025-11-21T10:00:00Z",
"close_time_ts": "2025-11-21T11:00:00Z",
"close_time_ts_dynamic": "2025-11-21T11:00:00Z",
"service_time": 300,
"demand": { "units": -10 }
},
{
"uid": "pickup_C",
"booking_uid": "booking_C",
"node_type": "pickup",
"lat": 1.449,
"lon": 103.801,
"open_time_ts": "2025-11-21T14:00:00Z",
"close_time_ts": "2025-11-21T15:00:00Z",
"close_time_ts_dynamic": "2025-11-21T15:00:00Z",
"service_time": 300,
"demand": { "units": 5 }
},
{
"uid": "dropoff_C",
"booking_uid": "booking_C",
"node_type": "dropoff",
"lat": 1.43,
"lon": 103.79,
"open_time_ts": "2025-11-21T15:00:00Z",
"close_time_ts": "2025-11-21T16:00:00Z",
"close_time_ts_dynamic": "2025-11-21T16:00:00Z",
"service_time": 300,
"demand": { "units": -5 }
}
],
"vehicles": [
{
"agent_id": "vehicle_1",
"start_time": "2025-11-21T08:00:00Z",
"end_time": "2025-11-21T18:00:00Z",
"capacity": { "units": 50 },
"number_of_trips": 1,
"partial_route": ["depot"]
}
]
}
プレイグラウンド (Playground)
以下のプレイグラウンドでこの制約を試すことができます。
number_of_trips: 1でシミュレーションを実行し、予約 C が拒否されるこ とを確認してください。number_of_tripsを2に変更して、再度実行します。これで、オプティマイザーは予約 C にサービスを提供するために2回目のトリップを実行できるようになります。