Route Optimization API 會在相應的要求中傳回車輛的路線。視要求的屬性而定,系統可能會將出貨作業指派給車輛,或是略過這些商品。
OptimizeToursResponse
訊息 (REST、gRPC) 有兩個主要的頂層屬性:
routes[]
是每輛車的出貨路線。每個Route
都包含反映個別路線屬性的指標。metrics
是針對所有車輛和路線計畫的完整回應匯總指標。頂層指標包含與每路徑指標相同的屬性,而且匯總所有路徑的值。
視最佳化結果而定,部分房源可能不會一律填入:
skippedShipments[]
會列出尚未進行任何車輛的出貨作業。如果無法在指定限制內執行,或是出貨費用超過罰款,可以略過出貨。舉例來說,如果商品的上車或到貨的timeWindow
範圍很小,車輛可能無法在指定的時間範圍內,執行拜訪作業且成本低廉。validationErrors[]
會指定當要求的solvingMode
設為VALIDATE_ONLY
時,要求無效或無法解決的錯誤。在一般的DEFAULT_SOLVE
模式中,驗證錯誤會顯示錯誤訊息,而非回應主體。請注意,VALIDATE_ONLY
解決模式可一次回報多個錯誤,這對於快速偵錯要求非常實用。
路徑屬性
每個 routes[]
項目都是 ShipmentRoute
訊息 (REST、gRPC)。每個 ShipmentRoute
都代表在要求中為特定車輛指派的路線。與對應 Vehicle
相關的重要 ShipmentRoute
屬性包括:
vehicleIndex
是對應要求訊息中Vehicle
的索引 (從零開始)。當值為零時,REST 回應會省略這個屬性。vehicleStartTime
是車輛必須開始行駛路線的時間。vehicleEndTime
是車輛預計完成路線的時間。
routes
的回應會如下所示:
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
...
],
"transitions": [
...
],
"metrics": {
...
},
...
}
],
...
}
每個 ShipmentRoute
都包含一個由車輛完成的 visits
已排序清單。每個 Visit
(REST、gRPC) 都代表來自相應要求的 VisitRequest
(REST、gRPC)。重要的 Visit
屬性包括:
shipmentIndex
是這次造訪在相應要求中所屬的運送索引 (從零開始)。- 如果造訪是到上車地點,
isPickup
為 true,若造訪的是外送服務,則為 false。如果值為 false,REST 回應會略過這個屬性。 visitRequestIndex
是在Visit
代表的相應要求中,來自Shipment.pickups
或Shipment.deliveries
的VisitRequest
索引 (從零開始)。當值為零時,REST 回應會省略這個屬性。startTime
是造訪預計開始的時間。loadDemands
地圖載入類型,用於載入完成Visit
所需的數量。載客量為負值,代表外送人員的負載量減至最低。
Visit
的範例如下:
{
"routes": [
{
...
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
...
],
},
...
],
...
}
每個 ShipmentRoute
都包含一份已排序的 transitions
清單,代表特定車輛在 visits
之間的行程。重要的 Transition
訊息 (REST、gRPC) 屬性包括:
startTime
是車輛開始執行轉換的時間。travelDuration
是車輛完成轉場效果的時長。travelDistanceMeters
是車輛完成轉換所需的距離 (以公尺為單位)。trafficInfoUnavailable
表示是否有用於轉場的車流量資料。waitDuration
表示車輛在啟動下一個Visit
前,等待的閒置時間。這可能是由於下列Visit
的start_time
所致。totalDuration
是轉場效果的總時間長度,包括旅行、等待、中斷和延遲時間。vehicleLoads
地圖載入類型,用於載入車輛在這段過渡期間的載入量。
Transition
的範例如下:
{
"routes": [
{
...
"transitions": [
...
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
...
],
...
}
],
...
}
如需 vists
和 transitions
之間的關係說明,請參閱「Pickup 和 Delivery Stop Order Optimization」,以及 ShipmentRoute
參考說明文件 (REST、gRPC)。
指標屬性
Metrics
訊息 (REST、gRPC) 會摘要說明整個解決方案。以下提供幾個重要的 Metrics
屬性:
totalCost
是完成路徑所需的總費用。如要進一步瞭解費用,請參閱費用模式參數。usedVehicleCount
是解決方案中使用的車輛總數。如果最佳化器判斷車輛不需要使用,車輛可能會包含空白路徑。skippedMandatoryShipmentCount
是「必要」的略過運送數量。強制出貨不可指定在略過出貨時產生的penaltyCost
。如果必要運送效能在特定限制下無法發揮作用,則仍可略過這類項目。如要進一步瞭解費用,請參閱費用模式參數。
其他指標會回報為 AggregatedMetrics
訊息 (REST、gRPC)。AggregatedMetrics
訊息類型用於 Metrics.aggregatedRouteMetrics
屬性,ShipmentRoute.metrics
屬性 Metrics.aggregatedRouteMetrics
則包含 OptimizeToursResponse
中所有 ShipmentRoute
匯總的指標。每個 ShipmentRoute.metrics
屬性都包含該 ShipmentRoute
的指標。
重要的 AggregatedMetrics
屬性包括:
performedShipmentCount
是車輛在整個路線上執行的出貨次數。travelDuration
是車輛在大眾運輸完成路線時所需的總時間。waitDuration
是車輛在完成路線時等候的總時間。delayDuration
是車輛的總延遲時間。除非在要求中使用TransitionAttributes
,否則通常為零。breakDuration
是車輛在休息期間花費的總時間。visitDuration
是車輛在完成路線時花總時間。這實際上會針對指派給適用車輛的Visit
,將VisitRequest
的所有VisitRequest.duration
值加總,totalDuration
是完成車輛路線所需的總時間。travelDistanceMeters
是車輛完成路線時行經的總距離。maxLoads
會將載入類型對應至車輛路線任意時間點所承載的最大負載類型。
Metrics
訊息範例如下所示:
{
"routes": [
...
],
"metrics": {
"aggregatedRouteMetrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"usedVehicleCount": 1,
"earliestVehicleStartTime": "2024-02-13T00:00:00Z",
"latestVehicleEndTime": "2024-02-13T00:38:42Z",
"totalCost": 18.603,
"costs": {
"model.vehicles.cost_per_kilometer": 18.603
}
}
}
完整範例
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
{
"startTime": "2024-02-13T00:19:31Z",
"detour": "0s"
}
],
"transitions": [
{
"travelDuration": "0s",
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2024-02-13T00:00:00Z"
},
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
{
"travelDuration": "1151s",
"travelDistanceMeters": 9599,
"waitDuration": "0s",
"totalDuration": "1151s",
"startTime": "2024-02-13T00:19:31Z"
}
],
"metrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"routeCosts": {
"model.vehicles.cost_per_kilometer": 18.603
},
"routeTotalCost": 18.603
}
],
"metrics": {
"aggregatedRouteMetrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"usedVehicleCount": 1,
"earliestVehicleStartTime": "2024-02-13T00:00:00Z",
"latestVehicleEndTime": "2024-02-13T00:38:42Z",
"totalCost": 18.603,
"costs": {
"model.vehicles.cost_per_kilometer": 18.603
}
}
}