El mensaje OptimizeToursRequest
(REST, gRPC) contiene varias propiedades relacionadas con los costos. En conjunto, estos parámetros de costo representan el modelo de costos de la solicitud. El modelo de costos captura muchos de los objetivos de optimización de alto nivel de la solicitud, como los siguientes:
- Priorizar las rutas
Vehicle
más rápidas por sobre las más cortas o viceversa - Decidir si el costo de entregar un
Shipment
vale la pena en función del valor de la finalización delShipment
- Realizar retiros y entregas dentro de períodos solo cuando sea rentable
Consulta un ejemplo de solicitud con costos
{ "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 } ] } }
Propiedades de costos de Vehicle
El mensaje Vehicle
(REST, gRPC) tiene varias propiedades de costo:
Vehicle.cost_per_hour
: Representa el costo de operar un vehículo por hora, incluidos los tiempos de tránsito, espera, visita y descanso.Vehicle.cost_per_kilometer
: Representa el costo por kilómetro recorrido por el vehículo.Vehicle.cost_per_traveled_hour
: Representa el costo de operar un vehículo solo mientras está en tránsito, sin incluir los tiempos de espera, visita y descanso.
Estos parámetros de costo permiten que el optimizador realice compensaciones entre el tiempo y la distancia recorrida. Los costos que genera la ruta optimizada aparecen en el mensaje de respuesta como metrics.costs
:
A medida que costPerHour
aumenta, el optimizador intenta encontrar rutas más rápidas que tal vez no sean las más cortas. En este ejemplo, la ruta más rápida resulta ser la más corta, por lo que los cambios en los parámetros de costo tienen poco efecto.
Propiedades de costos de Shipment
El mensaje Shipment
(REST, gRPC) también tiene varios parámetros de costo:
Shipment.penalty_cost
representa el costo en el que se incurre por omitir el envío. No establecer el parámetropenalty_cost
de un envío hace que el envío sea obligatorio, lo que significa que solo se omitirá si no se puede completar según las restricciones especificadas.Shipment.VisitRequest.cost
representa el costo de un retiro o una entrega específicos, y se usa principalmente para permitir compensaciones de costos entre varias opciones de retiro o entrega para un solo envío.
Los parámetros de costo de Shipment
usan las mismas unidades adimensionales que los parámetros de costo de Vehicle
. Si el costo incurrido para completar un Shipment
supera su costo de penalización, el Shipment
no se incluye en la ruta de ningún Vehicle
y, en cambio, aparece en la lista de skipped_shipments
en el mensaje de respuesta.
Propiedades de costos de ShipmentModel
El mensaje ShipmentModel
(REST, gRPC) incluye una sola propiedad de costo, globalDurationCostPerHour
. Este costo se incurre en función del tiempo total que requieren todos los vehículos para completar sus ShipmentRoute
s. El aumento de globalDurationCostPerHour
prioriza la finalización anticipada de todos los envíos.
Propiedades de costos de la respuesta de Route Optimization
El mensaje OptimizeToursResponse
(REST, gRPC) tiene propiedades de costo que representan los costos incurridos en el proceso de completar ShipmentRoute
s.
Las propiedades metrics.costs
y metrics.totalCost
representan la cantidad de unidades de costo incurridas en todas las rutas de la respuesta. Cada entrada de routes
tiene propiedades routeCosts
y routeTotalCosts
que representan los costos de esa ruta específica.
Consulta una respuesta a la solicitud de ejemplo con costos
{ "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 } } }
En la respuesta de ejemplo, los metrics.costs
de nivel superior son los siguientes:
{
"metrics": {
...
"costs": {
"model.vehicles.cost_per_hour": 18.911111111111111,
"model.vehicles.cost_per_kilometer": 33.53,
"model.shipments.penalty_cost": 5
}
}
}
El valor model.shipments.penalty_cost
representa el costo en el que se incurrió debido a los envíos omitidos. La propiedad skippedShipments
enumera los envíos que se omitieron.
En este ejemplo, solo se omite model.shipments[1]
en la solicitud de ejemplo.
model.shipments[1]
tiene un costo de penalización de 5 unidades, lo que coincide con la clave model.shipments.penalty_cost
total en la respuesta de ejemplo. El penaltyCost
bajo del envío en comparación con el Vehicle
de 40.0 costPerHour
y 10.0 costPerKilometer
hace que sea más rentable omitir el envío que completarlo.
Tema avanzado: Costos y restricciones flexibles
Varias propiedades de mensajes OptimizeToursRequest
(REST, gRPC) representan restricciones flexibles, que son restricciones que generan un costo cuando no se pueden satisfacer.
Por ejemplo, las restricciones de vehículo LoadLimit
(REST, gRPC) tienen propiedades softMaxLoad
y costPerUnitAboveSoftMax
. En conjunto, estos generan un costo proporcional a las unidades de carga que superan softMaxLoad
, lo que permite que se supere el límite solo si tiene sentido desde el punto de vista del costo.
Del mismo modo, las restricciones de TimeWindow
(REST, gRPC) tienen propiedades soft_start_time
y soft_end_time
, con cost_per_hour_before_soft_start_time
y cost_per_hour_after_soft_end_time
correspondientes que se generan según qué tan temprano o tarde se produce el evento restringido con respecto a TimeWindow
.
Al igual que con todos los parámetros del modelo de costos, los costos de las restricciones flexibles se expresan en las mismas unidades adimensionales que otros parámetros de costos.
Las restricciones de LoadLimit
se abordan en detalle en Load Demands and Limits. Las restricciones de TimeWindow
se abordan en detalle en Restricciones de ventanas de hora de retiro y entrega.