時間範圍會指定路線上事件的時間。這些事件包括司機路線的起點和終點、排定的取貨和送達時間,或是整條路線的時長。
時間範圍可支援下列目標:
- 優先在指定時間範圍內完成取貨和送貨。
- 規劃路線,在整體營業時間內營運。
- 確保車輛在指定時間範圍內開始和結束路線。
結構
如圖所示,時間範圍的結構如下:
globalStartTime
和globalEndTime
是ShipmentModel
的屬性timeWindows
是下列項目的屬性:pickups
內。Shipment
deliveries
內。Shipment
startTimeWindows
和endTimeWindows
是Vehicle
的屬性。
基本檢查清單
屬性
下表說明全域時間範圍屬性。
屬性 | 格式 | 說明 |
---|---|---|
globalStartTime |
Timestamp |
任何活動的最早時間。 |
globalEndTime |
Timestamp |
任何事件的最新時間。 |
下表說明貨件和車輛中的時間範圍屬性。
父項 | 屬性 | 格式 | 說明 |
---|---|---|---|
Shipment.pickups |
timeWindows |
TimeWindow 訊息類型陣列。 |
指定取貨時間間隔。 |
Shipment.deliveries |
timeWindows |
指定貨件運送的時間間隔。 | |
Vehicle |
startTimeWindows |
指定車輛營運時間表的開始時間。 | |
endTimeWindows |
指定車輛營運時間表的結束時間。 |
下表說明 TimeWindow
訊息類型的屬性。
屬性 | 格式 | 說明 |
---|---|---|
startTime |
字串 (RFC3339 世界標準時間「Zulu」格式) | 時間範圍的開始時間。 |
endTime |
字串 (RFC3339 世界標準時間「Zulu」格式) | 時間範圍的結束時間。 |
範例
本節將介紹三種範例:
程式碼範例
以下各節顯示不同類型時間範圍的程式碼範例。
全域時間範圍
下列程式碼範例顯示全域時間區間的結構:
{ "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 }