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
之間的關係,請參閱「取貨與交付停止訂單最佳化」,以及 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
}
}
}