時間ウィンドウ

時間枠は、`ShipmentModel`、`Shipment` の集荷と配達のオブジェクト、`Vehicle` に存在します。

時間枠は、ルート上のイベントのタイミングを指定します。これらのイベントには、運転手のルートの開始と終了、集荷と配送の予定時刻、ルート全体の所要時間などがあります。

時間枠は、次のような目標をサポートできます。

  • 指定された時間枠内で集荷と配送を完了することを優先 する。
  • 全体的な営業時間内で業務を行えるようにルートを計画 する。
  • 指定された時間枠内で車両がルートを開始して終了 するようにする。

構造

図に示すように、時間枠は次のように構成されています。

基本に関するチェックリスト

次のチェックリストは、時間枠に関連する潜在的な間違いを防ぐために必要な知識をまとめたものです。このリストは、リクエストの検証とレスポンスのトラブルシューティングに役立ちます。

: `startTimeWindows``endTimeWindows` です。これらは、車両がルートを開始して終了する時間間隔 をそれぞれ定義します 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:00Z
endTime:
2023-01-13T07:15:00Z
車両の開始(午前 7 時~午前 7 時 15 分)と終了(午後 5 時~午後 5 時 15 分)の許容時間枠を定義します。
endTimeWindows startTime:
2023-01-13T18:45:00Z
endTime:
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"
          }
        ]
      }
    ]
  }
}

ソフト時間枠

時間枠は、softStartTimesoftEndTimeTimeWindow メッセージ タイプで定義することで、ソフト制約として使用できます。これにより、オプティマイザーは指定された時間枠から指定されたコストで逸脱できます。時間枠を厳守するよりも、全体的な最適化を優先します。

ソフト時間枠には、次の使用制限があります。

プロパティ

次の表に、時間枠のソフト制約プロパティを示します。

プロパティ名 形式 プロパティの説明
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
    }