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

予約ペナルティ (Booking Penalty)

予約ペナルティ(「注文ペナルティ」とも呼ばれます)は、特定の注文に割り当てる整数として設定された人工的なコストです。このペナルティは、最適化エンジンがその注文を履行しないことを選択した場合にのみ適用され、「オファーなし」のステータスになります。

この機能により、オプティマイザーは注文を履行するメリットと関連コストをインテリジェントに比較検討できます。

目的 (Purpose)

典型的な車両ルーティング問題 (VRP) では、すべての注文を履行することが目的です。しかし、現実世界のロジスティクスでは、すべての注文にサービスを提供することが不可能またはコストがかかりすぎることがよくあります。たとえば、注文が遠すぎる、すべての車両が満杯である、または配達時間枠が狭すぎる場合があります。

「すべての注文にサービスを提供する」ことを厳格で譲らないルールとして扱うのではなく(最適化プロセスが失敗する可能性があります)、予約ペナルティはそれを柔軟な制約に変えます。基本的に、オプティマイザーに次のように伝えています。

「この注文を含めるように最善を尽くしてください。それを含めるためのルーティングコストがペナルティ値を超える場合は、割り当てられないままにして、代わりにペナルティを『支払う』ことが許可されています。」

仕組み: コストのトレードオフ (How It Works: The Cost Trade-Off)

最適化エンジンの主な目的は、絶対的に最も低い総コストを持つソリューションを発見することです。この総コストは、ルーティング費用(燃料、時間、車両使用料など)と適用されるペナルティを組み合わせたものです。

割り当てられたペナルティを持つ注文を評価するとき、オプティマイザーは簡単な比較を行います。

  • サービスコスト: この注文を含めるために必要な追加のルーティングコストはいくらですか?(例:追加の時間と燃料のための500ユニット)
  • スキップコスト: 予約ペナルティの値はいくらですか?(例:1000ユニット)

次に、オプティマイザーはより安価なオプションを選択します。

  • シナリオ 1: 注文がサービスされる。サービスコスト(500ユニット)がスキップコスト(1000ユニット)よりも低い場合、オプティマイザーは注文を履行します。ルーティングコストの500ユニットがソリューションの総コストに追加されます。
  • シナリオ 2: 注文がサービスされない(「オファーなし」)。サービスコストが非常に高い場合(例:1500ユニット、おそらくまったく新しい車両が必要なため)、このコストがスキップコスト(1000ユニット)を超える場合、オプティマイザーは注文を履行しません。1000ユニットのペナルティがソリューションの総コストに追加されます。

1000ユニットのペナルティを支払う方が1500ユニットのルーティングコストが発生するよりも経済的であるため、この結果はオプティマイザーにとって有益です。

ヒント

この設定を使用して、配達のコストと配達しないコストの間のトレードオフを制御します。正確な値は、解決されている問題によって異なります。

主要原則 (Key Principle)

ペナルティ値が高いほど、注文がサービスされる可能性が高くなります。

  • 低いペナルティは、オプティマイザーに「些細な不便を引き起こす場合でも、この注文をスキップしてもかまいません」と示します。
  • 非常に高いペナルティは、オプティマイザーに「新しい車両を追加したり、非常に非効率的なルートを作成する必要がある場合でも、コストに関係なくこの注文を履行する必要があります」と通知します。

API での実装 (Implementation in API)

booking_penalty パラメータは、Stateless API の各 ノード ごと、または Integration APIシミュレーション設定 で構成可能です。シミュレーション設定では、注文レベルで明示的に設定されていない限り、すべての注文にデフォルト値が適用されます。

構成例 (Example Configuration)

node_scheduler リクエストの JSON スニペットを次に示します。この例では、さまざまなペナルティを持つ3つのドロップオフノードが定義されています。

  • 完了しなければならない VIP 配達に対する 高いペナルティ (1,000,000)。
  • 非効率的な場合はスキップできる、遠く離れた低優先度の注文に対する 低いペナルティ (100)。
  • 標準的な配達に対する 中程度のペナルティ (5,000)。

オプティマイザーは、サービスを提供することで総移動時間とコストが大幅に増加する場合、低ペナルティの注文をドロップする可能性があります。

{
"current_time": "2024-07-10T08:00:00+00:00",
"engine_settings": {
"calculation_parameters": {
"calculations_mode": "sync",
"scheduling_mode": "prebook_cvrptw"
},
"model_parameters": {
"optimize_quantity": "total_time"
},
"routing_engine": {
"routing_engine_name": "osrme",
"url": "http://mapbox-osrm-proxy",
"road_network": "van"
}
},
"nodes": [
{
"uid": "dropoff_high_penalty",
"booking_uid": "booking_1",
"node_type": "dropoff",
"lat": 1.280097,
"lon": 103.889129,
"open_time_ts": "2026-01-01T09:00:00+00:00",
"close_time_ts": "2026-01-01T12:00:00+00:00",
"service_time": 300,
"demand": { "units": 10 },
"penalty": 1000000,
"location_name": "VIP Dropoff - Marina Bay"
},
{
"uid": "dropoff_low_penalty",
"booking_uid": "booking_2",
"node_type": "dropoff",
"lat": 1.4495,
"lon": 103.8015,
"open_time_ts": "2026-01-01T09:00:00+00:00",
"close_time_ts": "2026-01-01T12:00:00+00:00",
"service_time": 300,
"demand": { "units": 10 },
"penalty": 100,
"location_name": "Low Priority Dropoff - Woodlands"
},
{
"uid": "dropoff_medium_penalty",
"booking_uid": "booking_3",
"node_type": "dropoff",
"lat": 1.3069,
"lon": 103.8434,
"open_time_ts": "2026-01-01T09:00:00+00:00",
"close_time_ts": "2026-01-01T12:00:00+00:00",
"service_time": 300,
"demand": { "units": 10 },
"penalty": 5000,
"location_name": "Standard Dropoff - Orchard"
},
{
"uid": "depot_start_node",
"node_type": "point",
"lat": 1.3521,
"lon": 103.8198,
"open_time_ts": "2026-01-01T08:00:00+00:00",
"close_time_ts": "2026-01-01T18:00:00+00:00",
"service_time": 0,
"demand": {}
}
],
"vehicles": [
{
"agent_id": "vehicle_1",
"lat": 1.3521,
"lon": 103.8198,
"start_time": "2026-01-01T08:00:00+00:00",
"end_time": "2026-01-01T18:00:00+00:00",
"capacity": { "units": 50 },
"partial_route": ["depot_start_node"]
}
]
}

プレイグラウンド (Playground)

以下のプレイグラウンドを使用して、予約ペナルティ コンセプトを試すことができます。この例では、異なるペナルティ値を持つ3つのドロップオフノードが設定されています。

  • オプティマイザーが、地理的に効率が悪いため、低ペナルティの予約を拒否することを選択する方法を観察してください。
  • 「Low Priority Dropoff」の penalty を非常に高い値(例:1000000)に増やし、移動コストが高いにもかかわらず、オプティマイザーがルートにそれを含めることをどのように強制されるかを確認してください。
Loading...