Interpreta la respuesta de la API de Route Optimization… con perros

Desarrolladores del Espacio Económico Europeo (EEE)

Nota para producción

Para simplificar, en esta guía se usan REST y JSON. Sin embargo, para tu entorno de producción, la recomendación general es usar gRPC y las bibliotecas cliente para obtener un mejor rendimiento. Para obtener más información, consulta las bibliotecas cliente de la API de Route Optimization.

Después de enviar la solicitud en Realiza tu primera solicitud, el optimizador devuelve un OptimizeToursResponse. Esta respuesta es el plan de ruta que debe seguir tu conductor. En esta guía, se muestra cómo leerlo.

Resumen del plan de ruta

En el caso de la guardería para perros, el optimizador asigna el boyero de Berna y el chihuahua a tu camioneta, y omite el pastor alemán. El plan de ruta de tu conductor es el siguiente:

  • Comienza el turno a las 7:55 a.m. en la guardería.
  • Recoge al boyero de Berna cerca de la Torre Coit a las 8:20 a.m.
  • Recoge al chihuahua en South Sunset Playground Park a las 8:58 a.m.
  • Regresa a la guardería a las 9:24 a.m. y espera hasta que se abra la ventana de entrega a las 9:30 a.m.
  • Deja al boyero de Berna a las 9:30 a.m.
  • Deja al chihuahua a las 9:35 a.m.
  • Termina el turno a las 9:40 a.m.

El plan de ruta cuesta USD 147.22, incluida una penalización de USD 100 por omitir al pastor alemán.

Para verificar tus resultados, compara tu respuesta con la respuesta de ejemplo completa. Es posible que tus resultados difieran un poco, ya que la duración del viaje y las distancias dependen de los datos actuales de las rutas.

Ejemplo de respuesta completa

{
  "routes": [
    {
      "vehicleStartTime": "2024-02-13T15:55:04Z",
      "vehicleEndTime": "2024-02-13T17:40:00Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2024-02-13T16:20:00Z",
          "detour": "0s",
          "shipmentLabel": "Bernese mountain dog",
          "visitType": "PICKUP_SHIPMENT"
        },
        {
          "shipmentIndex": 1,
          "isPickup": true,
          "startTime": "2024-02-13T16:58:12Z",
          "detour": "2600s",
          "shipmentLabel": "Chihuahua",
          "visitType": "PICKUP_SHIPMENT"
        },
        {
          "startTime": "2024-02-13T17:30:00Z",
          "detour": "2297s",
          "shipmentLabel": "Bernese mountain dog",
          "visitType": "DELIVER_SHIPMENT"
        },
        {
          "shipmentIndex": 1,
          "startTime": "2024-02-13T17:35:00Z",
          "detour": "656s",
          "shipmentLabel": "Chihuahua",
          "visitType": "DELIVER_SHIPMENT"
        }
      ],
      "transitions": [
        {
          "travelDuration": "1496s",
          "travelDistanceMeters": 7082,
          "waitDuration": "0s",
          "totalDuration": "1496s",
          "startTime": "2024-02-13T15:55:04Z"
        },
        {
          "travelDuration": "1992s",
          "travelDistanceMeters": 16589,
          "waitDuration": "0s",
          "totalDuration": "1992s",
          "startTime": "2024-02-13T16:25:00Z"
        },
        {
          "travelDuration": "1252s",
          "travelDistanceMeters": 7860,
          "waitDuration": "356s",
          "totalDuration": "1608s",
          "startTime": "2024-02-13T17:03:12Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2024-02-13T17:35:00Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2024-02-13T17:40:00Z"
        }
      ],
      "metrics": {
        "performedShipmentCount": 2,
        "travelDuration": "4740s",
        "waitDuration": "356s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "1200s",
        "totalDuration": "6296s",
        "travelDistanceMeters": 31531,
        "performedShipmentPenaltyCostSum": 2000
      },
      "routeCosts": {
        "model.vehicles.cost_per_hour": 47.22
      },
      "routeTotalCost": 47.22,
      "vehicleFullness": {
        "maxFullness": 0.3497777777777778,
        "activeSpan": 0.3497777777777778
      }
    }
  ],
  "skippedShipments": [
    {
      "index": 2,
      "label": "German shepherd",
      "penaltyCost": 100
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 2,
      "travelDuration": "4740s",
      "waitDuration": "356s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "1200s",
      "totalDuration": "6296s",
      "travelDistanceMeters": 31531,
      "performedShipmentPenaltyCostSum": 2000
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2024-02-13T15:55:04Z",
    "latestVehicleEndTime": "2024-02-13T17:40:00Z",
    "totalCost": 147.22,
    "costs": {
      "model.vehicles.cost_per_hour": 47.22,
      "model.shipments.penalty_cost": 100
    }
  }
}
    

Estructura de la respuesta

OptimizeToursResponse tiene un objeto ShipmentRoute con un tipo de mensaje de visitas y un objeto Metrics con aggregatedRouteMetrics y totalCost.

El OptimizeToursResponse contiene dos componentes principales:

  • routes: Es el plan de ruta para cada vehículo de tu flota, incluidos el orden y los horarios de cada retiro y entrega. Tienes una camioneta, por lo que hay un plan de ruta.
  • metrics: Es un resumen de todo el plan de ruta, incluidos el costo, la duración y la distancia totales.

Debido a que el optimizador omite el pastor alemán, la respuesta también incluye skippedShipments.

En las siguientes secciones, se muestra dónde encontrar cada detalle del resumen del plan de ruta en la respuesta.

¿Qué vehículo recorre qué ruta?

El optimizador genera un plan de ruta (el array routes) que corresponde al orden de vehicles en tu solicitud.

El campo vehicleIndex identifica cada vehículo según su posición basada en cero, que para tu camioneta es 0. Los campos vehicleStartTime y vehicleEndTime le indican al conductor cuándo comenzar y finalizar su turno.

La API de Route Optimization devuelve marcas de tiempo en UTC, marcadas con el sufijo Z, independientemente de la diferencia en tu solicitud. Para obtener la hora de San Francisco, resta 8 horas. Para tu camioneta, el turno se extiende de 7:55 a.m. a 9:40 a.m., como se muestra en la siguiente muestra de código.

{
"routes": [
    {
    // "vehicleIndex": 0, // Omitted in actual JSON response because it's 0
    "vehicleStartTime": "2024-02-13T15:55:04Z",
    "vehicleEndTime": "2024-02-13T17:40:00Z",
    ...
    }
  ]
  ...
}

¿Cuál es el orden de recogida y destino?

Dentro de cada ruta, el array visits contiene cada retiro y entrega del vehículo asignado en orden cronológico.

El shipmentIndex de cada visita es la posición basada en cero del envío en tu solicitud: 0 es el boyero de Berna y 1 es el chihuahua. En el campo shipmentLabel, se muestra la etiqueta que estableciste para cada envío.

Para distinguir entre un retiro y una entrega, puedes verificar los campos visitType o isPickup:

  • visitType: Define de forma explícita la acción de visita.
    • Retiro: visitType = "PICKUP_SHIPMENT"
    • Entrega: visitType = "DELIVER_SHIPMENT"
  • isPickup: Es un campo auxiliar booleano.
    • Retiro: isPickup = true
    • Entrega: isPickup = false (se omite en JSON)

Para determinar la secuencia exacta de eventos y la hora de llegada prevista a cada ubicación, lee el array visits en orden. En la siguiente tabla, se muestra la acción del plan de ruta según el orden y los valores de los campos shipmentIndex, isPickup o visitType, y startTime.

Secuencia Valor shipmentIndex Valor isPickup o visitType Valor de startTime (UTC) Acción
Primera visita 0 (se omite en JSON) Verdadero o PICKUP_SHIPMENT 2024-02-13T16:20:00Z Recoge al boyero de Berna a las 8:20 a.m.
Segunda visita 1 Verdadero o PICKUP_SHIPMENT 2024-02-13T16:58:12Z Recoge al chihuahua a las 8:58 a.m.
Tercera visita 0 (se omite en JSON) Falso (omitido) o DELIVER_SHIPMENT 2024-02-13T17:30:00Z Llevar al boyero de Berna a la guardería canina a las 9:30 a.m.
Cuarta visita 1 False (omitido) o DELIVER_SHIPMENT 2024-02-13T17:35:00Z Deja al chihuahua en la guardería para perros a las 9:35 a.m.

En la siguiente muestra de código, se indica cómo la respuesta proporciona esta secuencia:

{
  "routes": [
    {
      "visits": [
        {
          // "shipmentIndex": 0, // Omitted in actual JSON response because it's 0
          "isPickup": true,
          "startTime": "2024-02-13T16:20:00Z",
          "shipmentLabel": "Bernese mountain dog",
          "visitType": "PICKUP_SHIPMENT"
        },
        {
          "shipmentIndex": 1,
          "isPickup": true,
          "startTime": "2024-02-13T16:58:12Z",
          "shipmentLabel": "Chihuahua",
          "visitType": "PICKUP_SHIPMENT"
        },
        {
          // "shipmentIndex": 0, // Omitted in actual JSON response because it's 0
          // "isPickup": false, // Omitted in actual JSON response because it's false
          "startTime": "2024-02-13T17:30:00Z",
          "shipmentLabel": "Bernese mountain dog",
          "visitType": "DELIVER_SHIPMENT"
        },
        {
          "shipmentIndex": 1,
          // "isPickup": false, // Omitted in actual JSON response because it's false
          "startTime": "2024-02-13T17:35:00Z",
          "shipmentLabel": "Chihuahua",
          "visitType": "DELIVER_SHIPMENT"
        }
      ]
    }
  ]
}

Cada visita también tiene un visitRequestIndex, que es la posición basada en cero de la opción de retiro o entrega que el optimizador eligió para el envío. Cada perro en esta situación tiene solo una opción de retiro y una de entrega, por lo que visitRequestIndex siempre es 0, y la respuesta lo omite.

¿Qué sucede entre las visitas?

Dentro de cada ruta, el array transitions enumera los detalles del viaje entre las visitas. Aunque visits y transitions son listas separadas, se intercalan en el tiempo de la siguiente manera:

  1. transitions[0] (conducción desde el inicio hasta la primera visita)
  2. visits[0] (Primera visita)
  3. transitions[1] (Impulsa la segunda visita después de la primera)
  4. visits[1] (segunda visita)
  5. ...
  6. visits[N-1] (última visita, donde N es la cantidad total de visitas)
  7. transitions[N] (conducción desde la última visita hasta el final)

Puedes seguir el cronograma de la ruta si observas el campo startTime en ambos arrays. El startTime de una transición es cuando el conductor comienza a viajar, y el startTime de una visita es cuando el conductor comienza a retirar o dejar un paquete.

Cada transición muestra el tiempo de conducción y la distancia esperados entre las ubicaciones. En la siguiente tabla, se asignan los campos transitions y visits a las acciones de ruta cronológicas para la situación de la guardería de perros.

Secuencia Nombre del campo Valor de startTime (UTC) Detalles Acción
Primera transición transitions[0] 2024-02-13T15:55:04Z travelDuration: 1,496 s
travelDistanceMeters: 7,082
Conduce 7 km durante 25 minutos desde la guardería para recoger al boyero de Berna. El turno comienza a las 7:55 a.m.
Primera visita visits[0] 2024-02-13T16:20:00Z shipmentIndex: 0 (se omite en JSON)
isPickup: Verdadero
Recoge al boyero de Berna a partir de las 8:20 a.m. La visita dura 5 minutos.
Segunda transición transitions[1] 2024-02-13T16:25:00Z travelDuration: 1992s
travelDistanceMeters: 16589
Conduce 17 km durante 33 minutos desde Coit Tower para recoger al chihuahua a partir de las 8:25 a.m.
Segunda visita visits[1] 2024-02-13T16:58:12Z shipmentIndex: 1
isPickup: True
Recoge al chihuahua a partir de las 8:58 a.m. La visita dura 5 minutos.
Tercera transición transitions[2] 2024-02-13T17:03:12Z travelDuration: 1252 s
travelDistanceMeters: 7860
waitDuration: 356 s
Conduce 8 km durante 21 minutos desde South Sunset Playground de regreso al centro de cuidado infantil a partir de las 9:03 a.m. Llega a las 9:24 a.m. y espera 6 minutos a que se abra el período de entrega.
Tercera visita visits[2] 2024-02-13T17:30:00Z shipmentIndex: 0 (se omite en JSON)
isPickup: False (se omite en JSON)
Deja al boyero de Berna en la guardería canina a partir de las 9:30 a.m. La visita dura 5 minutos.
Cuarta transición transitions[3] 2024-02-13T17:35:00Z travelDuration: 0s
travelDistanceMeters: 0 (se omite en JSON)
No conduzcas. Todo listo para dejar al chihuahua en la guardería a las 9:35 a.m.
Cuarta visita visits[3] 2024-02-13T17:35:00Z shipmentIndex: 1
isPickup: False (se omite en JSON)
Deja al chihuahua en la guardería para perros a partir de las 9:35 a.m. La visita dura 5 minutos.
Quinta transición transitions[4] 2024-02-13T17:40:00Z travelDuration: 0s
travelDistanceMeters: 0 (se omite en JSON)
No conduzcas. El conductor finaliza su turno a las 9:40 a.m.

En la siguiente muestra de código, se observa cómo la respuesta proporciona esta secuencia para transitions[0] y transitions[1]:

{
  "routes": [
    {
      "transitions": [
        {
          "travelDuration": "1496s",
          "travelDistanceMeters": 7082,
          "waitDuration": "0s",
          "totalDuration": "1496s",
          "startTime": "2024-02-13T15:55:04Z"
        },
        {
          "travelDuration": "1992s",
          "travelDistanceMeters": 16589,
          "waitDuration": "0s",
          "totalDuration": "1992s",
          "startTime": "2024-02-13T16:25:00Z"
        },
        ...
      ]
    }
  ]
}

¿Cuánto cuesta la ruta?

Puedes consultar varios campos en la respuesta según si necesitas el costo de un vehículo específico o el costo total de toda la flota.

En la siguiente tabla, se enumeran todas las formas en que puedes encontrar información de costos en la respuesta:

Padres Parámetro Alcance Descripción
ShipmentRoute routeCosts Por ruta Un desglose de los componentes de costo específicos (como el costo por hora) para esa ruta en particular
routeTotalCost Por ruta Es el costo total calculado para esa ruta específica.
Metrics totalCost Total (todas las rutas) Es el costo total agregado de todas las rutas de la solución.
costs Total (todas las rutas) Es un desglose de los componentes de costos agregados en todas las rutas de la solución.

Los costos especificados en routeCosts y costs reflejan las restricciones de costo que especificas en tu solicitud. Para obtener más información, consulta el documento Concepto clave del modelo de costos.

En esta situación de guardería para perros, debido a que tienes un envío omitido, el costo por ruta y el costo total agregado son diferentes. El costo de la ruta solo incluye los costos asociados con esa ruta específica (el salario del conductor), mientras que el costo total agregado también incluye la penalización por el envío omitido. En la siguiente muestra de código, se indica dónde encontrar estos valores en la respuesta:

{
  "routes": [
    {
      "vehicleStartTime": "2024-02-13T15:55:04Z",
      "vehicleEndTime": "2024-02-13T17:40:00Z",
      ...
      "routeCosts": {
        "model.vehicles.cost_per_hour": 47.22
      },
      "routeTotalCost": 47.22
    }
  ],
  "metrics": {
    "totalCost": 147.22,
    "costs": {
      "model.shipments.penalty_cost": 100,
      "model.vehicles.cost_per_hour": 47.22
    },
    ...
  }
}

Según el plan de ruta, el conductor opera la camioneta de 7:55 a.m. a 9:40 a.m., lo que equivale a aproximadamente 1 hora y 45 minutos (6,296 segundos). Con la tarifa definida de $27 por hora, el costo de la ruta es de $47.22. Debido a que el optimizador omitió el envío del pastor alemán, agrega un costo de penalización de $100, lo que eleva el costo total agregado a $147.22.

¿Por qué se omitió un envío?

El optimizador enumera cualquier envío que no realice en el array skippedShipments. El motivo por el que se omite un envío depende de si estableces un penaltyCost:

  • Envíos obligatorios (sin penaltyCost): El optimizador nunca los omite solo porque son costosos de realizar. Solo omite uno si no puede ajustar el envío a ninguna ruta, por ejemplo, porque su período entra en conflicto con otros envíos.
  • Envíos opcionales (con un penaltyCost): El optimizador también puede omitirlos cuando realizarlos cuesta más que la penalización. Puedes establecer diferentes costos de penalización para priorizar algunos envíos sobre otros.

En esta situación, la ventana de retiro del pastor alemán entra en conflicto con la del boyero de Berna. La Torre Coit y Land's End están a 25 minutos de distancia, por lo que el conductor no puede realizar ambas recogidas en el plazo de 20 minutos. El optimizador debe omitir uno de ellos. Como el pastor alemán tiene el costo de penalización más bajo ($100 frente a $1,000 para el cliente habitual), el optimizador lo omite y genera la penalización de $100.

En la siguiente muestra de código, se indica el objeto skippedShipments en la respuesta:

{
  ...
  "skippedShipments": [
    {
      "index": 2,
      "label": "German shepherd",
      "penaltyCost": 100
    }
  ],
  ...
}

El objeto skippedShipments de la respuesta contiene los siguientes campos:

  • index: Es el índice basado en cero del envío en tu solicitud (2 para el tercer envío).
  • label: Es la etiqueta que especificaste en la solicitud ("German shepherd").
  • penaltyCost: Es el costo de penalización que especificaste en la solicitud, que la API agrega al costo total.

Para evitar que el optimizador omita un envío, flexibiliza la restricción que causa el conflicto. Por ejemplo, pídele al dueño del pastor alemán un horario de retiro más flexible y, luego, actualiza el timeWindows para ese retiro en tu solicitud.

Campos de respuesta en el ejemplo

En la siguiente tabla, se describen todos los campos de respuesta que se devuelven en el OptimizeToursResponse de la situación de ejemplo. Si bien no es necesario que uses todos los campos para comprender el plan de ruta, puedes analizarlos para determinar cómo ajustar tu OptimizeToursRequest para que se adapte a tus necesidades empresariales. Para obtener más información, consulta Ciclo de vida del plan de ruta.

Puedes filtrar el contenido por elemento superior o por búsqueda de texto.

Padres Parámetro Tipo de propiedad Descripción
OptimizeToursResponse routes Array de objetos (ShipmentRoute) Contiene la lista de rutas calculadas para cada vehículo (una por vehículo). En este caso de guardería para perros, contiene el plan de ruta detallado para tu única camioneta.
metrics Objeto (Metrics) Contiene las métricas generales de la solución, agregadas en todas las rutas. En este caso de la guardería para perros, este es el resumen de los costos y las duraciones operativas del día.
skippedShipments Array de objetos (SkippedShipment) Contiene la lista de envíos que se omitieron en la solución. En este caso, se omite el tercer perro (pastor alemán).
ShipmentRoute vehicleStartTime Marca de tiempo Es la hora en que el vehículo comienza su ruta. Para este caso de uso de guardería de perros, el conductor comienza a conducir la camioneta a las 7:55 a.m.
vehicleEndTime Marca de tiempo Es la hora en la que el vehículo finaliza su ruta. En este caso de la guardería para perros, el conductor termina de conducir la camioneta a las 9:40 a.m.
visits Array de objetos (Visit) Esta es la lista ordenada de retiros y entregas de la ruta. Para esta situación de guardería de perros, esta es la secuencia de recogida y entrega de los dos perros.
transitions Array de objetos (Transition) Esta es la lista ordenada de la distancia, el tiempo de viaje y el tiempo de espera entre las visitas. Para este caso de uso de guardería para perros, se detallan la distancia y el tiempo de conducción entre Coit Tower, South Sunset Playground Park y la guardería.
metrics Objeto (AggregatedMetrics) Estas son las métricas específicas de esta ruta única. Para este caso de la guardería de perros, estas son las estadísticas de esta camioneta específica. Estas métricas se basan en los costos que especificaste en tu solicitud. Para obtener más detalles, consulta el documento Concepto clave del modelo de costos.
routeCosts Objeto (mapa) Este es un desglose de los costos específicos de esta ruta. En este caso de la guardería para perros, se muestra el costo calculado a partir del salario del conductor de USD 27 por hora.
routeTotalCost Número Este es el costo total de esta ruta específica. En este caso de la guardería para perros, el costo total es de 47.22 para la ruta de esta camioneta.
vehicleFullness Objeto (VehicleFullness) Este es un desglose de qué tan cerca está el vehículo de sus límites operativos, como el tiempo, la distancia y la carga. En este caso de guardería para perros, solo las horas de inicio y finalización del turno limitan al conductor, por lo que el optimizador calcula vehicleFullness como la fracción de la duración real de la ruta y el tiempo máximo disponible para el turno del conductor.
Visit shipmentIndex Número entero Este es el índice basado en cero del envío en la solicitud original. En este caso de la guardería para perros, el 0 representa al boyero de Berna y el 1, al chihuahua.
isPickup Booleano Este campo es verdadero si esta visita es una recogida. En este caso de uso de guardería para perros, es verdadero cuando se recoge un perro y falso (o falta) cuando se deja un perro en la guardería.
startTime Marca de tiempo Esta es la hora de inicio estimada de la visita. En este caso de la guardería para perros, es cuando el conductor toca la puerta.
detour Duración Este es el tiempo adicional que el optimizador agrega al viaje de este envío específico. Un desvío es la diferencia entre el plan de ruta real y el viaje directo ideal si el conductor no tiene otros envíos o tareas que completar.

En este caso de guardería para perros, la primera visita, que consiste en recoger al boyero de Berna, tiene un desvío de 0 porque el conductor va directamente de la guardería a esta recogida. Para la recogida del chihuahua, el desvío es de 43 minutos porque el conductor recoge primero al boyero de Berna (y tarda 5 minutos en cargarlo).
shipmentLabel String Esta es la etiqueta de la solicitud para cada envío. En este caso de la guardería para perros, las etiquetas son "Chihuahua" o "Boyero de Berna".
visitType String (Enum) Indica el tipo de visita, que puede ser PICKUP_SHIPMENT para retiros o DELIVER_SHIPMENT para entregas. Para esta situación, es PICKUP_SHIPMENT o DELIVER_SHIPMENT.
Transition travelDuration Duración Este es el tiempo que se dedica a viajar durante esta transición entre visitas. Por ejemplo, en este caso de la guardería para perros, el conductor pasa aproximadamente 25 minutos conduciendo desde la guardería hasta la Torre Coit para recoger al boyero de Berna.
travelDistanceMeters Número entero Esta es la distancia recorrida en metros durante esta transición. Por ejemplo, en esta situación de guardería para perros, el conductor viaja 7 kilómetros desde la guardería hasta la Torre Coit para recoger al boyero de Berna.
waitDuration Duración Este es el tiempo que se pasa esperando antes del siguiente retiro o entrega. En este caso de la guardería para perros, son 6 minutos (356 segundos) para la tercera transición, ya que el conductor llega a la guardería antes de que se abra el período de entrega a las 9:30 a.m. Para otras transiciones, este valor es 0.
totalDuration Duración Es la duración total de la transición, incluidos los tiempos de conducción y de espera. Por ejemplo, el conductor pasa 25 minutos (25 minutos de conducción y 0 minutos de espera) en la primera transición y 27 minutos (21 minutos de conducción y 6 minutos de espera) en la tercera transición de regreso a la guardería.
startTime Marca de tiempo Es la hora en la que comienza el viaje. Coincide con la hora de finalización de la visita anterior (o, para la primera transición, la hora de inicio del vehículo). En el caso de la guardería para perros, la primera transición comienza a las 7:55 a.m., cuando el conductor sale de la guardería, y la segunda comienza a las 8:25 a.m., cuando el conductor sale de la Torre Coit.
Metrics aggregatedRouteMetrics Objeto (AggregatedMetrics) Esta es la suma de las métricas de todas las rutas. En este caso de la guardería para perros, estas son las métricas totales de tu camioneta.
usedVehicleCount Número entero Esta es la cantidad de vehículos que se usan en la solución. Para este caso de la guardería de perros, solo usas una camioneta.
earliestVehicleStartTime Marca de tiempo Esta es la hora de inicio más temprana entre todos los vehículos. Para este caso de uso de guardería de perros, la ruta de la camioneta comienza a las 7:55 a.m.
latestVehicleEndTime Marca de tiempo Esta es la hora de finalización más tardía entre todos los vehículos. En este caso de la guardería para perros, la ruta de la camioneta termina a las 9:40 a.m.
totalCost Número Este es el costo total de la solución. En este caso de guardería para perros, todo el plan de ruta cuesta 147.22 por día (incluido el salario del conductor de 47.22 y la penalización por envío omitido de 100).
costs Objeto (mapa) Este es un desglose del costo total por categoría. En este caso de la guardería para perros, el optimizador calculó el costo de la ruta en función del costo por hora y el costo de penalización por omitir al pastor alemán.
AggregatedMetrics performedShipmentCount Número entero Es la cantidad de envíos que se enrutaron correctamente. En este caso de guardería para perros, el conductor transporta dos perros.
travelDuration Duración Es el tiempo total que se dedicó a viajar. En esta situación de guardería para perros, el conductor viaja durante 79 minutos.
waitDuration Duración Este es el tiempo total que se pasó esperando. En este caso de la guardería para perros, el conductor espera 6 minutos (356 segundos) en la guardería para que se abra la ventana de entrega.
delayDuration Duración Esta es la duración adicional que defines con los atributos de transición, como el tiempo reservado para estacionar. Para esta situación de guardería de perros, no definiste ningún atributo de transición en la solicitud, por lo que este valor es cero.
breakDuration Duración Este es el tiempo total que se dedicó a las pausas. Para este caso de la guardería de perros, no hay descansos.
visitDuration Duración Este es el tiempo total que se dedicó a realizar servicios en las visitas. En este caso de la guardería para perros, son 20 minutos (5 minutos por visita para 4 visitas).
totalDuration Duración Esta es la suma de todos los componentes de duración. Para este caso de uso de guardería de perros, la duración total es de 105 minutos (6,296 segundos).
travelDistanceMeters Número entero Esta es la distancia total del viaje en metros. En este caso de guardería para perros, el conductor recorre una distancia total de 31.5 km.
performedShipmentPenaltyCostSum Doble Es la suma de los costos de penalización de todos los envíos realizados. En este caso, es 2000 porque el conductor recogió al boyero de Berna y al chihuahua (cada uno con un costo de penalización de 1000).
VehicleFullness maxFullness Número Este es el índice de utilización más alto en todos los campos de VehicleFullness. En este caso de guardería para perros, es 0.35 porque el conductor solo opera la camioneta durante 105 minutos de todo el turno de la mañana, que definiste como 5 horas en la solicitud.
activeSpan Número Es la proporción de la duración total del turno del conductor en comparación con el horario de atención del plan de ruta. Un número más bajo significa que el conductor pasa menos tiempo del día hábil operando el vehículo. En este caso de la guardería para perros, es de 0.35, ya que el conductor opera la camioneta durante 105 minutos en el turno de 5 horas.
SkippedShipment index Número entero Este es el índice basado en cero del envío en la solicitud original. En este caso, el 2 representa al pastor alemán.
label String Esta es la etiqueta que especificaste para el envío en la solicitud.
penaltyCost Número Este es el costo de penalización en el que incurres cuando el optimizador omite este envío. Coincide con el penaltyCost que especificaste en la solicitud.