La API de Route Optimization muestra rutas para los vehículos en la solicitud correspondiente. Los envíos se asignan a los 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. CadaRoutecontiene métricas que reflejan las propiedades de esa ruta individual.metricsson 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 realizar el envío supera su costo de penalización. Por ejemplo, si la recolección o la entrega de un envío tiene unatimeWindowmuy estrecha, es posible que no sea posible ni rentable que un vehículo realice la visita durante el período requerido.validationErrors[]especifica los errores que hacen que la solicitud no sea válida o imposible de resolver cuando elsolvingModede la solicitud se establece enVALIDATE_ONLY. En el modoDEFAULT_SOLVEnormal, 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 resoluciónVALIDATE_ONLYpuede 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. Las propiedades importantes de ShipmentRoute relacionadas con su Vehicle correspondiente incluyen las siguientes:
vehicleIndexes el índice basado en cero delVehicleen el mensaje de solicitud correspondiente. Las respuestas de REST omiten esta propiedad cuando el valor es cero.vehicleStartTimees la hora en la que el vehículo debe comenzar su ruta.vehicleEndTimees 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. Las propiedades importantes de Visit incluyen las siguientes:
shipmentIndexes el índice basado en cero del envío al que pertenece esta visita en la solicitud correspondiente.isPickupes verdadero cuando una visita es una recolección y falso cuando es una entrega. Las respuestas de REST omiten esta propiedad cuando el valor es falso.visitRequestIndexes el índice basado en cero delVisitRequestdeShipment.pickupsoShipment.deliveriesen la solicitud correspondiente que representa elVisit. Las respuestas de REST omiten esta propiedad cuando el valor es cero.startTimees la hora en la que se espera que comience la visita.loadDemandsasigna el tipo de carga a la cantidad de carga que se necesita para completar laVisit. 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 el viaje entre visits para un vehículo determinado. Las propiedades importantes del mensaje Transition
(REST, gRPC) incluyen las siguientes:
startTimees la hora en la que el vehículo comenzará a realizar la transición.travelDurationes la duración durante la cual el vehículo debe viajar para completar la transición.travelDistanceMeterses la distancia en metros que el vehículo debe viajar para completar la transición.trafficInfoUnavailableindica si los datos de tráfico están disponibles para la transición.waitDurationrepresenta el tiempo de inactividad que el vehículo pasa esperando antes de que pueda comenzar su próximaVisit. Esto puede ocurrir debido alstart_timede la siguienteVisit.totalDurationes la duración total de la transición, incluidos los tiempos de viaje, espera, descanso y demora.vehicleLoadsasigna 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 del orden de las paradas de recolección y entrega y la ShipmentRoute
documentación de referencia (REST, gRPC). Para obtener más información sobre las
routePolyline y routeToken propiedades de un Transition mensaje, consulta
Polilíneas de transición y tokens de ruta.
Propiedades de las métricas
El mensaje Metrics (REST, gRPC) resume toda la solución.
Algunas propiedades importantes de Metrics incluyen las siguientes:
totalCostes el costo total en el que se incurrió para completar las rutas. Obtén más información sobre los costos en Parámetros del modelo de costos.usedVehicleCountes la cantidad total de vehículos que se usan en la solución. Los vehículos pueden tener rutas vacías cuando el optimizador determina que su uso no es necesario.skippedMandatoryShipmentCountes la cantidad de envíos omitidos que son "obligatorios". Un envío obligatorio no especifica unpenaltyCosten el que se incurre si se omite el envío. Los envíos obligatorios aún se pueden omitir si su rendimiento no es factible según las restricciones especificadas. Obtén más información sobre los costos en Parámetros del modelo de costos.
Las métricas adicionales se informan 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 en el OptimizeToursResponse. Cada ShipmentRoute.metrics
propiedad contiene métricas para ese ShipmentRoute específico.
Las propiedades importantes de AggregatedMetrics incluyen las siguientes:
performedShipmentCountes la cantidad de envíos que realizan los vehículos en todas sus rutas.travelDurationes el tiempo total que los vehículos pasan en tránsito mientras completan sus rutas.waitDurationes el tiempo total que los vehículos pasan esperando mientras completan sus rutas.delayDurationes el tiempo total de demora de los vehículos. Por lo general, es cero, a menos que se usenTransitionAttributesen la solicitud.breakDurationes el tiempo total que los vehículos pasan en descansos mientras completan sus rutas.visitDurationes el tiempo total que los vehículos pasan realizando visitas mientras completan sus rutas. Esto es, en efecto, la suma de todos losVisitRequest.durationvalores para losVisitRequestque corresponden a losVisits asignados al vehículo aplicable.totalDurationes la duración total necesaria para completar las rutas de los vehículos.travelDistanceMeterses la distancia total que recorren los vehículos mientras completan sus rutas.maxLoadsasigna los tipos de carga a la cantidad máxima de carga que transportan los vehículos en cualquier punto de sus rutas.
Un ejemplo de mensaje Metrics 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 de respuesta completa para la solicitud de Cómo crear una solicitud se ve de la siguiente manera:
{
"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
}
}
}