时间窗口用于指定路线中事件的时间。这些事件可以包括司机的路线开始和结束时间、预定的取货和送货时间,或整个路线的持续时间。
时间窗口可支持以下目标:
- 优先在指定时间范围内完成取件和送件。
- 规划路线,以便在整个营业时间内运营。
- 确保车辆在指定的时间范围内开始和结束路线。
结构
如图所示,时间窗口的结构如下:
globalStartTime
和globalEndTime
是ShipmentModel
的属性timeWindows
是以下对象的属性:Shipment
内的pickups
。Shipment
内的deliveries
。
startTimeWindows
和endTimeWindows
是Vehicle
的属性。
基本功能核对清单
属性
下表介绍了全局时间窗口属性。
属性 | 格式 | 说明 |
---|---|---|
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
消息类型中定义 softStartTime
和 softEndTime
,可以将时间窗口用作软约束。这样一来,优化器就可以在指定费用范围内偏离指定的时间窗口,并在有利的情况下优先考虑总体优化,而不是严格遵守时间范围。
软时间窗口具有以下使用限制:
- 由于
globalStartTime
和globalEndTime
不使用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 }