OptimizeToursRequest
訊息 (REST、gRPC) 包含多項與費用相關的屬性。這些費用參數共同代表要求的費用模式。成本模型會擷取許多要求的高階最佳化目標,例如:
- 優先選擇較快的路線
Vehicle
,而非較短的路線,反之亦然 - 判斷遞送
Shipment
的成本是否值得Shipment
完成的價值 - 僅在符合成本效益時,才在時間範圍內取貨和送貨
查看含費用的要求範例
{ "model": { "globalStartTime": "2023-01-13T16:00:00-08:00", "globalEndTime": "2023-01-14T16:00:00-08:00", "shipments": [ { "deliveries": [ { "arrivalLocation": { "latitude": 37.789456, "longitude": -122.390192 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 100.0 }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 5.0 }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 50.0 } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerHour": 40.0, "costPerKilometer": 10.0 } ] } }
Vehicle
費用屬性
Vehicle
訊息 (REST、gRPC) 具有多個費用屬性:
Vehicle.cost_per_hour
:代表每小時的車輛營運成本,包括交通、等待、拜訪和休息時間。Vehicle.cost_per_kilometer
:代表車輛每行駛一公里的成本。Vehicle.cost_per_traveled_hour
:代表車輛在運輸期間的營運成本,不包括等待、拜訪和休息時間。
最佳化工具會根據這些費用參數,在時間與行駛距離之間做出取捨。最佳化路線產生的費用會顯示在回應訊息中,如 metrics.costs
所示:
costPerHour
增加時,最佳化工具會嘗試尋找較快的路線,這些路線可能不是最短的路線。在這個範例中,最快的路線剛好也是最短的路線,因此成本參數的變更影響不大。
Shipment
費用屬性
Shipment
訊息 (REST、gRPC) 也有幾個費用參數:
Shipment.penalty_cost
代表略過運送所產生的費用。未設定貨件的penalty_cost
參數會使貨件成為必要貨件,也就是說,只有在指定限制無法完成貨件時,系統才會略過貨件。Shipment.VisitRequest.cost
代表特定取貨或送貨的費用,主要用於在單一貨件的多個取貨或送貨選項之間,進行費用取捨。
Shipment
費用參數使用的無量綱單位與 Vehicle
費用參數相同。完成 Shipment
所產生的費用超過其處罰費用,則任何 Vehicle
的路徑都不會包含 Shipment
,而是會顯示在回應訊息的 skipped_shipments
清單中。
ShipmentModel
費用屬性
ShipmentModel
訊息 (REST、gRPC) 包含單一費用屬性 globalDurationCostPerHour
。這項費用是根據所有車輛完成 ShipmentRoute
所需的總時間計算。提高 globalDurationCostPerHour
可優先完成所有出貨作業。
路徑最佳化回應的成本屬性
OptimizeToursResponse
訊息 (REST、gRPC) 具有代表完成 ShipmentRoute
時所產生費用的成本屬性。metrics.costs
和 metrics.totalCost
屬性代表回應中所有路徑產生的費用單位數。每個 routes
項目都有 routeCosts
和 屬性,代表該特定路線的費用。routeTotalCosts
查看含費用的範例要求回應
{ "routes": [ { "vehicleStartTime": "2023-01-14T00:00:00Z", "vehicleEndTime": "2023-01-14T00:28:22Z", "visits": [ { "isPickup": true, "startTime": "2023-01-14T00:00:00Z", "detour": "0s" }, { "shipmentIndex": 2, "isPickup": true, "startTime": "2023-01-14T00:02:30Z", "detour": "150s" }, { "startTime": "2023-01-14T00:08:55Z", "detour": "150s" }, { "shipmentIndex": 2, "startTime": "2023-01-14T00:21:21Z", "detour": "572s" } ], "transitions": [ { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:00:00Z" }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:02:30Z" }, { "travelDuration": "235s", "travelDistanceMeters": 795, "waitDuration": "0s", "totalDuration": "235s", "startTime": "2023-01-14T00:05:00Z" }, { "travelDuration": "496s", "travelDistanceMeters": 1893, "waitDuration": "0s", "totalDuration": "496s", "startTime": "2023-01-14T00:13:05Z" }, { "travelDuration": "171s", "travelDistanceMeters": 665, "waitDuration": "0s", "totalDuration": "171s", "startTime": "2023-01-14T00:25:31Z" } ], "metrics": { "performedShipmentCount": 2, "travelDuration": "902s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "800s", "totalDuration": "1702s", "travelDistanceMeters": 3353 }, "routeCosts": { "model.vehicles.cost_per_kilometer": 33.53, "model.vehicles.cost_per_hour": 18.911111111111111 }, "routeTotalCost": 52.441111111111113 } ], "skippedShipments": [ { "index": 1 } ], "metrics": { "aggregatedRouteMetrics": { "performedShipmentCount": 2, "travelDuration": "902s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "800s", "totalDuration": "1702s", "travelDistanceMeters": 3353 }, "usedVehicleCount": 1, "earliestVehicleStartTime": "2023-01-14T00:00:00Z", "latestVehicleEndTime": "2023-01-14T00:28:22Z", "totalCost": 57.441111111111113, "costs": { "model.vehicles.cost_per_kilometer": 33.53, "model.vehicles.cost_per_hour": 18.911111111111111, "model.shipments.penalty_cost": 5 } } }
在範例回應中,頂層 metrics.costs
為:
{
"metrics": {
...
"costs": {
"model.vehicles.cost_per_hour": 18.911111111111111,
"model.vehicles.cost_per_kilometer": 33.53,
"model.shipments.penalty_cost": 5
}
}
}
model.shipments.penalty_cost
值代表因貨運遭略過而產生的費用。skippedShipments
屬性會列出已略過的貨件。
在本例中,系統只會略過範例要求中的 model.shipments[1]
。model.shipments[1]
的違規費用為 5 個單位,與範例回應中的 model.shipments.penalty_cost
鍵相符。與 Vehicle
的 40.0 costPerHour
和 10.0 costPerKilometer
相比,這批貨物的低 penaltyCost
使得跳過這批貨物比完成這批貨物更具成本效益。
進階主題:費用和軟性限制
多個 OptimizeToursRequest
訊息 (REST、gRPC) 屬性代表軟性限制,也就是無法滿足時會產生費用的限制。
舉例來說,車輛 LoadLimit
(REST、gRPC) 限制具有 softMaxLoad
和 costPerUnitAboveSoftMax
屬性。這些費用加總後,會與超出 softMaxLoad
的負載單位成正比,因此只有在從成本角度來看有意義時,才會超出限制。
同樣地,TimeWindow
限制 (REST、gRPC) 具有 soft_start_time
和 soft_end_time
屬性,並會根據受限事件相對於 TimeWindow
的發生時間 (早或晚) 產生對應的 cost_per_hour_before_soft_start_time
和 cost_per_hour_after_soft_end_time
。
與所有成本模型參數一樣,軟性限制成本會以與其他成本參數相同的無因次單位表示。
LoadLimit
限制條件會在「負載需求和限制」中詳細說明。TimeWindow
限制會在「取貨和送貨時間範圍限制」一文中詳細說明。