La API de Route Optimization muestra las rutas de los vehículos en la solicitud correspondiente. Los envíos se asignan a vehículos o se pueden omitir según las propiedades de la solicitud.
Un mensaje OptimizeToursResponse
(REST, gRPC) tiene dos propiedades principales de nivel superior:
routes[]
son las rutas de cada vehículo con sus envíos asignados. CadaRoute
contiene métricas que reflejan las propiedades de esa ruta individual.metrics
son métricas agregadas para toda la respuesta, en todos los vehículos y planes de ruta. Las métricas de nivel superior contienen las mismas propiedades que las métricas por ruta, con valores agregados en todas las rutas.
Es posible que algunas propiedades no siempre se propaguen según los resultados de la optimización:
skippedShipments[]
muestra los envíos que no realiza ningún vehículo. Se puede omitir un envío si no se puede realizar dentro de las restricciones especificadas o si el costo de realizarlo supera su costo de penalización. Por ejemplo, si la recolección o entrega de un envío tiene untimeWindow
muy estrecho, es posible que no sea posible o rentable que un vehículo realice la visita durante el período requerido.validationErrors[]
especifica errores que hacen que la solicitud no sea válida o que sea imposible resolverla cuando elsolvingMode
de la solicitud está configurado comoVALIDATE_ONLY
. En el modoDEFAULT_SOLVE
normal, los errores de validación aparecerán en un mensaje de error en lugar del cuerpo de la respuesta. Ten en cuenta que el modo de solución deVALIDATE_ONLY
puede informar varios errores a la vez, lo que es útil para depurar solicitudes rápidamente.
Propiedades de la ruta
Cada entrada routes[]
es un mensaje ShipmentRoute
(REST, gRPC). Cada ShipmentRoute
representa la asignación de ruta para un vehículo en particular de la solicitud. Entre las propiedades importantes de ShipmentRoute
relacionadas con su Vehicle
correspondiente, se incluyen las siguientes:
vehicleIndex
es el índice basado en cero deVehicle
en el mensaje de solicitud correspondiente. Las respuestas REST omiten esta propiedad cuando el valor es cero.vehicleStartTime
es la hora en la que el vehículo debe comenzar su ruta.vehicleEndTime
es la hora en la que se espera que el vehículo termine su ruta.
En una respuesta, routes
se verá de la siguiente manera:
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
...
],
"transitions": [
...
],
"metrics": {
...
},
...
}
],
...
}
Cada ShipmentRoute
incluye una lista ordenada de visits
que completará el vehículo. Cada Visit
(REST, gRPC) representa un VisitRequest
(REST, gRPC) de la solicitud correspondiente. Entre las propiedades importantes de Visit
, se incluyen las siguientes:
shipmentIndex
es el índice basado en cero del envío al que pertenece esta visita en la solicitud correspondiente.isPickup
es verdadero cuando una visita es un retiro y falso cuando es una entrega. Las respuestas REST omiten esta propiedad cuando el valor es falso.visitRequestIndex
es el índice basado en cero deVisitRequest
deShipment.pickups
oShipment.deliveries
en la solicitud correspondiente que representaVisit
. Las respuestas REST omiten esta propiedad cuando el valor es cero.startTime
es la hora en la que se espera que comience la visita.loadDemands
asigna el tipo de carga a la cantidad de carga solicitada para completar elVisit
. Los importes de carga son negativos para las visitas de entrega, lo que representa la carga que se quita del vehículo.
Un ejemplo de Visit
se ve de la siguiente manera:
{
"routes": [
{
...
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
...
],
},
...
],
...
}
Cada ShipmentRoute
incluye una lista ordenada de transitions
que representan viajes entre visits
para un vehículo determinado. Entre las propiedades importantes del mensaje Transition
(REST, gRPC), se incluyen las siguientes:
startTime
es la hora en la que el vehículo comenzará a realizar la transición.travelDuration
es la duración durante la que el vehículo debe viajar para completar la transición.travelDistanceMeters
es la distancia en metros que el vehículo debe recorrer para completar la transición.trafficInfoUnavailable
indica si los datos de tráfico están disponibles para la transición.waitDuration
representa el tiempo de inactividad que el vehículo pasa esperando antes de poder iniciar su próximoVisit
. Esto puede deberse alstart_time
de la siguienteVisit
.totalDuration
es la duración total de la transición, incluidos los tiempos de desplazamiento, espera, pausa y demora.vehicleLoads
asigna el tipo de carga a la cantidad de carga que transporta el vehículo durante esta transición.
Un ejemplo de Transition
se ve de la siguiente manera:
{
"routes": [
{
...
"transitions": [
...
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
...
],
...
}
],
...
}
Para obtener más información sobre la relación entre vists
y transitions
, consulta Optimización de pedidos de paradas de carga y entrega y la documentación de referencia de ShipmentRoute
(REST, gRPC). Para obtener más información sobre las propiedades routePolyline
y routeToken
de un mensaje Transition
, consulta Polígonos de transición y tokens de ruta.
Propiedades de las métricas
El mensaje Metrics
(REST, gRPC) resume toda la solución.
Estas son algunas de las propiedades importantes de Metrics
:
totalCost
es el costo total incurrido para completar las rutas. Obtén más información sobre los costos en Parámetros del modelo de costos.usedVehicleCount
es la cantidad total de vehículos que se usan en la solución. Es posible que los vehículos tengan rutas vacías cuando el optimizador determina que su uso no es necesario.skippedMandatoryShipmentCount
es la cantidad de envíos omitidos que son “obligatorios”. Un envío obligatorio no especifica unpenaltyCost
que se incurre si se omite el envío. Los envíos obligatorios se pueden omitir si su rendimiento no es factible con las restricciones especificadas. Obtén más información sobre los costos en Parámetros del modelo de costos.
Las métricas adicionales se registran como mensajes AggregatedMetrics
(REST,
gRPC). El tipo de mensaje AggregatedMetrics
se usa para la propiedad Metrics.aggregatedRouteMetrics
y para la propiedad ShipmentRoute.metrics
. Metrics.aggregatedRouteMetrics
contiene métricas agregadas en todos los ShipmentRoute
de OptimizeToursResponse
. Cada propiedad ShipmentRoute.metrics
contiene métricas para ese ShipmentRoute
específico.
Entre las propiedades importantes de AggregatedMetrics
, se incluyen las siguientes:
performedShipmentCount
es la cantidad de envíos que realizan los vehículos en todas sus rutas.travelDuration
es el tiempo total que los vehículos pasan en tránsito mientras completan sus rutas.waitDuration
es el tiempo total que los vehículos pasan esperando mientras completan sus rutas.delayDuration
es el tiempo de demora total de los vehículos. Por lo general, es cero, a menos que se useTransitionAttributes
en la solicitud.breakDuration
es el tiempo total que los vehículos pasan en descansos mientras completan sus rutas.visitDuration
es el tiempo total que los vehículos dedican a realizar visitas mientras completan sus rutas. Esto es, en efecto, la suma de todos los valores deVisitRequest.duration
para losVisitRequest
correspondientes a losVisit
asignados al vehículo aplicable.totalDuration
es la duración total necesaria para completar las rutas de los vehículos.travelDistanceMeters
es la distancia total recorrida por los vehículos mientras completan sus rutas.maxLoads
asigna los tipos de carga a la cantidad máxima de carga que transportan los vehículos en cualquier punto de sus rutas.
Un mensaje Metrics
de ejemplo se ve de la siguiente manera:
{
"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
}
}
}
Ejemplo completo
Un ejemplo completo de la respuesta de la solicitud de Crea una solicitud se ve así:
{
"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
}
}
}