時間枠は、ルート上のイベントのタイミングを指定します。これらのイベントには、運転手のルートの開始と終了、集荷と配送の予定時刻、ルート全体の所要時間などがあります。
時間枠は、次のような目標をサポートできます。
- 指定された時間枠内で集荷と配送を完了することを優先 する。
- 全体的な営業時間内で業務を行えるようにルートを計画 する。
- 指定された時間枠内で車両がルートを開始して終了 するようにする。
構造
図に示すように、時間枠は次のように構成されています。
globalStartTimeとglobalEndTimeはShipmentModelのプロパティです。timeWindowsは次のプロパティです。Shipment内のpickups。Shipment内のdeliveries。
startTimeWindowsとendTimeWindowsはVehicleのプロパティです。
基本に関するチェックリスト
次のチェックリストは、時間枠に関連する潜在的な間違いを防ぐために必要な知識をまとめたものです。このリストは、リクエストの検証とレスポンスのトラブルシューティングに役立ちます。
VehiclestartTimeWindowsendTimeWindowsプロパティ
次の表に、グローバル時間枠のプロパティを示します。
| プロパティ | 形式 | 説明 |
|---|---|---|
globalStartTime |
Timestamp |
イベントの最も早い時刻。 |
globalEndTime |
Timestamp |
イベントの最も遅い時刻。 |
次の表に、配送と車両の時間枠のプロパティを示します。
| 親 | プロパティ | 形式 | 説明 |
|---|---|---|---|
Shipment.pickups |
timeWindows |
TimeWindow メッセージ タイプの配列。 |
配送の集荷の時間間隔を指定します。 |
Shipment.deliveries |
timeWindows |
配送の配達の時間間隔を指定します。 | |
Vehicle |
startTimeWindows |
車両の運行スケジュールの開始時刻を指定します。 | |
endTimeWindows |
車両の運行スケジュールの終了時刻を指定します。 |
次の表に、TimeWindow メッセージ
タイプのプロパティを示します。
| プロパティ | 形式 | 説明 |
|---|---|---|
startTime |
文字列(RFC3339 UTC「Zulu」形式) | 時間枠の開始時刻。 |
endTime |
文字列(RFC3339 UTC「Zulu」形式) | 時間枠の終了時刻。 |
例
このセクションでは、次の 3 種類の例について説明します。
- 時間枠の構造を示す**コードサンプル** 。
- 時間枠を使用してビジネス目標を達成する方法を示す シナリオ例。
- シナリオ例で設定した値を含む**リクエストの例** 。
コードサンプル
次のセクションでは、さまざまな種類の時間枠のコードサンプルを示します。
グローバル時間枠
次のコードサンプルは、グローバル時間枠の構造を示しています。
{ "model": { "globalStartTime": "YYYY-MM-DDTHH:MM:SSZ", "globalEndTime": "YYYY-MM-DDTHH:MM:SSZ", "shipments": [ ... ], "vehicles": [ ... ] } }
集荷と配送の時間枠
次のコードサンプルは、配送の集荷と配送の時間枠の構造を示しています。
{ "model": { "shipments": [ { "pickups": [ { "timeWindows": [ { "startTime": "YYYY-MM-DDTHH:MM:SSZ", "endTime": "YYYY-MM-DDTHH:MM:SSZ" } ] } ], "deliveries": [ { "timeWindows": [ { "startTime": "YYYY-MM-DDTHH:MM:SSZ", "endTime": "YYYY-MM-DDTHH:MM:SSZ" } ] } ] } ], "vehicles": [ ... ] } }
車両の時間枠
次のコードサンプルは、車両の時間枠の構造を示しています。
{ "model": { "shipments": [ ... ], "vehicles": [ { "startTimeWindows": [ { "startTime": "YYYY-MM-DDTHH:MM:SSZ", "endTime": "YYYY-MM-DDTHH:MM:SSZ" } ], "endTimeWindows": [ { "startTime": "YYYY-MM-DDTHH:MM:SSZ", "endTime": "YYYY-MM-DDTHH:MM:SSZ" } ] } ] } }
シナリオ例
このセクションでは、犬のデイケア サービスのビジネス シナリオを使用します。この例では、2 つの異なる家から犬を迎えに行き、送り届けるルートを最適化します。飼い主の迎車と降車の時間枠は同じです。オプティマイザーは、デイケア サービスの営業時間、顧客の特定の集荷と送り届けの時間枠、運転手の業務時間を考慮する必要があります。
この例では、リクエストのプロパティ値は次のとおりです。
| 親 | プロパティ | 値 | シナリオ |
|---|---|---|---|
ShipmentModel |
globalStartTime |
2023-01-13T07:00:00Z |
犬のデイケア サービスの開店時間を表します。この時間より前に集荷や配送を行うことはできません。 |
ShipmentModel |
globalEndTime |
2023-01-13T19:00:00Z |
犬のデイケア サービスの閉店時間を表します。この時間までにすべての集荷と配送を完了する必要があります。 |
Shipment.pickups |
timeWindows |
startTime:2023-01-13T07:30:00Z |
顧客の家から犬を迎えに行くことができる時間枠を定義します。この例では、両方の顧客に午前 7 時 30 分から午前 9 時までの間に受け取りが可能であることを伝えています。 |
endTime:2023-01-13T09:00:00Z |
|||
Shipment.deliveries |
timeWindows |
startTime:2023-01-13T17:00:00Z |
顧客の家に犬を送り届けることができる時間枠を定義します。この例では、両方の顧客に午後 5 時から午後 6 時 30 分までの間に犬を送り届けることを伝えています。 |
endTime:2023-01-13T18:30:00Z |
|||
Vehicle |
startTimeWindows |
startTime:2023-01-13T07:00:00ZendTime:2023-01-13T07:15:00Z |
車両の開始(午前 7 時~午前 7 時 15 分)と終了(午後 5 時~午後 5 時 15 分)の許容時間枠を定義します。 |
endTimeWindows |
startTime:2023-01-13T18:45:00ZendTime:2023-01-13T19:00:00Z |
次の図は、このルートに影響する時間枠を示しています。
このシナリオでは、図に示すように、時間枠は次のように機能します。
- グローバル時間枠は犬のデイケア サービスの営業時間を表し、他のすべての時間枠はこの時間枠内に収まる必要があります。
- 集荷と配送には、それぞれ 1 日の開始時と
終了時に独自の
timeWindowsがあります。 - 車両の
startTimeWindowsは、車両のオペレーターが作業を開始する必要がある時間枠を示します。endTimeWindowsは、1 日の作業を終了する必要がある別の時間枠を示します。 - 最初の
startTimeWindowの開始時刻と 最後のendTimeWindowの終了時刻は、車両の営業時間(この場合はグローバル時間枠と同じ)を定義します。
リクエストの例
次の例は、シナリオ例の時間枠の値を組み込んだ optimizeTours リクエスト
の構造を示しています。
{ "model": { "globalStartTime": "2023-01-13T07:00:00Z", "globalEndTime": "2023-01-13T19:00:00Z", "shipments": [ { "pickups": [ { "arrivalLocation": { "latitude": 37.8024, "longitude": -122.4058 }, "timeWindows": [ { "startTime": "2023-01-13T07:30:00Z", "endTime": "2023-01-13T09:00:00Z" } ] } ], "deliveries": [ { "arrivalLocation": { "latitude": 37.759773, "longitude": -122.427063 }, "timeWindows": [ { "startTime": "2023-01-13T17:00:00Z", "endTime": "2023-01-13T18:30:00Z" } ] } ] }, { "pickups": [ { "arrivalLocation": { "latitude": 37.7359, "longitude": -122.5011 }, "timeWindows": [ { "startTime": "2023-01-13T07:30:00Z", "endTime": "2023-01-13T09:00:00Z" } ] } ], "deliveries": [ { "arrivalLocation": { "latitude": 37.759773, "longitude": -122.427063 }, "timeWindows": [ { "startTime": "2023-01-13T17:00:00Z", "endTime": "2023-01-13T18:30:00Z" } ] } ] } ], "vehicles": [ { "startLocation": { "latitude": 37.759773, "longitude": -122.427063 }, "endLocation": { "latitude": 37.759773, "longitude": -122.427063 }, "costPerHour": 27, "startTimeWindows": [ { "startTime": "2023-01-13T07:00:00Z", "endTime": "2023-01-13T07:15:00Z" } ], "endTimeWindows": [ { "startTime": "2023-01-13T18:45:00Z", "endTime": "2023-01-13T19:00:00Z" } ] } ] } }
ソフト時間枠
時間枠は、softStartTime
と softEndTime を TimeWindow メッセージ タイプで定義することで、ソフト制約として使用できます。これにより、オプティマイザーは指定された時間枠から指定されたコストで逸脱できます。時間枠を厳守するよりも、全体的な最適化を優先します。
ソフト時間枠には、次の使用制限があります。
TimeWindowメッセージ タイプを使用しないため、globalStartTimeとglobalEndTimeには適用できません。- リストに
TimeWindowが 1 つしかない場合にのみ適用されます。
プロパティ
次の表に、時間枠のソフト制約プロパティを示します。
| プロパティ名 | 形式 | プロパティの説明 |
|---|---|---|
softStartTime |
タイムスタンプ | ソフト時間枠の開始時刻を指定します。この時間より前にイベントが発生すると、費用が発生します。 |
softEndTime |
タイムスタンプ | ソフト時間枠の終了時刻を指定します。この時間より後にイベントが発生すると、費用が発生します。 |
costPerHourBeforeSoftStartTime |
数値 | イベントが softStartTime より前に開始した場合に発生する 1 時間あたりの費用。softStartTime を使用する場合は、このプロパティが必要です。費用の実装方法について詳しくは、費用モデルの主要コンセプトをご覧ください。 |
costPerHourAfterSoftEndTime |
数値 | イベントが softEndTime より後に終了した場合に発生する 1 時間あたりの費用。softEndTime を使用する場合は、このプロパティが必要です。費用の実装方法について詳しくは、費用モデルの主要コンセプトをご覧ください。 |
コードサンプル
次の例は、ソフト制約プロパティの構造を示しています。TimeWindow
{ "softStartTime": "SOFT_START_TIME", "softEndTime": "SOFT_END_TIME", "costPerHourBeforeSoftStartTime": COST_BEFORE_START_TIME, "costPerHourAfterSoftEndTime": COST_AFTER_END_TIME }