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 and Delivery Stop Order Optimization」和 ShipmentRoute
參考說明文件 (REST、gRPC)。如要進一步瞭解 Transition
訊息的 routePolyline
和 routeToken
屬性,請參閱「轉場多邊形和路線符記」。
指標屬性
Metrics
訊息 (REST、gRPC) 會總結整個解決方案。以下是 Metrics
的部分重要屬性:
totalCost
是完成路線時產生的總費用。如要進一步瞭解費用,請參閱「費用模型參數」。usedVehicleCount
是解決方案中使用的車輛總數。當最佳化工具判斷不需使用路線時,車輛可能會出現空白路線。skippedMandatoryShipmentCount
是「強制」略過的出貨量數量。強制出貨作業不會指定penaltyCost
,因此如果略過出貨作業,系統不會產生penaltyCost
。如果在指定限制下,強制運送作業無法執行,仍可略過。如要進一步瞭解費用,請參閱「成本模型參數」。
其他指標會以 AggregatedMetrics
訊息回報 (REST、gRPC)。AggregatedMetrics
訊息類型用於 Metrics.aggregatedRouteMetrics
屬性,而 ShipmentRoute.metrics
屬性 Metrics.aggregatedRouteMetrics
則包含 OptimizeToursResponse
中所有 ShipmentRoute
匯總的指標。每個 ShipmentRoute.metrics
屬性都包含該特定 ShipmentRoute
的指標。
重要的 AggregatedMetrics
屬性包括:
performedShipmentCount
是車輛在整個路線中運送的貨物數量。travelDuration
是車輛在完成路線時花費的總時間。waitDuration
是車輛在完成路線時等待的總時間。delayDuration
是車輛的總延遲時間。除非在要求中使用TransitionAttributes
,否則這個值通常為零。breakDuration
是車輛在完成路線時休息的總時間。visitDuration
是車輛在完成路線時,進行拜訪所花費的總時間。這實際上是所有VisitRequest.duration
值的總和,這些值對應至指派給適用車輛的Visit
。VisitRequest
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
}
}
}
完整範例
以下是「Construct a Request」要求的完整回應範例:
{
"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
}
}
}