時間範圍會指定路線上事件的時間。這些事件包括司機路線的起點和終點、排定的取貨和送達時間,或是整條路線的時長。
時間範圍可支援下列目標:
- 優先在指定時間範圍內完成取貨和送貨。
- 規劃路線,在整體營業時間內營運。
- 確保車輛在指定時間範圍內開始和結束路線。
結構
如圖所示,時間範圍的結構如下:
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 |
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 點到 6 點 30 分之間送回狗狗。 |
endTime:2023-01-13T18:30:00Z |
|||
Vehicle |
startTimeWindows |
startTime:2023-01-13T07:00:00ZendTime:2023-01-13T07:15:00Z |
定義車輛可接受的開始時間範圍 (上午 7:00 至上午 7:15) 和結束時間範圍 (下午 5:00 至下午 5:15)。 |
endTimeWindows |
startTime:2023-01-13T18:45:00ZendTime: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 }