Page Summary
-
Route Optimization's cost model, defined by various cost parameters, guides the optimization process by enabling trade-offs between factors like time, distance, and shipment completion.
-
Cost parameters, expressed in dimensionless units, are assigned to
VehicleandShipmentproperties, allowing users to prioritize route characteristics and shipment importance. -
Shipmentpenalty costs influence whether a shipment is included in a route; if the cost to complete a shipment exceeds its penalty cost, it may be skipped. -
The
OptimizeToursResponsemessage provides cost breakdowns, includingmetrics.costsandrouteCosts, offering insights into the cost efficiency of the generated routes. -
Soft constraints, such as
LoadLimitandTimeWindow, introduce cost penalties when violated, allowing for flexibility while still encouraging adherence to limits.
This example shows how to use cost parameters to get a cost-effective route.
For a complete conceptual overview, see the Cost model key concept document.
Example request
The following example demonstrates a scenario where one vehicle must deliver
three shipments. The vehicle has associated costs for time and distance, and
each shipment has a penaltyCost
that is incurred if the shipment is
skipped.
This example request contains the following cost-related parameters:
-
shipments[0]with apenaltyCostof 100.0. -
shipments[1]with apenaltyCostof 5.0. -
shipments[2]with apenaltyCostof 50.0. -
vehicles[0]with acostPerHourof 40.0 and acostPerKilometerof 10.0.
See an example request with costs
{ "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 } ] } }
Example response
The response shows that the optimizer creates a route that performs two of the
three shipments. The third shipment is skipped because its penaltyCost
is
lower than the calculated vehicle costs for pickup and delivery.
See a response to the example request with costs
{ "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 } } }
The following fields show how the costs are calculated in the response:
-
routeCostsbreaks down the operational costs for a specific route, which in this case are:-
model.vehicles.cost_per_kilometer: 33.53. -
model.vehicles.cost_per_hour: 18.91.
-
- The
routeTotalCost(52.44) is the sum of the costs listed inrouteCosts. - At the top level of the response, the
costsobject summarizes every cost incurred in the solution. This includes the operational costs from all vehicle routes plus any penalties, such as themodel.shipments.penalty_cost(5.0) for the skipped shipment. - The final
totalCost(57.44) represents the grand total for the solution, which is the sum of therouteTotalCostfrom all vehicles and all penalty costs. In this case, it is 52.44 + 5.0.

