Route Optimization API 會在相應要求中傳回車輛的路線。視要求的屬性而定,系統會將運送作業指派給車輛,或可能略過。
OptimizeToursResponse 訊息 (REST、gRPC) 有兩個主要頂層屬性:
routes[]是每輛車輛的路線,以及指派給該車輛的運送作業。每個Route都包含反映個別路徑屬性的指標。metrics是所有車輛和路線規劃的完整回應匯總指標。頂層指標包含與每個路線指標相同的屬性,且值會匯總為所有路線。
部分屬性可能不會根據最佳化結果填入:
skippedShipments[]會列出未由任何車輛執行的運送作業。如果無法在指定限制內執行出貨作業,或是執行出貨作業的費用超過罰款費用,系統就會略過該出貨作業。舉例來說,如果貨物的提貨或送達地點範圍非常狹小,車輛可能無法在規定的時間內完成拜訪,或是在經濟效益上不划算。timeWindowvalidationErrors[]會指定錯誤,這些錯誤會導致要求無效,或在要求的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是這次造訪在對應要求中所屬的出貨,其索引從 0 開始。- 如果是上門取貨,
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。VisitRequesttotalDuration是完成車輛路線所需的總時間。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
}
}
}