時間ウィンドウ

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

時間枠は、ルート上のイベントのタイミングを指定します。これらのイベントには、ドライバーのルートの開始と終了、予定されている集荷と配達の時間、ルート全体の所要時間などがあります。

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

  • 指定された時間枠内で集荷と配達の完了を優先します。
  • ルートを計画して、営業時間内に運行します。
  • 指定された時間枠内で車両がルートを開始して終了するようにします。

構造

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

  • globalStartTimeglobalEndTimeShipmentModel のプロパティです。
  • timeWindows は次のプロパティです。
    • Shipment 内の pickups
    • Shipment 内の deliveries
  • startTimeWindowsendTimeWindowsVehicle のプロパティです。

Essentials のチェックリスト

プロパティ

次の表に、グローバル時間枠のプロパティを示します。

プロパティ 形式 説明
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 は、その日の作業を終了しなければならない時間枠を示します。
  • 最初の 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"
          }
        ]
      }
    ]
  }
}

ソフト タイム ウィンドウ

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

ソフト タイム ウィンドウには次の使用制限があります。

  • TimeWindow メッセージ タイプを使用しないため、globalStartTimeglobalEndTime には適用できません。
  • これらは、リストに 1 つの TimeWindow がある場合にのみ適用されます。

プロパティ

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

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