时间窗口

时间窗口存在于 `ShipmentModel` 中、`Shipment` 中取货和送货对象内,以及 `Vehicle` 中。

时间窗口用于指定路线中事件的时间。这些事件可以包括司机的路线开始和结束时间、预定的取货和送货时间,或整个路线的持续时间。

时间窗口可支持以下目标:

  • 优先在指定时间范围内完成取件和送件
  • 规划路线,以便在整个营业时间内运营。
  • 确保车辆在指定的时间范围内开始和结束路线

结构

如图所示,时间窗口的结构如下:

  • globalStartTimeglobalEndTimeShipmentModel 的属性
  • timeWindows 是以下对象的属性:
    • Shipment 内的 pickups
    • Shipment 内的 deliveries
  • startTimeWindowsendTimeWindowsVehicle 的属性。

基本功能核对清单

属性

下表介绍了全局时间窗口属性。

属性 格式 说明
globalStartTime Timestamp 任何事件的最早时间。
globalEndTime Timestamp 任何事件的最晚时间。

下表介绍了货物和车辆中的时间窗口属性。

有子女 属性 格式 说明
Shipment.pickups timeWindows TimeWindow 消息类型数组。 指定货件取件的时间间隔。
Shipment.deliveries timeWindows 指定货件配送的时间间隔。
Vehicle startTimeWindows 指定车辆运营时间表的开始时间。
endTimeWindows 指定车辆运营时间表的结束时间。

下表介绍了 TimeWindow 消息类型的属性。

属性 格式 说明
startTime 字符串(RFC3339 世界协调时间 [UTC] 格式,即“祖鲁时”) 时间窗口的开始时间。
endTime 字符串(RFC3339 世界协调时间 [UTC] 格式,即“祖鲁时”) 时间窗口的结束时间。

示例

本部分涵盖了三种类型的示例:

  • 代码示例,用于说明时间窗口的结构。
  • 示例方案,展示了如何使用时间窗口来实现业务目标。
  • 请求示例,其中包含在示例场景中设置的值。

代码示例

以下部分展示了不同类型时间窗口的代码示例。

全局时间窗口

以下代码示例展示了全局时间窗口的结构:

{
  "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"
          }
        ]
      }
    ]
  }
}

示例场景

本部分使用狗狗日托业务场景。此示例优化了从两处不同住宅接送狗的路线,并且狗主人具有相同的接送时间窗口。优化器应考虑托儿所的营业时间、客户的特定接送时间段以及司机的上班时间。

在此示例中,请求中的媒体资源值如下所示:

有子女 属性 场景
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:00 之间可取货。
endTime:
2023-01-13T09:00:00Z
Shipment.deliveries timeWindows startTime:
2023-01-13T17:00:00Z
定义了将狗送到客户家中的可接受时间范围。在此示例中,您告知两位客户,您将在下午 5:00 到 6:30 之间送回他们的狗狗。
endTime:
2023-01-13T18:30:00Z
Vehicle startTimeWindows startTime:
2023-01-13T07:00:00Z
endTime:
2023-01-13T07:15:00Z
定义车辆启动(上午 7:00 至上午 7:15)和结束(下午 5:00 至下午 5:15)的可接受时间范围。
endTimeWindows startTime:
2023-01-13T18:45:00Z
endTime:
2023-01-13T19:00:00Z

下图显示了影响此路线的时间窗口。

多个时间轴分别表示全球时间窗口、取货和送货时间窗口、车辆开始和结束时间窗口以及车辆工作时间。

在此场景中,如图所示,时间窗口的运作方式如下:

  • 全局时间窗口表示狗狗日托的营业时间,所有其他时间窗口都必须位于此时间窗口内。
  • 取件和送货分别在一天开始时和结束时进行。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,可以将时间窗口用作软约束。这样一来,优化器就可以在指定费用范围内偏离指定的时间窗口,并在有利的情况下优先考虑总体优化,而不是严格遵守时间范围。

软时间窗口具有以下使用限制:

  • 由于 globalStartTimeglobalEndTime 不使用 TimeWindow 消息类型,因此无法将这些限制应用于它们。
  • 仅当列表中只有一个 TimeWindow 时适用。

属性

下表介绍了时间窗口的软约束属性。

属性名称 格式 属性说明
softStartTime 时间戳 指定软时间窗口的开始时间。如果活动发生在此时间之前,则会产生费用。
softEndTime 时间戳 指定软时间窗口的结束时间。如果在此时间之后发生事件,则会产生费用。
costPerHourBeforeSoftStartTime 数值 活动在 softStartTime 之前开始时每小时产生的费用。使用 softStartTime 时,必须提供此属性。如需详细了解如何实现费用,请参阅费用模型这一关键概念。
costPerHourAfterSoftEndTime 数值 活动在 softEndTime 之后结束时每小时产生的费用。使用 softEndTime 时,必须提供此属性。如需详细了解如何实现费用,请参阅费用模型这一关键概念。

代码示例

以下示例展示了 TimeWindow 消息类型的软约束属性的结构:

    {
      "softStartTime": "SOFT_START_TIME",
      "softEndTime": "SOFT_END_TIME",
      "costPerHourBeforeSoftStartTime": COST_BEFORE_START_TIME,
      "costPerHourAfterSoftEndTime": COST_AFTER_END_TIME
    }