Interpreta la respuesta

La API de Route Optimization muestra rutas para 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 de nivel superior principales:

  • routes[] son las rutas de cada vehículo con sus envíos asignados. Cada Route contiene métricas que reflejan propiedades de esa ruta individual.
  • metrics son métricas agregadas de 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 en función de los resultados de la optimización:

  1. skippedShipments[] enumera 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 para realizarlo supera su costo de penalización. Por ejemplo, si el retiro o la entrega de un envío tiene un timeWindow muy limitado, es posible que no sea posible o rentable que un vehículo realice la visita durante el período requerido.
  2. validationErrors[] especifica los errores que hacen que la solicitud no sea válida o imposible de resolver cuando el solvingMode de la solicitud se establece en VALIDATE_ONLY. En el modo DEFAULT_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 resolución de VALIDATE_ONLY puede informar varios errores a la vez, lo que es útil para depurar solicitudes con rapidez.

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 específico 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 del Vehicle en el mensaje de solicitud correspondiente. Las respuestas de REST omiten esta propiedad cuando el valor es cero.
  • vehicleStartTime es la hora a la que el vehículo debe comenzar su recorrido.
  • vehicleEndTime es la hora a 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 Visit importantes incluyen lo siguiente:

  • shipmentIndex es el índice basado en cero del envío al que pertenece esta visita en la solicitud correspondiente.
  • El valor isPickup es verdadero cuando una visita es un punto de partida y falso cuando una visita es una entrega. Las respuestas de REST omiten esta propiedad cuando el valor es falso.
  • visitRequestIndex es el índice basado en cero del VisitRequest de Shipment.pickups o Shipment.deliveries en la solicitud correspondiente que representa Visit. En las respuestas de REST, se omite esta propiedad cuando el valor es cero.
  • startTime es la hora a la que se prevé que comience la visita.
  • Tipo de carga de mapas loadDemands para la cantidad de carga demandada a fin de completar Visit. Los importes de carga son negativos para las visitas de entrega, lo que representa que la carga se quita del vehículo.

Este es un ejemplo de Visit:

{
  "routes": [
    {
      ...
      "visits": [
        {
          "isPickup": true,
          "startTime": "2024-02-13T00:00:00Z",
          "detour": "0s"
        },
        ...
      ],
    },
    ...
  ],
  ...
}

Cada ShipmentRoute incluye una lista ordenada de transitions que representa los viajes entre visits de un vehículo determinado. Entre las propiedades importantes de mensajes Transition (REST, gRPC), se incluyen las siguientes:

  • startTime es la hora a la que el vehículo comenzará a realizar la transición.
  • travelDuration es la duración que el vehículo debe recorrer para completar la transición.
  • travelDistanceMeters es la distancia en metros que debe recorrer el vehículo 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 espera antes de poder iniciar su próximo Visit. Esto puede ocurrir debido a los start_time de los siguientes Visit.
  • totalDuration es la duración total de la transición, incluidos los tiempos de viaje, espera, pausa y retraso.
  • vehicleLoads asigna el tipo de carga para la cantidad de carga que transporta el vehículo durante esta transición.

Este es un ejemplo de Transition:

{
  "routes": [
    {
      ...
      "transitions": [
        ...
        {
          "travelDuration": "1171s",
          "travelDistanceMeters": 9004,
          "waitDuration": "0s",
          "totalDuration": "1171s",
          "startTime": "2024-02-13T00:00:00Z"
        },
        ...
      ],
      ...
    }
  ],
  ...
}

La relación entre vists y transitions se describe en Optimización del pedido de detención de retiro y entrega, así como en la documentación de referencia de ShipmentRoute (REST, gRPC).

Propiedades de las métricas

En el mensaje Metrics (REST, gRPC), se resume toda la solución. Algunas propiedades importantes de Metrics incluyen las siguientes:

  • totalCost es el costo total incurrido por 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. Los vehículos pueden tener 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 un penaltyCost que se genera si se omite el envío. Los envíos obligatorios 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 de todos los ShipmentRoute en el OptimizeToursResponse. Cada propiedad ShipmentRoute.metrics contiene métricas para esa ShipmentRoute específica.

Las propiedades importantes de AggregatedMetrics incluyen lo siguiente:

  • 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 use TransitionAttributes 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. En efecto, es la suma de todos los valores VisitRequest.duration de los VisitRequest correspondientes a los Visit asignados al vehículo correspondiente.
  • 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 tipos de carga a la cantidad de carga máxima que transportan los vehículos en cualquier punto de sus rutas.

Este es un ejemplo de mensaje Metrics:

{
  "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

Una respuesta de ejemplo completa para la solicitud de Construye 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
    }
  }
}