ShipmentRoute

La ruta de un vehículo se puede descomponer, a lo largo del eje de tiempo, de la siguiente manera (suponemos que hay n visitas):

  |            |            |          |       |  T[2], |        |      |
  | Transition |  Visit #0  |          |       |  V[2], |        |      |
  |     #0     |    aka     |   T[1]   |  V[1] |  ...   | V[n-1] | T[n] |
  |  aka T[0]  |    V[0]    |          |       | V[n-2],|        |      |
  |            |            |          |       | T[n-1] |        |      |
  ^            ^            ^          ^       ^        ^        ^      ^
vehicle    V[0].start   V[0].end     V[1].   V[1].    V[n].    V[n]. vehicle
 start     (arrival)   (departure)   start   end      start    end     end

Ten en cuenta que marcamos la diferencia entre los siguientes puntos:

  • "eventos puntuales", como el inicio y la finalización del vehículo, y el inicio y la finalización de cada visita (también conocidas como la llegada y la salida) Ocurren en un segundo determinado.
  • "intervalos de tiempo", como las visitas en sí y la transición entre visitas. Aunque los intervalos de tiempo a veces pueden tener una duración de cero, es decir, comienzan y terminan en el mismo segundo, a menudo tienen una duración positiva.

Invariantes:

  • Si hay n visitas, se trata de transiciones n + 1.
  • Una visita siempre está rodeada por una transición anterior (mismo índice) y una transición posterior (índice + 1).
  • Al inicio del vehículo, siempre le sigue la transición n° 0.
  • La transición n.o n precedida siempre por la finalización del vehículo.

Acercando la imagen, esto es lo que sucede durante una Transition y una Visit:

---+-------------------------------------+-----------------------------+-->
   |           TRANSITION[i]             |           VISIT[i]          |
   |                                     |                             |
   |  * TRAVEL: the vehicle moves from   |      PERFORM the visit:     |
   |    VISIT[i-1].departure_location to |                             |
   |    VISIT[i].arrival_location, which |  * Spend some time:         |
   |    takes a given travel duration    |    the "visit duration".    |
   |    and distance                     |                             |
   |                                     |  * Load or unload           |
   |  * BREAKS: the driver may have      |    some quantities from the |
   |    breaks (e.g. lunch break).       |    vehicle: the "demand".   |
   |                                     |                             |
   |  * WAIT: the driver/vehicle does    |                             |
   |    nothing. This can happen for     |                             |
   |    many reasons, for example when   |                             |
   |    the vehicle reaches the next     |                             |
   |    event's destination before the   |                             |
   |    start of its time window         |                             |
   |                                     |                             |
   |  * DELAY: *right before* the next   |                             |
   |    arrival. E.g. the vehicle and/or |                             |
   |    driver spends time unloading.    |                             |
   |                                     |                             |
---+-------------------------------------+-----------------------------+-->
   ^                                     ^                             ^
V[i-1].end                           V[i].start                    V[i].end

Por último, a continuación te explicamos cómo se pueden organizar los VIAJES, LAS PAUSAS, LOS RETRASOS y LA ESPERA durante una transición.

  • No se superponen.
  • El RETRASO es único y debe ser un período continuo justo antes de la próxima visita (o la finalización del vehículo). Por lo tanto, es suficiente conocer la duración del retraso para conocer su hora de inicio y finalización.
  • Las RUTAS son períodos de tiempo contiguos y no superpuestos. La respuesta especifica la hora de inicio y la duración de cada pausa.
  • TRAVEL y WAIT son “interrumpibles”: pueden interrumpirse varias veces durante esta transición. Los clientes pueden suponer que los viajes se realizan "lo antes posible" y que "esperar" ocupa el tiempo restante.

Un ejemplo (complejo):

                               TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
  ||     |       |           |       |           |         |         ||
  ||  T  |   B   |     T     |       |     B     |         |    D    ||
  ||  r  |   r   |     r     |   W   |     r     |    W    |    e    ||
  ||  a  |   e   |     a     |   a   |     e     |    a    |    l    ||
  ||  v  |   a   |     v     |   i   |     a     |    i    |    a    ||
  ||  e  |   k   |     e     |   t   |     k     |    t    |    y    ||
  ||  l  |       |     l     |       |           |         |         ||
  ||     |       |           |       |           |         |         ||
--++-----------------------------------------------------------------++-->
Representación JSON
{
  "vehicleIndex": integer,
  "vehicleLabel": string,
  "vehicleStartTime": string,
  "vehicleEndTime": string,
  "visits": [
    {
      object (Visit)
    }
  ],
  "transitions": [
    {
      object (Transition)
    }
  ],
  "hasTrafficInfeasibilities": boolean,
  "routePolyline": {
    object (EncodedPolyline)
  },
  "breaks": [
    {
      object (Break)
    }
  ],
  "metrics": {
    object (AggregatedMetrics)
  },
  "routeCosts": {
    string: number,
    ...
  },
  "routeTotalCost": number
}
Campos
vehicleIndex

integer

El vehículo que realiza la ruta, identificado por su índice en el origen ShipmentModel.

vehicleLabel

string

Etiqueta del vehículo que realiza esta ruta, que equivale a ShipmentModel.vehicles(vehicleIndex).label, si se especifica.

vehicleStartTime

string (Timestamp format)

Hora a la que el vehículo comienza su recorrido.

Una marca de tiempo en formato RFC3339 UTC “Zulú”, con resolución de nanosegundos y hasta nueve dígitos fraccionarios. Ejemplos: "2014-10-02T15:01:23Z" y "2014-10-02T15:01:23.045123456Z".

vehicleEndTime

string (Timestamp format)

Hora a la que el vehículo finaliza su recorrido.

Una marca de tiempo en formato RFC3339 UTC “Zulú”, con resolución de nanosegundos y hasta nueve dígitos fraccionarios. Ejemplos: "2014-10-02T15:01:23Z" y "2014-10-02T15:01:23.045123456Z".

visits[]

object (Visit)

Secuencia ordenada de visitas que representan una ruta. Visits[i] es la i-ésima visita de la ruta. Si este campo está vacío, se considera que el vehículo no está en uso.

transitions[]

object (Transition)

Lista ordenada de transiciones para la ruta.

hasTrafficInfeasibilities

boolean

Cuando el valor de OptimizeToursRequest.consider_road_traffic se establece en verdadero, este campo indica que las incoherencias en los tiempos de la ruta se predicen con las estimaciones de duración de viajes basadas en el tráfico. Es posible que el tiempo no sea suficiente para completar los viajes ajustados por el tráfico, las demoras y las pausas entre las visitas, antes de la primera visita o después de la última visita, sin dejar de cumplir con los horarios del vehículo y la visita. Por ejemplo,

  startTime(previous_visit) + duration(previous_visit) +
  travelDuration(previous_visit, next_visit) > startTime(next_visit)

Es probable que la llegada a next_visit sea posterior a su período actual debido a la mayor estimación del tiempo de viaje travelDuration(previous_visit, next_visit) debido al tráfico. Además, es posible que una pausa se superponga con una visita debido a un aumento en las estimaciones del tiempo de viaje y las restricciones de los períodos de visitas o pausas.

routePolyline

object (EncodedPolyline)

Representación de polilínea codificada de la ruta. Este campo solo se propaga si se configura OptimizeToursRequest.populate_polylines como verdadero.

breaks[]

object (Break)

Hay descansos programados para el vehículo que realiza esta ruta. La secuencia breaks representa intervalos de tiempo, cada uno de los cuales comienza en el startTime correspondiente y dura duration segundos.

metrics

object (AggregatedMetrics)

Métricas de duración, distancia y carga para esta ruta. Los campos de AggregatedMetrics se suman en todos los ShipmentRoute.transitions o ShipmentRoute.visits, según el contexto.

routeCosts

map (key: string, value: number)

Costo de la ruta, desglosado por campos de solicitud relacionados con el costo. Las claves son rutas de acceso proto, relacionadas con la entrada OptimizeToursRequest, p.ej., "model.shipments.pickups.cost", y los valores son el costo total generado por el campo de costo correspondiente, agregado en toda la ruta. En otras palabras, costos["model.shipments.pickups.cost"] es la suma de todos los costos de retiro a lo largo de la ruta. Todos los costos definidos en el modelo se informan en detalle aquí, a excepción de los costos relacionados con TransitionAttributes que solo se informan de manera agregada a partir del 2022/01.

Es un objeto que contiene una lista de pares "key": value. Ejemplo: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

routeTotalCost

number

Costo total de la ruta. Es la suma de todos los costos en el mapa de costos.

Visitar

Una visita realizada durante una ruta. Esta visita corresponde a un retiro o una entrega de un Shipment.

Representación JSON
{
  "shipmentIndex": integer,
  "isPickup": boolean,
  "visitRequestIndex": integer,
  "startTime": string,
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "detour": string,
  "shipmentLabel": string,
  "visitLabel": string
}
Campos
shipmentIndex

integer

Índice del campo shipments en el archivo ShipmentModel de origen.

isPickup

boolean

Si es verdadero, la visita corresponde a una partida de un Shipment. De lo contrario, corresponde a una publicación.

visitRequestIndex

integer

Índice de VisitRequest en el campo de retiro o entrega de Shipment (consulta isPickup).

startTime

string (Timestamp format)

Hora a la que comienza la visita. Ten en cuenta que el vehículo puede llegar antes de esa fecha a la ubicación de la visita. Los horarios coinciden con ShipmentModel.

Una marca de tiempo en formato RFC3339 UTC “Zulú”, con resolución de nanosegundos y hasta nueve dígitos fraccionarios. Ejemplos: "2014-10-02T15:01:23Z" y "2014-10-02T15:01:23.045123456Z".

loadDemands

map (key: string, value: object (Load))

La demanda de carga total de visitas como la suma del envío y la solicitud de visita loadDemands. Los valores son negativos si la visita es una entrega. Las demandas se informan para los mismos tipos que Transition.loads (consulta este campo).

Es un objeto que contiene una lista de pares "key": value. Ejemplo: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

detour

string (Duration format)

Tiempo adicional de desvío debido a los envíos visitados en la ruta antes de la visita y al posible tiempo de espera que inducen los períodos. Si la visita es una entrega, el desvío se calcula a partir de la visita de retiro correspondiente y equivale a lo siguiente:

startTime(delivery) - startTime(pickup)
- (duration(pickup) + travel duration from the pickup location
to the delivery location).

De lo contrario, se calcula a partir del vehículo startLocation y es igual a lo siguiente:

startTime - vehicleStartTime - travel duration from
the vehicle's `startLocation` to the visit.

Una duración en segundos con hasta nueve dígitos decimales que terminen en "s". Ejemplo: "3.5s".

shipmentLabel

string

Copia del Shipment.label correspondiente, si se especifica en Shipment.

visitLabel

string

Copia del VisitRequest.label correspondiente, si se especifica en VisitRequest.

Transición

Realizar la transición entre dos eventos de la ruta Consulta la descripción de ShipmentRoute.

Si el vehículo no tiene startLocation ni endLocation, las métricas de viaje correspondientes son 0.

Representación JSON
{
  "travelDuration": string,
  "travelDistanceMeters": number,
  "trafficInfoUnavailable": boolean,
  "delayDuration": string,
  "breakDuration": string,
  "waitDuration": string,
  "totalDuration": string,
  "startTime": string,
  "routePolyline": {
    object (EncodedPolyline)
  },
  "vehicleLoads": {
    string: {
      object (VehicleLoad)
    },
    ...
  }
}
Campos
travelDuration

string (Duration format)

Duración del viaje durante esta transición.

Una duración en segundos con hasta nueve dígitos decimales que terminen en "s". Ejemplo: "3.5s".

travelDistanceMeters

number

Distancia recorrida durante la transición.

trafficInfoUnavailable

boolean

Cuando se solicita tráfico a través de OptimizeToursRequest.consider_road_traffic y no se pudo recuperar la información de tráfico de una Transition, este valor booleano se establece en verdadero. Esto puede ser temporal (problemas poco frecuentes en los servidores de tráfico en tiempo real) o permanentes (sin datos de esta ubicación).

delayDuration

string (Duration format)

Suma de las duraciones de los retrasos aplicadas a esta transición. Si corresponde, el retraso comienza exactamente delayDuration segundos antes del próximo evento (visita o finalización del vehículo). Consulta los TransitionAttributes.delay.

Una duración en segundos con hasta nueve dígitos decimales que terminen en "s". Ejemplo: "3.5s".

breakDuration

string (Duration format)

Es la suma de la duración de las pausas que ocurren durante esta transición, si las hubiera. Los detalles sobre la hora de inicio y la duración de cada pausa se almacenan en ShipmentRoute.breaks.

Una duración en segundos con hasta nueve dígitos decimales que terminen en "s". Ejemplo: "3.5s".

waitDuration

string (Duration format)

Tiempo de espera durante esta transición. La duración de espera corresponde al tiempo de inactividad y no incluye el tiempo de descanso. Además, ten en cuenta que este tiempo de espera puede dividirse en varios intervalos no contiguos.

Una duración en segundos con hasta nueve dígitos decimales que terminen en "s". Ejemplo: "3.5s".

totalDuration

string (Duration format)

Es la duración total de la transición, que se proporciona para tu comodidad. Equivale a lo siguiente:

  • próxima visita startTime (o vehicleEndTime si esta es la última transición): startTime de esta transición
  • Si el valor de ShipmentRoute.has_traffic_infeasibilities es falso, también se mantiene lo siguiente: `totalDuration = TravelDuration + retrasoDuration
  • breakDuration + WaitDuration.

Una duración en segundos con hasta nueve dígitos decimales que terminen en "s". Ejemplo: "3.5s".

startTime

string (Timestamp format)

Es la hora de inicio de esta transición.

Una marca de tiempo en formato RFC3339 UTC “Zulú”, con resolución de nanosegundos y hasta nueve dígitos fraccionarios. Ejemplos: "2014-10-02T15:01:23Z" y "2014-10-02T15:01:23.045123456Z".

routePolyline

object (EncodedPolyline)

Representación codificada de polilínea de la ruta seguida durante la transición. Este campo solo se propaga si se configura populateTransitionPolylines como verdadero.

vehicleLoads

map (key: string, value: object (VehicleLoad))

Los vehículos se cargan durante esta transición para cada tipo que aparece en la Vehicle.load_limits del vehículo o que tienen Shipment.load_demands distintos de cero en algunos envíos realizados en esta ruta.

Las cargas de la primera transición son las cargas iniciales de la ruta del vehículo. Luego, después de cada visita, se agregan o se restan los loadDemands de la visita para obtener las cargas de la siguiente transición, en función de si se realizó un retiro o una entrega.

Es un objeto que contiene una lista de pares "key": value. Ejemplo: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

EncodedPolyline

Es la representación codificada de una polilínea. Para obtener más información sobre la codificación de polilíneas, consulta la siguiente información: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.

Representación JSON
{
  "points": string
}
Campos
points

string

Es una cadena que representa puntos codificados de la polilínea.

Receso

Datos que representan la ejecución de un salto.

Representación JSON
{
  "startTime": string,
  "duration": string
}
Campos
startTime

string (Timestamp format)

Hora de inicio del descanso.

Una marca de tiempo en formato RFC3339 UTC “Zulú”, con resolución de nanosegundos y hasta nueve dígitos fraccionarios. Ejemplos: "2014-10-02T15:01:23Z" y "2014-10-02T15:01:23.045123456Z".

duration

string (Duration format)

Es la duración de la pausa.

Una duración en segundos con hasta nueve dígitos decimales que terminen en "s". Ejemplo: "3.5s".