El mensaje OptimizeToursRequest
(REST, gRPC) contiene una serie de 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 rutas
Vehicle
más rápidas por sobre rutas más cortas (o viceversa) - Decidir si el costo de entregar una
Shipment
vale el valor de la finalización de laShipment
- Realizar retiros y entregas dentro de los períodos solo cuando lo hace es 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 } ] } }
Vehicle
propiedades de costo
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 transporte público, 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 se encuentra en tránsito, sin incluir los tiempos de espera, visitas ni pausas.
Estos parámetros de costo permiten que el optimizador haga concesiones entre el tiempo y la distancia recorrida. Los costos generados por la ruta optimizada aparecen en el mensaje de respuesta como metrics.costs
:
A medida que aumenta costPerHour
, el optimizador intenta encontrar rutas más rápidas que pueden no ser las más cortas. En este ejemplo, la ruta más rápida es la más corta, por lo que los cambios en los parámetros de costo tienen poco efecto.
Shipment
propiedades de costo
El mensaje Shipment
(REST, gRPC) también tiene varios parámetros de costos:
Shipment.penalty_cost
representa el costo en el que se incurre por omitir el envío.Shipment.VisitRequest.cost
representa el costo de un retiro o una entrega específicos, que se usa principalmente para habilitar las compensaciones de costos entre varias opciones de retiro o entrega para un solo envío.
Los parámetros de costo Shipment
usan las mismas unidades sin dimensiones que los parámetros de costo Vehicle
. El costo incurrido por completar una Shipment
supera su costo de penalización, el Shipment
no se incluye en ninguna ruta de Vehicle
y, en su lugar, aparece en la lista skipped_shipments
del mensaje de respuesta.
ShipmentModel
propiedades de costo
El mensaje ShipmentModel
(REST, gRPC) incluye una sola propiedad de costo, globalDurationCostPerHour
. Este costo se genera en función del tiempo total necesario para que todos los vehículos completen sus ShipmentRoute
. Si aumentas
globalDurationCostPerHour
, se priorizará la finalización anticipada de todos los envíos.
Propiedades del costo de respuesta de la optimización de rutas
El mensaje OptimizeToursResponse
(REST, gRPC) tiene propiedades de costo que representan los costos generados en el proceso de completar ShipmentRoute
.
Las propiedades metrics.costs
y metrics.totalCost
representan la cantidad de unidades de costo que se generan en todas las rutas de la respuesta. Cada entrada routes
tiene propiedades routeCosts
y routeTotalCosts
que representan los costos de esa ruta específica.
Ver 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, las metrics.costs
de nivel superior son las 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 generado debido a los envíos omitidos. La propiedad skippedShipments
enumera qué envíos 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, que coincide con el total de la clave model.shipments.penalty_cost
en la respuesta de ejemplo. El precio bajo del
penaltyCost
en comparación con los 40.0 de costPerHour
y los 10.0
costPerKilometer
de Vehicle
hace que sea más rentable omitir el envío que
completarlo.
Tema avanzado: costos y limitaciones leves
Varias propiedades de mensaje OptimizeToursRequest
(REST, gRPC) representan restricciones suaves, que son restricciones que generan un costo cuando no se pueden satisfacer.
Por ejemplo, las restricciones de LoadLimit
del vehículo (REST, gRPC) tienen propiedades softMaxLoad
y costPerUnitAboveSoftMax
. Juntos, estos generan un costo proporcional a las unidades de carga que exceden softMaxLoad
, lo que permite que se supere el límite solo si hacerlo tiene sentido desde el punto de vista del costo.
De manera similar, las restricciones TimeWindow
(REST, gRPC) tienen las propiedades soft_start_time
y soft_end_time
, con las correspondientes cost_per_hour_before_soft_start_time
y cost_per_hour_after_soft_end_time
que se generan según qué tan temprano o tarde se produce el evento restringido en relación con TimeWindow
.
Al igual que con todos los parámetros de los modelos de costos, los costos de restricciones flexibles se expresan en las mismas unidades sin dimensiones que otros parámetros de costo.
Las restricciones de LoadLimit
se abordan en detalle en Solicitudes y límites de carga. Las restricciones de TimeWindow
se abordan en detalle en Restricciones de los períodos de retiro y entrega.