Package google.maps.routeoptimization.v1

Índice

RouteOptimization

Un servicio para optimizar los recorridos de los vehículos.

Validez de ciertos tipos de campos:

  • google.protobuf.Timestamp
    • Las horas se expresan en tiempo Unix: segundos desde 1970-01-01T00:00:00+00:00.
    • Los segundos deben estar en [0, 253402300799], es decir, en [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • Los nanosegundos deben establecerse en 0 o no establecerse.
  • google.protobuf.Duration
    • Los segundos deben estar en [0, 253402300799], es decir, en [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • Los nanosegundos deben establecerse en 0 o no establecerse.
  • google.type.LatLng
    • La latitud debe estar en [-90.0, 90.0].
    • La longitud debe estar en [-180.0, 180.0].
    • al menos uno de los valores de latitud y longitud debe ser distinto de cero.
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

Optimiza los recorridos de los vehículos para uno o más mensajes OptimizeToursRequest como un lote.

Este método es una operación de larga duración (LRO). Las entradas para la optimización (mensajes OptimizeToursRequest) y las salidas (mensajes OptimizeToursResponse) se leen y escriben en Cloud Storage en el formato especificado por el usuario. Al igual que el método OptimizeTours, cada OptimizeToursRequest contiene un ShipmentModel y muestra un OptimizeToursResponse que contiene campos ShipmentRoute, que son un conjunto de rutas que deben realizar los vehículos para minimizar el costo general.

El usuario puede sondear operations.get para verificar el estado de la LRO:

Si el campo done de la LRO es falso, significa que aún se está procesando al menos una solicitud. Es posible que otras solicitudes se hayan completado correctamente y que sus resultados estén disponibles en Cloud Storage.

Si el campo done de la LRO es verdadero, significa que se procesaron todas las solicitudes. Las solicitudes que se procesen correctamente tendrán sus resultados disponibles en Cloud Storage. Las solicitudes que fallaron no tendrán sus resultados disponibles en Cloud Storage. Si el campo error de la LRO está configurado, contiene el error de una de las solicitudes que fallaron.

Permisos de autorización

Requiere el siguiente alcance de OAuth:

  • https://www.googleapis.com/auth/cloud-platform
Permisos de IAM

Se requiere el siguiente permiso de IAM en el recurso parent:

  • routeoptimization.operations.create

Para obtener más información, consulta la documentación de IAM.

OptimizeTours

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

Envía un OptimizeToursRequest que contiene un ShipmentModel y muestra un OptimizeToursResponse que contiene ShipmentRoute, que son un conjunto de rutas que deben realizar los vehículos para minimizar el costo general.

Un modelo ShipmentModel consta principalmente de Shipment que se deben realizar y Vehicle que se pueden usar para transportar los Shipment. Los ShipmentRoute asignan Shipment a Vehicle. Más específicamente, asignan una serie de Visit a cada vehículo, donde un Visit corresponde a un VisitRequest, que es una recolección o entrega para un Shipment.

El objetivo es proporcionar una asignación de ShipmentRoute a Vehicle que minimice el costo total, en el que el costo tiene muchos componentes definidos en ShipmentModel.

Permisos de autorización

Requiere el siguiente alcance de OAuth:

  • https://www.googleapis.com/auth/cloud-platform
Permisos de IAM

Se requiere el siguiente permiso de IAM en el recurso parent:

  • routeoptimization.locations.use

Para obtener más información, consulta la documentación de IAM.

AggregatedMetrics

Métricas agregadas para ShipmentRoute (resp. para OptimizeToursResponse en todos los elementos Transition o Visit (resp. en todos los elementos ShipmentRoute).

Campos
performed_shipment_count

int32

Cantidad de envíos realizados. Ten en cuenta que un par de recogida y entrega solo se cuenta una vez.

travel_duration

Duration

Es la duración total del viaje de una ruta o una solución.

wait_duration

Duration

Es la duración total de espera de una ruta o una solución.

delay_duration

Duration

Es la duración total de la demora de una ruta o una solución.

break_duration

Duration

Es la duración total de la pausa de una ruta o una solución.

visit_duration

Duration

Es la duración total de la visita de una ruta o una solución.

total_duration

Duration

La duración total debe ser igual a la suma de todas las duraciones anteriores. En el caso de las rutas, también corresponde a lo siguiente:

[ShipmentRoute.vehicle_end_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_end_time] - [ShipmentRoute.vehicle_start_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_start_time]
travel_distance_meters

double

Es la distancia total de viaje de una ruta o una solución.

max_loads

map<string, VehicleLoad>

Carga máxima alcanzada en toda la ruta (resp., solución), para cada una de las cantidades de esta ruta (resp., solución), calculada como el máximo de todos los Transition.vehicle_loads (resp., ShipmentRoute.metrics.max_loads.

BatchOptimizeToursMetadata

Este tipo no tiene campos.

Metadatos de la operación para las llamadas a BatchOptimizeToursRequest.

BatchOptimizeToursRequest

Solicita la optimización por lotes de los recorridos como una operación asíncrona. Cada archivo de entrada debe contener un OptimizeToursRequest y cada archivo de salida contendrá un OptimizeToursResponse. La solicitud contiene información para leer, escribir y analizar los archivos. Todos los archivos de entrada y salida deben estar en el mismo proyecto.

Campos
parent

string

Obligatorio. Proyecto de destino y ubicación para realizar una llamada.

Formato: * projects/{project-id} * projects/{project-id}/locations/{location-id}

Si no se especifica una ubicación, se elegirá una región automáticamente.

model_configs[]

AsyncModelConfig

Obligatorio. Información de entrada y salida de cada modelo de compra, como rutas de acceso a archivos y formatos de datos

AsyncModelConfig

Información para resolver un modelo de optimización de forma asíncrona.

Campos
display_name

string

Opcional. Es el nombre del modelo definido por el usuario, que los usuarios pueden usar como alias para hacer un seguimiento de los modelos.

input_config

InputConfig

Obligatorio. Información sobre el modelo de entrada.

output_config

OutputConfig

Obligatorio. La información de la ubicación de salida deseada

BatchOptimizeToursResponse

Este tipo no tiene campos.

Respuesta a un BatchOptimizeToursRequest. Se muestra en la operación de larga duración después de que se completa.

BreakRule

Son reglas para generar pausas de tiempo para un vehículo (p.ej., pausas para el almuerzo). Una pausa es un período contiguo durante el cual el vehículo permanece inactivo en su posición actual y no puede realizar ninguna visita. Puede ocurrir una pausa en los siguientes casos:

  • durante el viaje entre dos visitas (que incluye el tiempo justo antes o después de una visita, pero no en medio de una visita), en cuyo caso se extiende el tiempo de tránsito correspondiente entre las visitas,
  • o antes de que se encienda el vehículo (es posible que el vehículo no se encienda en medio de una pausa), en cuyo caso no afecta la hora de inicio del vehículo.
  • o después de que finalice el viaje (también con la hora de finalización del viaje).
Campos
break_requests[]

BreakRequest

Es la secuencia de pausas. Consulta el mensaje BreakRequest.

frequency_constraints[]

FrequencyConstraint

Es posible que se apliquen varios FrequencyConstraint. Todas deben satisfacer los BreakRequest de este BreakRule. Consulta FrequencyConstraint.

BreakRequest

Se debe conocer de antemano la secuencia de descansos (es decir, su cantidad y orden) que se aplica a cada vehículo. Los BreakRequest repetidos definen esa secuencia, en el orden en que deben ocurrir. Sus ventanas de tiempo (earliest_start_time / latest_start_time) pueden superponerse, pero deben ser compatibles con el pedido (esto se verifica).

Campos
earliest_start_time

Timestamp

Obligatorio. Límite inferior (inclusive) del inicio de la pausa.

latest_start_time

Timestamp

Obligatorio. Es el límite superior (inclusivo) del inicio de la pausa.

min_duration

Duration

Obligatorio. Es la duración mínima de la pausa. Debe ser positivo.

FrequencyConstraint

Se puede restringir aún más la frecuencia y la duración de las pausas especificadas anteriormente aplicando una frecuencia mínima de pausas, como "Debe haber una pausa de al menos 1 hora cada 12 horas". Suponiendo que esto se pueda interpretar como "Dentro de cualquier período deslizante de 12 horas, debe haber al menos una pausa de una hora", ese ejemplo se traduciría en el siguiente FrequencyConstraint:

{
   min_break_duration { seconds: 3600 }         # 1 hour.
   max_inter_break_duration { seconds: 39600 }  # 11 hours (12 - 1 = 11).
}

El tiempo y la duración de las pausas en la solución respetarán todas esas restricciones, además de los períodos y las duraciones mínimas que ya se especificaron en BreakRequest.

En la práctica, un FrequencyConstraint puede aplicarse a pausas no consecutivas. Por ejemplo, el siguiente programa respeta el ejemplo de "1 h cada 12 h":

  04:00 vehicle start
   .. performing travel and visits ..
  09:00 1 hour break
  10:00 end of the break
   .. performing travel and visits ..
  12:00 20-min lunch break
  12:20 end of the break
   .. performing travel and visits ..
  21:00 1 hour break
  22:00 end of the break
   .. performing travel and visits ..
  23:59 vehicle end
Campos
min_break_duration

Duration

Obligatorio. Es la duración mínima de la pausa para esta restricción. No negativo. Consulta la descripción de FrequencyConstraint.

max_inter_break_duration

Duration

Obligatorio. Es la duración máxima permitida de cualquier intervalo de tiempo en la ruta que no incluya, al menos de forma parcial, una pausa de duration >= min_break_duration. Debe ser positivo.

DataFormat

Formatos de datos para archivos de entrada y salida.

Enumeraciones
DATA_FORMAT_UNSPECIFIED Valor no válido, el formato no debe ser UNSPECIFIED.
JSON Notación de objetos de JavaScript.
PROTO_TEXT Formato de texto de Protocol Buffers. Consulta https://protobuf.dev/reference/protobuf/textformat-spec/

DistanceLimit

Es un límite que define la distancia máxima que se puede recorrer. Puede ser duro o blando.

Si se define un límite flexible, se deben definir soft_max_meters y cost_per_kilometer_above_soft_max, y no deben ser negativos.

Campos
max_meters

int64

Es un límite estricto que restringe la distancia a un máximo de max_meters. El límite no debe ser negativo.

soft_max_meters

int64

Un límite flexible no aplica un límite de distancia máxima, pero cuando se incumple, genera un costo que se suma a otros costos definidos en el modelo, con la misma unidad.

Si se define, soft_max_meters debe ser inferior a max_meters y no debe ser un valor negativo.

cost_per_kilometer_below_soft_max

double

El costo por kilómetro incurrido aumenta hasta soft_max_meters con la siguiente fórmula:

  min(distance_meters, soft_max_meters) / 1000.0 *
  cost_per_kilometer_below_soft_max.

Este costo no se admite en route_distance_limit.

cost_per_kilometer_above_soft_max

double

Se genera un costo por kilómetro si la distancia supera el límite de soft_max_meters. El costo adicional es 0 si la distancia está por debajo del límite. De lo contrario, la fórmula que se usa para calcular el costo es la siguiente:

  (distance_meters - soft_max_meters) / 1000.0 *
  cost_per_kilometer_above_soft_max.

El costo no debe ser negativo.

GcsDestination

La ubicación de Google Cloud Storage en la que se escribirán los archivos de salida.

Campos
uri

string

Obligatorio. URI de Google Cloud Storage

GcsSource

La ubicación de Google Cloud Storage desde la que se leerá el archivo de entrada.

Campos
uri

string

Obligatorio. Es el URI de un objeto de Google Cloud Storage con el formato gs://bucket/path/to/object.

InjectedSolutionConstraint

Solución insertada en la solicitud, incluida información sobre qué visitas se deben restringir y cómo se deben restringir

Campos
routes[]

ShipmentRoute

Son las rutas de la solución que se insertarán. Es posible que se omitan algunas rutas de la solución original. Las rutas y los envíos omitidos deben satisfacer las suposiciones de validez básicas que se enumeran para injected_first_solution_routes.

skipped_shipments[]

SkippedShipment

Se omitieron los envíos de la solución para insertar. Es posible que se omitan algunos de la solución original. Consulta el campo routes.

constraint_relaxations[]

ConstraintRelaxation

Para cero o más grupos de vehículos, especifica cuándo y en qué medida se deben relajar las restricciones. Si este campo está vacío, todas las rutas de vehículos que no estén vacías estarán completamente restringidas.

ConstraintRelaxation

Para un grupo de vehículos, especifica en qué umbrales se relajarán las restricciones de visitas y hasta qué nivel. Los envíos que se indican en el campo skipped_shipment se omiten, es decir, no se pueden realizar.

Campos
relaxations[]

Relaxation

Todas las relajaciones de las restricciones de visitas que se aplicarán a las visitas en rutas con vehículos en vehicle_indices.

vehicle_indices[]

int32

Especifica los índices de vehículos a los que se aplica la restricción de visita relaxations. Si está vacío, se considera el valor predeterminado y el relaxations se aplica a todos los vehículos que no se especifican en otros constraint_relaxations. Puede haber como máximo un valor predeterminado, es decir, se permite un campo de relajación de restricciones vacío vehicle_indices. Un índice de vehículo solo se puede incluir una vez, incluso dentro de varios constraint_relaxations.

Un índice de vehículo se asigna de la misma manera que ShipmentRoute.vehicle_index si interpret_injected_solutions_using_labels es verdadero (consulta el comentario fields).

Relajación

Si relaxations está vacío, la hora de inicio y la secuencia de todas las visitas en routes están completamente restringidas y no se pueden insertar ni agregar visitas nuevas a esas rutas. Además, la hora de inicio y finalización de un vehículo en routes está completamente restringida, a menos que el vehículo esté vacío (es decir, no tenga visitas y tenga used_if_route_is_empty establecido como falso en el modelo).

relaxations(i).level especifica el nivel de relajación de restricciones aplicado a una visita #j que satisface lo siguiente:

  • route.visits(j).start_time >= relaxations(i).threshold_time Y
  • j + 1 >= relaxations(i).threshold_visit_count

De manera similar, el inicio del vehículo se relaja a relaxations(i).level si cumple con los siguientes requisitos:

  • vehicle_start_time >= relaxations(i).threshold_time Y
  • relaxations(i).threshold_visit_count == 0 y el extremo del vehículo se relaja a relaxations(i).level si se cumple con lo siguiente:
  • vehicle_end_time >= relaxations(i).threshold_time Y
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

Para aplicar un nivel de relajación si una visita cumple con threshold_visit_count O threshold_time, agrega dos relaxations con el mismo level: uno con solo threshold_visit_count establecido y el otro con solo threshold_time establecido. Si una visita satisface las condiciones de varios relaxations, se aplica el nivel más flexible. Como resultado, desde el inicio del vehículo hasta las visitas a la ruta hasta el final del vehículo, el nivel de relajación se vuelve más relajado, es decir, el nivel de relajación no disminuye a medida que avanza la ruta.

El tiempo y la secuencia de las visitas a la ruta que no satisfacen las condiciones de umbral de ningún relaxations están completamente restringidos y no se pueden insertar visitas en estas secuencias. Además, si el inicio o el final de un vehículo no satisface las condiciones de ninguna relajación, la hora es fija, a menos que el vehículo esté vacío.

Campos
level

Level

Es el nivel de relajación de restricciones que se aplica cuando se cumplen las condiciones en threshold_time o después de threshold_time Y al menos threshold_visit_count.

threshold_time

Timestamp

Es la hora en la que se puede aplicar la relajación level o después de ella.

threshold_visit_count

int32

Es la cantidad de visitas en las que se puede aplicar la relajación level o después de ellas. Si threshold_visit_count es 0 (o no se establece), se puede aplicar level directamente al inicio del vehículo.

Si es route.visits_size() + 1, level solo se puede aplicar al extremo del vehículo. Si es mayor que route.visits_size() + 1, no se aplica level para esa ruta.

Nivel

Expresa los diferentes niveles de relajación de restricciones, que se aplican para una visita y los que siguen cuando se satisfacen las condiciones del umbral.

La enumeración que aparece a continuación está en orden de relajación creciente.

Enumeraciones
LEVEL_UNSPECIFIED

Nivel de relajación predeterminado implícito: No se relajan las restricciones, es decir, todas las visitas están completamente restringidas.

Este valor no se debe usar de forma explícita en level.

RELAX_VISIT_TIMES_AFTER_THRESHOLD Se flexibilizarán las horas de inicio y finalización de las visitas y de los vehículos, pero cada visita seguirá vinculada al mismo vehículo y se deberá respetar la secuencia de visitas: no se puede insertar ninguna visita entre ellas ni antes de ellas.
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD Igual que RELAX_VISIT_TIMES_AFTER_THRESHOLD, pero la secuencia de visitas también es flexible: solo este vehículo puede realizar las visitas, pero es posible que no se realicen.
RELAX_ALL_AFTER_THRESHOLD Igual que RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD, pero el vehículo también está relajado: las visitas son completamente gratuitas en el momento del umbral o después de este, y es posible que no se realicen.

InputConfig

Especifica una entrada para [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours].

Campos
data_format

DataFormat

Obligatorio. El formato de los datos de entrada.

Campo de unión source. Obligatorio. Las direcciones (source) solo pueden ser una de las siguientes opciones:
gcs_source

GcsSource

Una ubicación de Google Cloud Storage Debe ser un solo objeto (archivo).

Ubicación

Encapsula una ubicación (un punto geográfico y un encabezado opcional).

Campos
lat_lng

LatLng

Son las coordenadas geográficas del punto de referencia.

heading

int32

Es el rumbo de la brújula asociado con la dirección del flujo de tráfico. Este valor se usa para especificar el lado de la ruta que se usará para la partida y la llegada. Los valores de rumbo pueden ser de 0 a 360, en los que 0 especifica un rumbo hacia el norte, 90 especifica un rumbo hacia el este, etcétera.

OptimizeToursRequest

Es una solicitud que se envía a un solucionador de optimización de recorridos que define el modelo de envío que se debe resolver, así como los parámetros de optimización.

Campos
parent

string

Obligatorio. Proyecto o ubicación de destino para realizar una llamada.

Formato: * projects/{project-id} * projects/{project-id}/locations/{location-id}

Si no se especifica una ubicación, se elegirá una región automáticamente.

timeout

Duration

Si se establece este tiempo de espera, el servidor muestra una respuesta antes de que transcurra el período de tiempo de espera o se alcance la fecha límite del servidor para las solicitudes síncronas, lo que ocurra primero.

En el caso de las solicitudes asíncronas, el servidor generará una solución (si es posible) antes de que transcurra el tiempo de espera.

model

ShipmentModel

Modelo de envío para resolver.

solving_mode

SolvingMode

De forma predeterminada, el modo de resolución es DEFAULT_SOLVE (0).

search_mode

SearchMode

Es el modo de búsqueda que se usa para resolver la solicitud.

injected_first_solution_routes[]

ShipmentRoute

Guía al algoritmo de optimización para que encuentre una primera solución que sea similar a una solución anterior.

El modelo se ve limitado cuando se compila la primera solución. Los envíos que no se realizan en una ruta se omiten de forma implícita en la primera solución, pero se pueden realizar en soluciones sucesivas.

La solución debe satisfacer algunas suposiciones básicas de validez:

  • para todas las rutas, vehicle_index debe estar dentro del rango y no debe duplicarse.
  • para todas las visitas, shipment_index y visit_request_index deben estar dentro del rango.
  • Solo se puede hacer referencia a un envío en una ruta.
  • la recolección de un envío con recolección y entrega debe realizarse antes de la entrega.
  • No se puede realizar más de una alternativa de retiro o entrega de un envío.
  • para todas las rutas, los tiempos aumentan (es decir, vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time).
  • Los envíos solo se pueden realizar en vehículos permitidos. Se permite un vehículo si Shipment.allowed_vehicle_indices está vacío o si su vehicle_index se incluye en Shipment.allowed_vehicle_indices.

Si la solución insertada no es factible, no se muestra necesariamente un error de validación, sino que se puede mostrar un error que indica que no es factible.

injected_solution_constraint

InjectedSolutionConstraint

Limita el algoritmo de optimización para encontrar una solución final que sea similar a una solución anterior. Por ejemplo, se puede usar para inmovilizar partes de rutas que ya se completaron o que se completarán, pero que no se deben modificar.

Si la solución insertada no es factible, no se muestra necesariamente un error de validación, sino que se puede mostrar un error que indica que no es factible.

refresh_details_routes[]

ShipmentRoute

Si no están vacías, se actualizarán las rutas determinadas sin modificar su secuencia subyacente de visitas o tiempos de viaje; solo se actualizarán otros detalles. Esto no resuelve el modelo.

A partir de noviembre de 2020, solo se propagan los polilíneas de las rutas no vacías y se requiere que populate_polylines sea verdadero.

Es posible que los campos route_polyline de las rutas pasadas no sean coherentes con la ruta transitions.

Este campo no se debe usar junto con injected_first_solution_routes o injected_solution_constraint.

Shipment.ignore y Vehicle.ignore no tienen efecto en el comportamiento. Las polilíneas se siguen propagando entre todas las visitas en todas las rutas que no están vacías, independientemente de si se ignoran los envíos o los vehículos relacionados.

interpret_injected_solutions_using_labels

bool

Si es verdadero, haz lo siguiente:

Esta interpretación se aplica a los campos injected_first_solution_routes, injected_solution_constraint y refresh_details_routes. Se puede usar cuando los índices de envíos o vehículos de la solicitud cambiaron desde que se creó la solución, quizás porque se quitaron o agregaron envíos o vehículos a la solicitud.

Si es verdadero, las etiquetas de las siguientes categorías deben aparecer como máximo una vez en su categoría:

Si un vehicle_label en la solución insertada no corresponde a un vehículo de solicitud, la ruta correspondiente se quita de la solución junto con sus visitas. Si un shipment_label en la solución insertada no corresponde a un envío de solicitud, se quita la visita correspondiente de la solución. Si un SkippedShipment.label en la solución inyectada no corresponde a un envío de solicitud, se quita el SkippedShipment de la solución.

Quitar visitas a rutas o rutas completas de una solución insertada puede tener un efecto en las restricciones implícitas, lo que puede provocar cambios en la solución, errores de validación o inviabilidad.

NOTA: El llamador debe asegurarse de que cada Vehicle.label (resp. Shipment.label) identifica de forma exclusiva una entidad de vehículo (o envío) que se usa en las dos solicitudes relevantes: la solicitud anterior que produjo el OptimizeToursResponse que se usa en la solución insertada y la solicitud actual que incluye la solución insertada. Las verificaciones de unicidad que se describieron anteriormente no son suficientes para garantizar este requisito.

consider_road_traffic

bool

Ten en cuenta la estimación de tráfico cuando calcules los campos ShipmentRoute Transition.travel_duration, Visit.start_time y vehicle_end_time; cuando configures el campo ShipmentRoute.has_traffic_infeasibilities y cuando calcules el campo OptimizeToursResponse.total_cost.

populate_polylines

bool

Si es verdadero, se propagarán los polilíneas en las ShipmentRoute de respuesta.

populate_transition_polylines

bool

Si es verdadero, los polilíneas y los tokens de ruta se propagarán en la respuesta ShipmentRoute.transitions.

allow_large_deadline_despite_interruption_risk

bool

Si se establece, la solicitud puede tener una fecha límite (consulta https://grpc.io/blog/deadlines) de hasta 60 minutos. De lo contrario, el plazo máximo es de solo 30 minutos. Ten en cuenta que las solicitudes de larga duración tienen un riesgo de interrupción mucho mayor (pero aún pequeño).

use_geodesic_distances

bool

Si es verdadero, las distancias de viaje se calcularán con distancias geodésicas en lugar de distancias de Google Maps, y los tiempos de viaje se calcularán con distancias geodésicas con una velocidad definida por geodesic_meters_per_second.

label

string

Etiqueta que se puede usar para identificar esta solicitud, que se informa en OptimizeToursResponse.request_label.

geodesic_meters_per_second

double

Cuando use_geodesic_distances es verdadero, se debe configurar este campo y define la velocidad que se aplica para calcular los tiempos de viaje. Su valor debe ser de al menos 1.0 metros por segundo.

max_validation_errors

int32

Trunca la cantidad de errores de validación que se muestran. Por lo general, estos errores se adjuntan a una carga útil de error INVALID_ARGUMENT como un detalle de error BadRequest (https://cloud.google.com/apis/design/errors#error_details), a menos que solving_mode=VALIDATE_ONLY: consulta el campo OptimizeToursResponse.validation_errors. El valor predeterminado es 100 y tiene un límite de 10,000.

SearchMode

Es el modo que define el comportamiento de la búsqueda y que establece un equilibrio entre la latencia y la calidad de la solución. En todos los modos, se aplica la fecha límite de solicitud global.

Enumeraciones
SEARCH_MODE_UNSPECIFIED Es un modo de búsqueda no especificado, equivalente a RETURN_FAST.
RETURN_FAST Detén la búsqueda después de encontrar la primera solución adecuada.
CONSUME_ALL_AVAILABLE_TIME Dedica todo el tiempo disponible a buscar mejores soluciones.

SolvingMode

Define cómo el solucionador debe controlar la solicitud. En todos los modos, excepto VALIDATE_ONLY, si la solicitud no es válida, recibirás un error INVALID_REQUEST. Consulta max_validation_errors para limitar la cantidad de errores que se muestran.

Enumeraciones
DEFAULT_SOLVE Resuelve el modelo. Es posible que se emitan advertencias en [OptimizeToursResponse.validation_errors][google.cloud.optimization.v1.OptimizeToursResponse.validation_errors].
VALIDATE_ONLY Solo valida el modelo sin resolverlo: propaga tantos OptimizeToursResponse.validation_errors como sea posible.
DETECT_SOME_INFEASIBLE_SHIPMENTS

Solo propaga OptimizeToursResponse.validation_errors o OptimizeToursResponse.skipped_shipments y, en realidad, no resuelve el resto de la solicitud (status y routes no se establecen en la respuesta). Si se detectan infeasibilitys en las rutas injected_solution_constraint, se propagan en el campo OptimizeToursResponse.validation_errors y OptimizeToursResponse.skipped_shipments queda vacío.

IMPORTANTE: No se muestran todos los envíos inviables, sino solo los que se detectan como inviables durante el procesamiento previo.

OptimizeToursResponse

Es la respuesta después de resolver un problema de optimización de recorridos que contiene las rutas que sigue cada vehículo, los envíos que se omitieron y el costo general de la solución.

Campos
routes[]

ShipmentRoute

Son las rutas calculadas para cada vehículo. La ruta i corresponde al vehículo i en el modelo.

request_label

string

Es una copia de OptimizeToursRequest.label si se especificó una etiqueta en la solicitud.

skipped_shipments[]

SkippedShipment

La lista de todos los envíos omitidos

validation_errors[]

OptimizeToursValidationError

Es la lista de todos los errores de validación que pudimos detectar de forma independiente. Consulta la explicación de "MULTIPLE ERRORS" para el mensaje OptimizeToursValidationError. En lugar de errores, se incluirán advertencias en el caso de que solving_mode sea DEFAULT_SOLVE.

metrics

Metrics

Métricas de duración, distancia y uso de esta solución.

Métricas

Métricas generales, agregadas en todas las rutas

Campos
aggregated_route_metrics

AggregatedMetrics

Se agregan en las rutas. Cada métrica es la suma (o el máximo, para las cargas) de todos los campos ShipmentRoute.metrics con el mismo nombre.

skipped_mandatory_shipment_count

int32

Cantidad de envíos obligatorios omitidos.

used_vehicle_count

int32

Es la cantidad de vehículos utilizados. Nota: Si la ruta de un vehículo está vacía y Vehicle.used_if_route_is_empty es verdadero, se considera que el vehículo está en uso.

earliest_vehicle_start_time

Timestamp

Es la hora de inicio más antigua de un vehículo usado, calculada como el mínimo de todos los vehículos usados de ShipmentRoute.vehicle_start_time.

latest_vehicle_end_time

Timestamp

Es la hora de finalización más reciente de un vehículo usado, calculada como el máximo de todos los vehículos usados de ShipmentRoute.vehicle_end_time.

costs

map<string, double>

Es el costo de la solución, desglosado por campos de solicitud relacionados con el costo. Las claves son rutas de proto, en relación 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 solución. En otras palabras, costs["model.shipments.pickups.cost"] es la suma de todos los costos de retiro de la solución. Todos los costos definidos en el modelo se registran en detalle aquí, a excepción de los costos relacionados con TransitionAttributes, que solo se registran de forma agregada a partir de 1/2022.

total_cost

double

Es el costo total de la solución. Es la suma de todos los valores del mapa de costos.

OptimizeToursValidationError

Describe un error o una advertencia que se encontró cuando se validó un OptimizeToursRequest.

Campos
code

int32

Un error de validación se define por el par (code, display_name) que siempre está presente.

Los campos que siguen a esta sección proporcionan más contexto sobre el error.

MULTIPLE ERRORS: Cuando hay varios errores, el proceso de validación intenta mostrar varios de ellos. Al igual que un compilador, este es un proceso imperfecto. Algunos errores de validación serán "irreparables", lo que significa que detienen todo el proceso de validación. Este es el caso de los errores de display_name="UNSPECIFIED", entre otros. Algunos errores pueden hacer que el proceso de validación omita otros errores.

ESTABILIDAD: code y display_name deben ser muy estables. Sin embargo, es posible que aparezcan códigos y nombres visibles nuevos con el tiempo, lo que puede hacer que una solicitud determinada (no válida) genere un par diferente (code, display_name) porque el error nuevo ocultó el anterior. Por ejemplo, consulta “MULTIPLE ERRORS”.

display_name

string

El nombre visible del error.

fields[]

FieldReference

Un contexto de error puede incluir 0, 1 (la mayoría de las veces) o más campos. Por ejemplo, para hacer referencia al vehículo n° 4 y a la primera recolección del envío n° 2, puedes hacerlo de la siguiente manera:

fields { name: "vehicles" index: 4}
fields { name: "shipments" index: 2 sub_field {name: "pickups" index: 0} }

Sin embargo, ten en cuenta que la cardinalidad de fields no debe cambiar para un código de error determinado.

error_message

string

Es una cadena legible que describe el error. Hay una asignación de uno a uno entre code y error_message (cuando code != "UNSPECIFIED").

ESTABILIDAD: No es estable: el mensaje de error asociado a un code determinado puede cambiar (con suerte, para aclararlo) con el tiempo. En su lugar, usa display_name y code.

offending_values

string

Puede contener los valores de los campos. Esta opción no siempre está disponible. No debes confiar en él y solo debes usarlo para la depuración manual de modelos.

FieldReference

Especifica un contexto para el error de validación. Un FieldReference siempre se refiere a un campo determinado en este archivo y sigue la misma estructura jerárquica. Por ejemplo, podemos especificar el elemento 2 de start_time_windows del vehículo 5 de la siguiente manera:

name: "vehicles" index: 5 sub_field { name: "end_time_windows" index: 2 }

Sin embargo, omitimos las entidades de nivel superior, como OptimizeToursRequest o ShipmentModel, para evitar que el mensaje esté sobrecargado.

Campos
name

string

Es el nombre del campo, p.ej., "vehicles".

sub_field

FieldReference

Subcampo anidado de forma recursiva, si es necesario

Campo de unión index_or_key.

index_or_key puede ser una de las siguientes opciones:

index

int32

Es el índice del campo si se repite.

key

string

Es clave si el campo es un mapa.

OutputConfig

Especifica un destino para los resultados de [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours].

Campos
data_format

DataFormat

Obligatorio. El formato de los datos de salida.

Campo de unión destination. Obligatorio. Las direcciones (destination) solo pueden ser una de las siguientes opciones:
gcs_destination

GcsDestination

La ubicación de Google Cloud Storage en la que se escribirá el resultado.

RouteModifiers

Encapsula un conjunto de condiciones opcionales que se deben cumplir cuando se calculan las rutas de los vehículos. Esto es similar a RouteModifiers en la API de Routes Preferred de Google Maps Platform. Consulta https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.

Campos
avoid_tolls

bool

Especifica si se deben evitar las rutas con peaje cuando sea razonable. Se dará preferencia a las rutas que no contengan rutas con peaje. Solo se aplica a los modos de viaje motorizados.

avoid_highways

bool

Especifica si se deben evitar las autopistas cuando sea razonable. Se dará preferencia a las rutas que no contengan autopistas. Solo se aplica a los modos de viaje motorizados.

avoid_ferries

bool

Especifica si se deben evitar los ferris cuando sea razonable. Se dará preferencia a las rutas que no incluyan viajes en transbordadores. Solo se aplica a los modos de viaje motorizados.

avoid_indoor

bool

Opcional. Especifica si se debe evitar navegar en interiores cuando sea razonable. Se dará preferencia a las rutas que no contengan navegación en interiores. Solo se aplica al modo de viaje WALKING.

Envío

Es el envío de un solo artículo, desde uno de sus puntos de retiro hasta uno de sus puntos de entrega. Para que el envío se considere realizado, un vehículo único debe visitar una de sus ubicaciones de retiro (y disminuir sus capacidades de repuestos según corresponda) y, luego, visitar una de sus ubicaciones de entrega más adelante (y, por lo tanto, volver a aumentar sus capacidades de repuestos según corresponda).

Campos
display_name

string

Es el nombre visible del envío definido por el usuario. Puede tener hasta 63 caracteres y puede usar caracteres UTF-8.

pickups[]

VisitRequest

Es un conjunto de alternativas de retiro asociadas al envío. Si no se especifica, el vehículo solo debe visitar una ubicación que corresponda a las entregas.

deliveries[]

VisitRequest

Es el conjunto de alternativas de entrega asociadas al envío. Si no se especifica, el vehículo solo debe visitar una ubicación que corresponda a los puntos de partida.

load_demands

map<string, Load>

Cargas del envío (por ejemplo, peso, volumen, cantidad de palés, etcétera) Las claves del mapa deben ser identificadores que describan el tipo de carga correspondiente, lo ideal es que también incluyan las unidades. Por ejemplo: "weight_kg", "volume_gallons", "pallet_count", etc. Si una clave determinada no aparece en el mapa, la carga correspondiente se considera nula.

allowed_vehicle_indices[]

int32

Es el conjunto de vehículos que pueden realizar este envío. Si está vacío, todos los vehículos pueden realizarlo. Los vehículos se indican por su índice en la lista vehicles de ShipmentModel.

costs_per_vehicle[]

double

Especifica el costo que se genera cuando cada vehículo entrega este envío. Si se especifica, debe tener UNO de los siguientes elementos:

  • la misma cantidad de elementos que costs_per_vehicle_indices. costs_per_vehicle[i] corresponde al vehículo costs_per_vehicle_indices[i] del modelo.
  • la misma cantidad de elementos que hay vehículos en el modelo. El elemento i corresponde al vehículo n° i del modelo.

Estos costos deben estar en la misma unidad que penalty_cost y no deben ser negativos. Deja este campo vacío si no hay costos de este tipo.

costs_per_vehicle_indices[]

int32

Índices de los vehículos a los que se aplica costs_per_vehicle. Si no está vacío, debe tener la misma cantidad de elementos que costs_per_vehicle. No se puede especificar un índice de vehículo más de una vez. Si se excluye un vehículo de costs_per_vehicle_indices, su costo es cero.

pickup_to_delivery_absolute_detour_limit

Duration

Especifica el tiempo máximo de desvío absoluto en comparación con la ruta más corta desde la partida hasta la entrega. Si se especifica, debe ser un número no negativo, y el envío debe contener al menos una recogida y una entrega.

Por ejemplo, supongamos que t es el tiempo más corto que se tarda en ir de la alternativa de retiro seleccionada directamente a la alternativa de entrega seleccionada. Luego, la configuración de pickup_to_delivery_absolute_detour_limit aplica lo siguiente:

start_time(delivery) - start_time(pickup) <=
t + pickup_to_delivery_absolute_detour_limit

Si se especifican los límites relativos y absolutos en el mismo envío, se usa el límite más restrictivo para cada par de recolección y entrega posibles. A partir de octubre de 2017, solo se admiten desvíos cuando las duraciones de viaje no dependen de los vehículos.

pickup_to_delivery_time_limit

Duration

Especifica la duración máxima desde el inicio del retiro hasta el inicio de la entrega de un envío. Si se especifica, debe ser un número no negativo, y el envío debe contener al menos una recolección y una entrega. Esto no depende de las alternativas seleccionadas para el retiro y la entrega ni de la velocidad del vehículo. Esto se puede especificar junto con las restricciones de desvío máximo: la solución respetará ambas especificaciones.

shipment_type

string

Es una cadena no vacía que especifica un “tipo” para este envío. Esta función se puede usar para definir incompatibilidades o requisitos entre shipment_types (consulta shipment_type_incompatibilities y shipment_type_requirements en ShipmentModel).

Se diferencia de visit_types, que se especifica para una sola visita: Todas las entregas o retiros que pertenecen al mismo envío comparten el mismo shipment_type.

label

string

Especifica una etiqueta para este envío. Esta etiqueta se informa en la respuesta en el shipment_label del ShipmentRoute.Visit correspondiente.

ignore

bool

Si es verdadero, omite este envío, pero no apliques un penalty_cost.

Si se ignora un envío, se produce un error de validación cuando hay algún shipment_type_requirements en el modelo.

Se permite ignorar un envío que se realiza en injected_first_solution_routes o injected_solution_constraint. El solucionador quita las visitas de retiro o entrega relacionadas de la ruta de ejecución. También se ignorarán los precedence_rules que hagan referencia a envíos ignorados.

penalty_cost

double

Si no se completa el envío, esta penalización se agrega al costo general de las rutas. Un envío se considera completado si se visita una de sus alternativas de retiro y entrega. El costo se puede expresar en la misma unidad que se usa para todos los demás campos relacionados con el costo en el modelo y debe ser positivo.

IMPORTANTE: Si no se especifica esta penalización, se considera infinita, es decir, el envío debe completarse.

pickup_to_delivery_relative_detour_limit

double

Especifica el tiempo máximo de desvío relativo en comparación con la ruta más corta desde la recogida hasta la entrega. Si se especifica, debe ser un número no negativo, y el envío debe contener al menos una recolección y una entrega.

Por ejemplo, supongamos que t es el tiempo más corto que se tarda en ir de la alternativa de retiro seleccionada directamente a la alternativa de entrega seleccionada. Luego, la configuración de pickup_to_delivery_relative_detour_limit aplica lo siguiente:

start_time(delivery) - start_time(pickup) <=
std::ceil(t * (1.0 + pickup_to_delivery_relative_detour_limit))

Si se especifican los límites relativos y absolutos en el mismo envío, se usa el límite más restrictivo para cada par de recolección y entrega posibles. A partir de octubre de 2017, solo se admiten desvíos cuando las duraciones de viaje no dependen de los vehículos.

Cargar

Cuando se realiza una visita, se puede agregar un importe predefinido a la carga del vehículo si se trata de un retiro o se puede restar si se trata de una entrega. Este mensaje define ese importe. Consulta los load_demands.

Campos
amount

int64

Es el importe en el que variará la carga del vehículo que realiza la visita correspondiente. Dado que es un número entero, se recomienda a los usuarios que elijan una unidad adecuada para evitar la pérdida de precisión. Debe ser ≥ 0.

VisitRequest

Es una solicitud de visita que puede realizar un vehículo: tiene una geolocalización (o dos, consulta a continuación), horarios de apertura y cierre representados por ventanas de tiempo y una duración del servicio (tiempo que pasa el vehículo una vez que llega para recoger o dejar bienes).

Campos
arrival_location

LatLng

Es la ubicación geográfica a la que llega el vehículo cuando realiza esta VisitRequest. Si el modelo de envío tiene matrices de distancia de duración, no se debe especificar arrival_location.

arrival_waypoint

Waypoint

El punto de referencia al que llega el vehículo cuando realiza esta VisitRequest. Si el modelo de envío tiene matrices de distancia de duración, no se debe especificar arrival_waypoint.

departure_location

LatLng

Es la geolocalización desde la que sale el vehículo después de completar este VisitRequest. Se puede omitir si es igual a arrival_location. Si el modelo de envío tiene matrices de distancia de duración, no se debe especificar departure_location.

departure_waypoint

Waypoint

Es el punto de referencia desde el que sale el vehículo después de completar este VisitRequest. Se puede omitir si es igual a arrival_waypoint. Si el modelo de envío tiene matrices de distancia de duración, no se debe especificar departure_waypoint.

tags[]

string

Especifica las etiquetas adjuntas a la solicitud de visita. No se permiten cadenas vacías ni duplicadas.

time_windows[]

TimeWindow

Son períodos que limitan la hora de llegada en una visita. Ten en cuenta que un vehículo puede salir fuera del período de la hora de llegada, es decir, la hora de llegada y la duración no tienen que estar dentro de un período. Esto puede generar un tiempo de espera si el vehículo llega antes de TimeWindow.start_time.

La ausencia de TimeWindow significa que el vehículo puede realizar esta visita en cualquier momento.

Las ventanas de tiempo deben ser disjuntas, es decir, ninguna debe superponerse con otra ni estar adyacente a ella, y deben estar en orden creciente.

cost_per_hour_after_soft_end_time y soft_end_time solo se pueden configurar si hay un solo período.

duration

Duration

Es la duración de la visita, es decir, el tiempo que el vehículo pasa entre la llegada y la salida (se debe agregar al tiempo de espera posible; consulta time_windows).

cost

double

Es el costo de atender esta solicitud de visita en una ruta del vehículo. Esto se puede usar para pagar diferentes costos por cada retiro o entrega alternativa de un envío. Este costo debe estar en la misma unidad que Shipment.penalty_cost y no debe ser negativo.

load_demands

map<string, Load>

Carga las demandas de esta solicitud de visita. Es similar al campo Shipment.load_demands, excepto que solo se aplica a este VisitRequest en lugar de a todo el Shipment. Las demandas que se indican aquí se agregan a las que se indican en Shipment.load_demands.

visit_types[]

string

Especifica los tipos de visita. Se puede usar para asignar el tiempo adicional necesario para que un vehículo complete esta visita (consulta Vehicle.extra_visit_duration_for_visit_type).

Un tipo solo puede aparecer una vez.

label

string

Especifica una etiqueta para este VisitRequest. Esta etiqueta se informa en la respuesta como visit_label en el ShipmentRoute.Visit correspondiente.

ShipmentModel

Un modelo de envío contiene un conjunto de envíos que debe realizar un conjunto de vehículos, a la vez que minimiza el costo general, que es la suma de lo siguiente:

  • el costo de planificar las rutas de los vehículos (suma del costo por tiempo total, costo por tiempo de viaje y costo fijo de todos los vehículos)
  • las penalizaciones por envíos no realizados.
  • el costo de la duración global de los envíos
Campos
shipments[]

Shipment

Es el conjunto de envíos que se deben realizar en el modelo.

vehicles[]

Vehicle

Es un conjunto de vehículos que se pueden usar para realizar visitas.

global_start_time

Timestamp

Horas de inicio y finalización globales del modelo: No se pueden considerar válidas las horas fuera de este rango.

El período del modelo debe ser inferior a un año, es decir, global_end_time y global_start_time deben estar dentro de un período de 31,536,000 segundos.

Cuando uses campos cost_per_*hour, te recomendamos que configures este período en un intervalo más pequeño para aumentar el rendimiento (p. ej., si modelas un solo día, debes establecer los límites de tiempo globales para ese día). Si no se establece, se usa de forma predeterminada el 1 de enero de 1970 a las 00:00:00 UTC (es decir, segundos: 0, nanos: 0).

global_end_time

Timestamp

Si no se establece, se usa de forma predeterminada el valor 00:00:00 UTC del 1 de enero de 1971 (es decir, segundos: 31536000, nanos: 0).

global_duration_cost_per_hour

double

La "duración global" del plan general es la diferencia entre la hora de inicio efectiva más temprana y la hora de finalización efectiva más reciente de todos los vehículos. Los usuarios pueden asignar un costo por hora a esa cantidad para intentar optimizar la finalización de la tarea lo antes posible, por ejemplo. Este costo debe estar en la misma unidad que Shipment.penalty_cost.

duration_distance_matrices[]

DurationDistanceMatrix

Especifica las matrices de duración y distancia que se usan en el modelo. Si este campo está vacío, se usarán Google Maps o distancias geodésicas, según el valor del campo use_geodesic_distances. Si no está vacío, use_geodesic_distances no puede ser verdadero y ni duration_distance_matrix_src_tags ni duration_distance_matrix_dst_tags pueden estar vacíos.

Ejemplos de uso:

  • Hay dos ubicaciones: locA y locB.
  • 1 vehículo que inicia su ruta en locA y la finaliza en locA.
  • 1 solicitud de visita de retiro en locB.
model {
  vehicles { start_tags: "locA"  end_tags: "locA" }
  shipments { pickups { tags: "locB" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_dst_tags: "locA"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • Hay tres ubicaciones: locA, locB y locC.
  • 1 vehículo que inicia su ruta en locA y la finaliza en locB, con la matriz "rápida".
  • 1 vehículo que inicia su ruta en locB y la finaliza en locB, con la matriz "lenta".
  • 1 vehículo que inicia su ruta en locB y la finaliza en locB, con la matriz "rápida".
  • 1 solicitud de visita de retiro en locC.
model {
  vehicles { start_tags: "locA" end_tags: "locB" start_tags: "fast" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "slow" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "fast" }
  shipments { pickups { tags: "locC" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_src_tags: "locC"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrix_dst_tags: "locC"
  duration_distance_matrices {
    vehicle_start_tag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  duration_distance_matrices {
    vehicle_start_tag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
duration_distance_matrix_src_tags[]

string

Etiquetas que definen las fuentes de las matrices de duración y distancia. duration_distance_matrices(i).rows(j) define las duraciones y las distancias de las visitas con la etiqueta duration_distance_matrix_src_tags(j) a otras visitas en la matriz i.

Las etiquetas corresponden a VisitRequest.tags o Vehicle.start_tags. Un VisitRequest o Vehicle determinado debe coincidir exactamente con una etiqueta en este campo. Ten en cuenta que las etiquetas de origen, destino y matriz de un Vehicle pueden ser las mismas. Del mismo modo, las etiquetas de origen y destino de un VisitRequest pueden ser las mismas. Todas las etiquetas deben ser diferentes y no pueden ser cadenas vacías. Si este campo no está vacío, duration_distance_matrices tampoco debe estarlo.

duration_distance_matrix_dst_tags[]

string

Etiquetas que definen los destinos de las matrices de duración y distancia; duration_distance_matrices(i).rows(j).durations(k) (resp. duration_distance_matrices(i).rows(j).meters(k)) define la duración (o la distancia) del viaje de las visitas con la etiqueta duration_distance_matrix_src_tags(j) a las visitas con la etiqueta duration_distance_matrix_dst_tags(k) en la matriz i.

Las etiquetas corresponden a VisitRequest.tags o Vehicle.start_tags. Un VisitRequest o Vehicle determinado debe coincidir exactamente con una etiqueta en este campo. Ten en cuenta que las etiquetas de origen, destino y matriz de un Vehicle pueden ser las mismas. Del mismo modo, las etiquetas de origen y destino de un VisitRequest pueden ser las mismas. Todas las etiquetas deben ser diferentes y no pueden ser cadenas vacías. Si este campo no está vacío, duration_distance_matrices tampoco debe estarlo.

transition_attributes[]

TransitionAttributes

Atributos de transición agregados al modelo.

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

Conjuntos de shipment_types incompatibles (consulta ShipmentTypeIncompatibility).

shipment_type_requirements[]

ShipmentTypeRequirement

Conjuntos de requisitos de shipment_type (consulta ShipmentTypeRequirement).

precedence_rules[]

PrecedenceRule

Es un conjunto de reglas de prioridad que se deben aplicar en el modelo.

max_active_vehicles

int32

Limita la cantidad máxima de vehículos activos. Un vehículo está activo si su ruta realiza al menos un envío. Esto se puede usar para limitar la cantidad de rutas en el caso de que haya menos conductores que vehículos y la flota de vehículos sea heterogénea. Luego, la optimización seleccionará el mejor subconjunto de vehículos para usar. Debe ser estrictamente positivo.

DurationDistanceMatrix

Especifica una matriz de duración y distancia de las ubicaciones de inicio y finalización de la visita y del vehículo.

Campos
rows[]

Row

Especifica las filas de la matriz de duración y distancia. Debe tener tantos elementos como ShipmentModel.duration_distance_matrix_src_tags.

vehicle_start_tag

string

Es la etiqueta que define a qué vehículos se aplica esta matriz de duración y distancia. Si está vacía, se aplica a todos los vehículos y solo puede haber una matriz.

Cada inicio de vehículo debe coincidir exactamente con una matriz, es decir, exactamente uno de sus campos start_tags debe coincidir con el vehicle_start_tag de una matriz (y solo de esa matriz).

Todas las matrices deben tener un vehicle_start_tag diferente.

Fila

Especifica una fila de la matriz de duración y distancia.

Campos
durations[]

Duration

Valores de duración para una fila determinada. Debe tener tantos elementos como ShipmentModel.duration_distance_matrix_dst_tags.

meters[]

double

Valores de distancia para una fila determinada. Si no hay costos ni restricciones que se refieran a distancias en el modelo, se puede dejar vacío. De lo contrario, debe tener tantos elementos como durations.

PrecedenceRule

Una regla de prioridad entre dos eventos (cada evento es la recolección o la entrega de un envío): el "segundo" evento debe comenzar al menos offset_duration después de que comenzó el "primero".

Varias prioridades pueden referirse a los mismos eventos (o relacionados), p.ej., "La recolección de B ocurre después de la entrega de A" y "la recolección de C ocurre después de la recolección de B".

Además, las prioridades solo se aplican cuando se realizan ambos envíos y, de lo contrario, se ignoran.

Campos
first_is_delivery

bool

Indica si el evento "primero" es una publicación.

second_is_delivery

bool

Indica si el "segundo" evento es una publicación.

offset_duration

Duration

Es la compensación entre el "primer" y el "segundo" evento. Puede ser negativo.

first_index

int32

Es el índice de envío del "primer" evento. Se debe especificar este campo.

second_index

int32

Es el índice de envío del "segundo" evento. Se debe especificar este campo.

ShipmentRoute

La ruta de un vehículo se puede descomponer, a lo largo del eje del tiempo, de la siguiente manera (supón 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 hacemos una distinción entre los siguientes conceptos:

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

Invariables:

  • Si hay n visitas, hay n+1 transiciones.
  • Una visita siempre está rodeada de una transición anterior (mismo índice) y una transición posterior (índice + 1).
  • El inicio del vehículo siempre está seguido de la transición n° 0.
  • El final del vehículo siempre está precedido por la transición n.

Si acercamos la imagen, esto es lo que sucede durante un Transition y un 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, aquí se explica cómo se pueden organizar TRAVEL, BREAKS, DELAY y WAIT durante una transición.

  • No se superponen.
  • El DELAY es único y debe ser un período contiguo justo antes de la próxima visita (o el final del vehículo). Por lo tanto, basta con conocer la duración de la demora para conocer su hora de inicio y finalización.
  • Las PAUSAS son períodos de tiempo contiguos que no se superponen. La respuesta especifica la hora de inicio y la duración de cada descanso.
  • TRAVEL y WAIT son "preemptibles": se pueden interrumpir varias veces durante esta transición. Los clientes pueden suponer que el viaje se realiza “lo antes posible” y que el tiempo restante se dedica a “esperar”.

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     |       |           |         |         ||
  ||     |       |           |       |           |         |         ||
--++-----------------------------------------------------------------++-->
Campos
vehicle_index

int32

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

vehicle_label

string

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

vehicle_start_time

Timestamp

Hora en la que el vehículo comienza su ruta.

vehicle_end_time

Timestamp

Hora a la que el vehículo termina su ruta.

visits[]

Visit

Es una secuencia ordenada de visitas que representa una ruta. visits[i] es la i-ésima visita en la ruta. Si este campo está vacío, el vehículo se considera como no utilizado.

transitions[]

Transition

Es la lista ordenada de transiciones de la ruta.

has_traffic_infeasibilities

bool

Cuando OptimizeToursRequest.consider_road_traffic se establece en verdadero, este campo indica que se predicen inconsistencias en los horarios de las rutas con estimaciones de duración del viaje basadas en el tráfico. Es posible que no haya tiempo suficiente para completar los viajes ajustados al tráfico, las demoras y las pausas entre visitas, antes de la primera visita o después de la última, y cumplir con los horarios de las visitas y los vehículos. Por ejemplo:

  start_time(previous_visit) + duration(previous_visit) +
  travel_duration(previous_visit, next_visit) > start_time(next_visit)

Es probable que la llegada a next_visit se produzca más tarde que el período actual debido al aumento de la estimación del tiempo de viaje travel_duration(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 de tiempo de viaje y las restricciones de los períodos de visita o descanso.

route_polyline

EncodedPolyline

Es la representación de la polilínea codificada de la ruta. Este campo solo se propaga si OptimizeToursRequest.populate_polylines está configurado como verdadero.

breaks[]

Break

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

metrics

AggregatedMetrics

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

route_costs

map<string, double>

Es el costo de la ruta, desglosado por campos de solicitud relacionados con el costo. Las claves son rutas de proto, en relación 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, costs["model.shipments.pickups.cost"] es la suma de todos los costos de retiro en la ruta. Todos los costos definidos en el modelo se registran en detalle aquí, a excepción de los costos relacionados con TransitionAttributes, que solo se registran de forma agregada a partir de 1/2022.

route_total_cost

double

Es el costo total de la ruta. Es la suma de todos los costos del mapa de costos.

Receso

Datos que representan la ejecución de una pausa.

Campos
start_time

Timestamp

Es la hora de inicio de una pausa.

duration

Duration

Es la duración de una pausa.

EncodedPolyline

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

Campos
points

string

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

Transición

Transición entre dos eventos en la ruta. Consulta la descripción de ShipmentRoute.

Si el vehículo no tiene un start_location o un end_location, las métricas de viaje correspondientes son 0.

Campos
travel_duration

Duration

Es la duración del viaje durante esta transición.

travel_distance_meters

double

Distancia recorrida durante la transición.

traffic_info_unavailable

bool

Cuando se solicita el tráfico a través de OptimizeToursRequest.consider_road_traffic y no se puede recuperar la información de tráfico para un Transition, este valor booleano se establece en verdadero. Esto puede ser temporal (un error poco frecuente en los servidores de tráfico en tiempo real) o permanente (no hay datos para esta ubicación).

delay_duration

Duration

Es la suma de las duraciones de demora aplicadas a esta transición. Si hay alguna, la demora comienza exactamente delay_duration segundos antes del siguiente evento (visita o finalización del vehículo). Consulta los TransitionAttributes.delay.

break_duration

Duration

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

wait_duration

Duration

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

total_duration

Duration

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

  • próxima visita start_time (o vehicle_end_time si esta es la última transición): start_time de esta transición
  • Si ShipmentRoute.has_traffic_infeasibilities es falso, también se cumple lo siguiente: "total_duration = travel_duration + delay_duration
  • break_duration + wait_duration`.
start_time

Timestamp

Es la hora de inicio de esta transición.

route_polyline

EncodedPolyline

Es la representación de polilínea codificada de la ruta que se siguió durante la transición. Este campo solo se propaga si populate_transition_polylines está configurado como verdadero.

route_token

string

Solo salida. Es un token opaco que se puede pasar al SDK de Navigation para reconstruir la ruta durante la navegación y, en caso de que se cambie la ruta, respetar la intención original cuando se creó la ruta. Trata este token como un blob opaco. No compares su valor entre las solicitudes, ya que puede cambiar incluso si el servicio muestra exactamente la misma ruta. Este campo solo se propaga si populate_transition_polylines está configurado como verdadero.

vehicle_loads

map<string, VehicleLoad>

Cargas de vehículos durante esta transición, para cada tipo que aparezca en el Vehicle.load_limits de este vehículo o que tenga un Shipment.load_demands distinto de cero en algún envío realizado en esta ruta.

Las cargas durante 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 load_demands de la visita para obtener las cargas de la siguiente transición, según si la visita fue una recolección o una entrega.

VehicleLoad

Informa la carga real del vehículo en algún punto de la ruta, para un tipo determinado (consulta Transition.vehicle_loads).

Campos
amount

int64

Es la cantidad de carga del vehículo para el tipo determinado. Por lo general, el tipo indica la unidad de carga. Consulta los Transition.vehicle_loads.

Visitar

Es una visita realizada durante una ruta. Esta visita corresponde a la recolección o entrega de un Shipment.

Campos
shipment_index

int32

Es el índice del campo shipments en el ShipmentModel de origen.

is_pickup

bool

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

visit_request_index

int32

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

start_time

Timestamp

Hora en la que comienza la visita. Ten en cuenta que el vehículo puede llegar antes a la ubicación de la visita. Los tiempos son coherentes con los de ShipmentModel.

load_demands

map<string, Load>

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

detour

Duration

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

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

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

start_time - vehicle_start_time - travel duration from
the vehicle's `start_location` to the visit.
shipment_label

string

Es la copia del Shipment.label correspondiente, si se especifica en Shipment.

visit_label

string

Es la copia del VisitRequest.label correspondiente, si se especifica en VisitRequest.

ShipmentTypeIncompatibility

Especifica las incompatibilidades entre los envíos según su shipment_type. La aparición de envíos incompatibles en la misma ruta se restringe según el modo de incompatibilidad.

Campos
types[]

string

Es la lista de tipos incompatibles. Dos envíos que tienen shipment_types diferentes entre los que se enumeran son “incompatibles”.

incompatibility_mode

IncompatibilityMode

Es el modo que se aplica a la incompatibilidad.

IncompatibilityMode

Son modos que definen cómo se restringe la aparición de envíos incompatibles en la misma ruta.

Enumeraciones
INCOMPATIBILITY_MODE_UNSPECIFIED Modo de incompatibilidad no especificado. Este valor nunca debe usarse.
NOT_PERFORMED_BY_SAME_VEHICLE En este modo, dos envíos con tipos incompatibles nunca pueden compartir el mismo vehículo.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

Para dos envíos con tipos incompatibles con el modo de incompatibilidad NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY:

  • Si ambos son solo para retiros (sin entregas) o solo para entregas (sin retiros), no pueden compartir el mismo vehículo.
  • Si uno de los envíos tiene una entrega y el otro una recolección, los dos envíos pueden compartir el mismo vehículo si el primero se entrega antes de que se recoja el segundo.

ShipmentTypeRequirement

Especifica los requisitos entre los envíos según su shipment_type. El modo de requisito define los detalles del requisito.

Campos
required_shipment_type_alternatives[]

string

Es la lista de tipos de envío alternativos que requiere dependent_shipment_types.

dependent_shipment_types[]

string

Todos los envíos con un tipo en el campo dependent_shipment_types requieren que se visite al menos un envío de tipo required_shipment_type_alternatives en la misma ruta.

NOTA: No se permiten cadenas de requisitos de modo que un shipment_type dependa de sí mismo.

requirement_mode

RequirementMode

Es el modo aplicado al requisito.

RequirementMode

Son modos que definen la apariencia de los envíos dependientes en una ruta.

Enumeraciones
REQUIREMENT_MODE_UNSPECIFIED Modo de requisito no especificado. Este valor nunca debe usarse.
PERFORMED_BY_SAME_VEHICLE En este modo, todos los envíos “dependientes” deben compartir el mismo vehículo que al menos uno de sus envíos “obligatorios”.
IN_SAME_VEHICLE_AT_PICKUP_TIME

Con el modo IN_SAME_VEHICLE_AT_PICKUP_TIME, todos los envíos “dependientes” deben tener al menos un envío “obligatorio” en el vehículo en el momento de la recolección.

Por lo tanto, una recolección de envíos “dependiente” debe tener una de las siguientes opciones:

  • Un envío “obligatorio” de solo entrega que se entrega en la ruta después de
  • Un envío “obligatorio” que se haya retirado en la ruta anterior y, si el envío “obligatorio” tiene una entrega, esta debe realizarse después del retiro del envío “dependiente”.
IN_SAME_VEHICLE_AT_DELIVERY_TIME Igual que antes, excepto que los envíos "dependientes" deben tener un envío "obligatorio" en el vehículo en el momento de la entrega.

SkippedShipment

Especifica los detalles de los envíos no realizados en una solución. En el caso de los casos triviales o si podemos identificar la causa de la omisión, informamos el motivo aquí.

Campos
index

int32

El índice corresponde al índice del envío en el ShipmentModel de origen.

label

string

Es la copia del Shipment.label correspondiente, si se especifica en Shipment.

reasons[]

Reason

Una lista de motivos que explican por qué se omitió el envío. Consulta el comentario anterior a Reason. Si no podemos comprender por qué se omitió un envío, no se establecerán los motivos.

Motivo

Si podemos explicar por qué se omitió el envío, los motivos se indicarán aquí. Si el motivo no es el mismo para todos los vehículos, reason tendrá más de 1 elemento. Un envío omitido no puede tener motivos duplicados, es decir, que todos los campos sean iguales, excepto example_vehicle_index. Ejemplo:

reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 1
  example_exceeded_capacity_type: "Apples"
}
reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 3
  example_exceeded_capacity_type: "Pears"
}
reasons {
  code: CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT
  example_vehicle_index: 1
}

El envío omitido no es compatible con todos los vehículos. Los motivos pueden ser diferentes para todos los vehículos, pero se superaría la capacidad de "Manzanas" de al menos un vehículo (incluido el vehículo 1), la capacidad de "Peras" de al menos un vehículo (incluido el vehículo 3) y el límite de distancia de al menos un vehículo (incluido el vehículo 1).

Campos
code

Code

Consulta los comentarios de Code.

example_exceeded_capacity_type

string

Si el código de motivo es DEMAND_EXCEEDS_VEHICLE_CAPACITY, se documenta un tipo de capacidad que se superó.

example_vehicle_index

int32

Si el motivo se relaciona con una incompatibilidad entre el envío y el vehículo, este campo proporciona el índice de un vehículo relevante.

Código

Código que identifica el tipo de motivo. El orden aquí no tiene sentido. En particular, no indica si un motivo determinado aparecerá antes que otro en la solución, si ambos se aplican.

Enumeraciones
CODE_UNSPECIFIED Esto nunca debe usarse.
NO_VEHICLE No hay ningún vehículo en el modelo, por lo que todos los envíos son inviables.
DEMAND_EXCEEDS_VEHICLE_CAPACITY La demanda del envío supera la capacidad de un vehículo para algunos tipos de capacidad, uno de los cuales es example_exceeded_capacity_type.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT

La distancia mínima necesaria para realizar este envío, es decir, desde el start_location del vehículo hasta las ubicaciones de partida o destino del envío y hasta la ubicación de destino del vehículo, supera el route_distance_limit del vehículo.

Ten en cuenta que, para este cálculo, usamos las distancias geodésicas.

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT

El tiempo mínimo necesario para realizar este envío, incluido el tiempo de viaje, el tiempo de espera y el tiempo de servicio, supera el route_duration_limit del vehículo.

Nota: El tiempo de viaje se calcula en el mejor de los casos, es decir, como la distancia geodésica por 36 m/s (alrededor de 130 km/h).

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT Igual que lo anterior, pero solo comparamos el tiempo de viaje mínimo y el travel_duration_limit del vehículo.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS El vehículo no puede realizar este envío en el mejor de los casos (consulta CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT para el cálculo del tiempo) si comienza a la hora de inicio más temprana: el tiempo total haría que el vehículo finalice después de la hora de finalización más tardía.
VEHICLE_NOT_ALLOWED El campo allowed_vehicle_indices del envío no está vacío y este vehículo no le pertenece.

TimeWindow

Los períodos restringen la hora de un evento, como la hora de llegada a una visita o la hora de inicio y finalización de un vehículo.

Los límites de período rígidos, start_time y end_time, aplican la hora más temprana y la más reciente del evento, de modo que start_time <= event_time <= end_time. El límite inferior de la ventana de tiempo flexible, soft_start_time, expresa una preferencia para que el evento ocurra en soft_start_time o después de este, lo que genera un costo proporcional a cuánto tiempo antes de soft_start_time ocurre el evento. El límite superior de la ventana de tiempo flexible, soft_end_time, expresa una preferencia para que el evento ocurra en soft_end_time o antes, lo que genera un costo proporcional a cuánto tiempo después de soft_end_time ocurre el evento. start_time, end_time, soft_start_time y soft_end_time deben estar dentro de los límites de tiempo globales (consulta ShipmentModel.global_start_time y ShipmentModel.global_end_time) y deben respetar lo siguiente:

  0 <= `start_time` <= `end_time` and
  0 <= `start_time` <= `soft_start_time` and
  0 <= `soft_end_time` <= `end_time`.
Campos
start_time

Timestamp

Es la hora de inicio del período de tiempo fijo. Si no se especifica, se establecerá en ShipmentModel.global_start_time.

end_time

Timestamp

La hora de finalización del período fijo Si no se especifica, se establecerá en ShipmentModel.global_end_time.

soft_start_time

Timestamp

Es la hora de inicio flexible del período.

soft_end_time

Timestamp

Es la hora de finalización flexible del período.

cost_per_hour_before_soft_start_time

double

Es un costo por hora que se agrega a otros costos del modelo si el evento ocurre antes de soft_start_time, calculado de la siguiente manera:

   max(0, soft_start_time - t.seconds)
                          * cost_per_hour_before_soft_start_time / 3600,
t being the time of the event.

Este costo debe ser positivo, y el campo solo se puede establecer si se configuró soft_start_time.

cost_per_hour_after_soft_end_time

double

Es un costo por hora que se suma a otros costos del modelo si el evento ocurre después de soft_end_time, que se calcula de la siguiente manera:

   max(0, t.seconds - soft_end_time.seconds)
                    * cost_per_hour_after_soft_end_time / 3600,
t being the time of the event.

Este costo debe ser positivo, y el campo solo se puede establecer si se configuró soft_end_time.

TransitionAttributes

Especifica los atributos de las transiciones entre dos visitas consecutivas en una ruta. Es posible que se apliquen varios TransitionAttributes a la misma transición. En ese caso, se suman todos los costos adicionales y se aplica la restricción o el límite más estricto (según la semántica natural de "Y").

Campos
src_tag

string

Son etiquetas que definen el conjunto de transiciones (src->dst) a las que se aplican estos atributos.

Una visita a la fuente o un inicio de vehículo coinciden si su VisitRequest.tags o Vehicle.start_tags contiene src_tag o no contiene excluded_src_tag (según cuál de estos dos campos no esté vacío).

excluded_src_tag

string

Consulta los src_tag. Exactamente uno de src_tag y excluded_src_tag debe no estar vacío.

dst_tag

string

Una visita al destino o el final del viaje coinciden si su VisitRequest.tags o Vehicle.end_tags contiene dst_tag o no contiene excluded_dst_tag (según cuál de estos dos campos no esté vacío).

excluded_dst_tag

string

Consulta los dst_tag. Exactamente uno de dst_tag y excluded_dst_tag debe no estar vacío.

cost

double

Especifica un costo para realizar esta transición. Se expresa en la misma unidad que todos los demás costos del modelo y no debe ser negativo. Se aplica además de todos los demás costos existentes.

cost_per_kilometer

double

Especifica un costo por kilómetro aplicado a la distancia recorrida durante esta transición. Se suma a cualquier Vehicle.cost_per_kilometer especificado en los vehículos.

distance_limit

DistanceLimit

Especifica un límite para la distancia recorrida durante la realización de esta transición.

A partir de junio de 2021, solo se admiten límites flexibles.

delay

Duration

Especifica una demora que se produce cuando se realiza esta transición.

Esta demora siempre ocurre después de finalizar la visita a la fuente y antes de iniciar la visita al destino.

Vehículo

Representa un vehículo con un problema de envío. Si resuelves un problema de envío, se creará una ruta que comenzará en start_location y terminará en end_location para este vehículo. Una ruta es una secuencia de visitas (consulta ShipmentRoute).

Campos
display_name

string

Es el nombre visible del vehículo definido por el usuario. Puede tener hasta 63 caracteres y puede usar caracteres UTF-8.

travel_mode

TravelMode

El modo de viaje, que afecta las rutas que puede usar el vehículo y su velocidad. Consulta también travel_duration_multiple.

route_modifiers

RouteModifiers

Es un conjunto de condiciones que se deben cumplir y que afectan la forma en que se calculan las rutas para el vehículo determinado.

start_location

LatLng

Es la ubicación geográfica donde comienza el vehículo antes de recoger los envíos. Si no se especifica, el vehículo comienza en su primer punto de partida. Si el modelo de envío tiene matrices de duración y distancia, no se debe especificar start_location.

start_waypoint

Waypoint

Punto de referencia que representa una ubicación geográfica donde comienza el vehículo antes de recoger los envíos. Si no se especifican start_waypoint ni start_location, el vehículo comienza en su primer punto de partida. Si el modelo de envío tiene matrices de duración y distancia, no se debe especificar start_waypoint.

end_location

LatLng

Es la ubicación geográfica donde finaliza el vehículo después de completar su último VisitRequest. Si no se especifica, el ShipmentRoute del vehículo finaliza de inmediato cuando completa su último VisitRequest. Si el modelo de envío tiene matrices de duración y distancia, no se debe especificar end_location.

end_waypoint

Waypoint

Punto de referencia que representa una ubicación geográfica en la que finaliza el vehículo después de completar su último VisitRequest. Si no se especifican end_waypoint ni end_location, el ShipmentRoute del vehículo finaliza de inmediato cuando completa su último VisitRequest. Si el modelo de envío tiene matrices de duración y distancia, no se debe especificar end_waypoint.

start_tags[]

string

Especifica las etiquetas adjuntas al inicio de la ruta del vehículo.

No se permiten cadenas vacías ni duplicadas.

end_tags[]

string

Especifica las etiquetas adjuntas al final de la ruta del vehículo.

No se permiten cadenas vacías ni duplicadas.

start_time_windows[]

TimeWindow

Son los períodos durante los cuales el vehículo puede salir de su ubicación de partida. Deben estar dentro de los límites de tiempo globales (consulta los campos ShipmentModel.global_*). Si no se especifica, no hay limitaciones además de esos límites de tiempo globales.

Los períodos que pertenecen al mismo campo repetido deben ser disjuntos, es decir, ningún período puede superponerse con otro ni estar adyacente a otro, y deben estar en orden cronológico.

cost_per_hour_after_soft_end_time y soft_end_time solo se pueden configurar si hay un solo período.

end_time_windows[]

TimeWindow

Son los períodos durante los cuales el vehículo puede llegar a su ubicación de destino. Deben estar dentro de los límites de tiempo globales (consulta los campos ShipmentModel.global_*). Si no se especifica, no hay limitaciones además de esos límites de tiempo globales.

Los períodos que pertenecen al mismo campo repetido deben ser disjuntos, es decir, ningún período puede superponerse con otro ni estar adyacente a otro, y deben estar en orden cronológico.

cost_per_hour_after_soft_end_time y soft_end_time solo se pueden configurar si hay un solo período.

unloading_policy

UnloadingPolicy

Se aplicó la política de descarga en el vehículo.

load_limits

map<string, LoadLimit>

Capacidades del vehículo (por ejemplo, peso, volumen, cantidad de palés) Las claves del mapa son los identificadores del tipo de carga, coherentes con las claves del campo Shipment.load_demands. Si no hay una clave determinada en este mapa, se considera que la capacidad correspondiente no tiene límites.

cost_per_hour

double

Costos del vehículo: Todos los costos se suman y deben estar en la misma unidad que Shipment.penalty_cost.

Es el costo por hora de la ruta del vehículo. Este costo se aplica al tiempo total que tarda la ruta y, además, incluye el tiempo de viaje, el tiempo de espera y el tiempo de visita. El uso de cost_per_hour en lugar de solo cost_per_traveled_hour puede generar latencia adicional.

cost_per_traveled_hour

double

Es el costo por hora recorrida de la ruta del vehículo. Este costo se aplica solo al tiempo de viaje que tarda la ruta (es decir, el que se informa en ShipmentRoute.transitions) y excluye el tiempo de espera y el tiempo de visita.

cost_per_kilometer

double

Es el costo por kilómetro de la ruta del vehículo. Este costo se aplica a la distancia informada en ShipmentRoute.transitions y no a ninguna distancia recorrida implícitamente de arrival_location a departure_location de un solo VisitRequest.

fixed_cost

double

Es el costo fijo que se aplica si se usa este vehículo para manejar un envío.

used_if_route_is_empty

bool

Este campo solo se aplica a los vehículos cuando su ruta no entrega ningún envío. Indica si el vehículo se debe considerar usado o no en este caso.

Si es verdadero, el vehículo va de su ubicación de inicio a la de destino, incluso si no entrega ningún envío, y se tienen en cuenta los costos de tiempo y distancia que resultan del viaje de inicio a destino.

De lo contrario, no viaja desde su ubicación de inicio hasta la de destino, y no se programan break_rule ni demoras (de TransitionAttributes) para este vehículo. En este caso, el ShipmentRoute del vehículo no contiene información, excepto el índice y la etiqueta del vehículo.

route_duration_limit

DurationLimit

Es el límite que se aplica a la duración total de la ruta del vehículo. En un OptimizeToursResponse determinado, la duración de la ruta de un vehículo es la diferencia entre su vehicle_end_time y vehicle_start_time.

travel_duration_limit

DurationLimit

Es el límite que se aplica a la duración del viaje de la ruta del vehículo. En un OptimizeToursResponse determinado, la duración del viaje de la ruta es la suma de todos sus transitions.travel_duration.

route_distance_limit

DistanceLimit

Es el límite que se aplica a la distancia total de la ruta del vehículo. En un OptimizeToursResponse determinado, la distancia de la ruta es la suma de todos sus transitions.travel_distance_meters.

extra_visit_duration_for_visit_type

map<string, Duration>

Especifica un mapa de cadenas de visit_types a duraciones. La duración es el tiempo adicional a VisitRequest.duration que se debe tomar en las visitas con el visit_types especificado. Esta duración de visita adicional agrega un costo si se especifica cost_per_hour. Las claves (es decir, visit_types) no pueden ser cadenas vacías.

Si una solicitud de visita tiene varios tipos, se agregará una duración para cada uno de ellos en el mapa.

break_rule

BreakRule

Describe el programa de descansos que se aplicará en este vehículo. Si está vacío, no se programarán descansos para este vehículo.

label

string

Especifica una etiqueta para este vehículo. Esta etiqueta se informa en la respuesta como el vehicle_label del ShipmentRoute correspondiente.

ignore

bool

Si es verdadero, used_if_route_is_empty debe ser falso y este vehículo no se usará.

Si un vehículo ignorado realiza un envío en injected_first_solution_routes, se omite en la primera solución, pero se puede realizar en la respuesta.

Si un vehículo ignorado realiza un envío en injected_solution_constraint y cualquier retiro o entrega relacionados se restringen para permanecer en el vehículo (es decir, no se relajan al nivel RELAX_ALL_AFTER_THRESHOLD), se omite en la respuesta. Si un envío tiene un campo allowed_vehicle_indices no vacío y se ignoran todos los vehículos permitidos, se omite en la respuesta.

travel_duration_multiple

double

Especifica un factor multiplicativo que se puede usar para aumentar o disminuir los tiempos de viaje de este vehículo. Por ejemplo, si se establece en 2.0, significa que este vehículo es más lento y tiene tiempos de viaje el doble de los que tienen los vehículos estándar. Este múltiplo no afecta las duraciones de las visitas. Sí afecta el costo si se especifican cost_per_hour o cost_per_traveled_hour. Debe estar en el rango [0.001, 1000.0]. Si no se establece, el vehículo es estándar y este múltiplo se considera 1.0.

ADVERTENCIA: Los tiempos de viaje se redondearán al segundo más cercano después de aplicar este múltiplo, pero antes de realizar cualquier operación numérica. Por lo tanto, un múltiplo pequeño puede provocar una pérdida de precisión.

Consulta también extra_visit_duration_for_visit_type a continuación.

DurationLimit

Es un límite que define una duración máxima de la ruta de un vehículo. Puede ser duro o blando.

Cuando se define un campo de límite flexible, se deben definir juntos el umbral máximo flexible y su costo asociado.

Campos
max_duration

Duration

Es un límite estricto que restringe la duración a un máximo de max_duration.

soft_max_duration

Duration

Un límite flexible no aplica un límite de duración máxima, pero, cuando se incumple, hace que la ruta incurra en un costo. Este costo se suma a otros costos definidos en el modelo, con la misma unidad.

Si se define, soft_max_duration debe ser no negativa. Si también se define max_duration, soft_max_duration debe ser menor que max_duration.

quadratic_soft_max_duration

Duration

Un límite flexible no aplica un límite de duración máximo, pero cuando se incumple, hace que la ruta incurra en un costo cuadrático en la duración. Este costo se suma a otros costos definidos en el modelo, con la misma unidad.

Si se define, quadratic_soft_max_duration debe ser no negativa. Si también se define max_duration, quadratic_soft_max_duration debe ser menor que max_duration y la diferencia no debe ser mayor que un día:

max_duration - quadratic_soft_max_duration <= 86400 seconds

cost_per_hour_after_soft_max

double

Es el costo por hora que se genera si se incumple el límite de soft_max_duration. El costo adicional es de 0 si la duración es inferior al umbral. De lo contrario, el costo depende de la duración de la siguiente manera:

  cost_per_hour_after_soft_max * (duration - soft_max_duration)

El costo no debe ser negativo.

cost_per_square_hour_after_quadratic_soft_max

double

Es el costo por hora cuadrada que se genera si se incumple el límite de quadratic_soft_max_duration.

El costo adicional es de 0 si la duración es inferior al umbral. De lo contrario, el costo depende de la duración de la siguiente manera:

  cost_per_square_hour_after_quadratic_soft_max *
  (duration - quadratic_soft_max_duration)^2

El costo no debe ser negativo.

LoadLimit

Define un límite de carga que se aplica a un vehículo, p.ej., "este camión solo puede transportar hasta 3,500 kg". Consulta los load_limits.

Campos
soft_max_load

int64

Es un límite flexible de la carga. Consulta los cost_per_unit_above_soft_max.

cost_per_unit_above_soft_max

double

Si la carga supera soft_max_load a lo largo de la ruta de este vehículo, se aplica la siguiente penalización de costos (solo una vez por vehículo): (carga - soft_max_load) * cost_per_unit_above_soft_max. Todos los costos se suman y deben estar en la misma unidad que Shipment.penalty_cost.

start_load_interval

Interval

Es el intervalo de carga aceptable del vehículo al comienzo de la ruta.

end_load_interval

Interval

Es el intervalo de carga aceptable del vehículo al final de la ruta.

max_load

int64

Es la cantidad máxima de carga aceptable.

Intervalo

Intervalo de cargas aceptables.

Campos
min

int64

Una carga mínima aceptable Debe ser ≥ 0. Si se especifican ambos, min debe ser ≤ max.

max

int64

Una carga máxima aceptable. Debe ser ≥ 0. Si no se especifica, este mensaje no restringe la carga máxima. Si se especifican ambos, min debe ser ≤ max.

TravelMode

Son los medios de transporte que pueden usar los vehículos.

Estos deben ser un subconjunto de los modos de viaje de la API de Routes Preferred de Google Maps Platform. Consulta: https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode.

Enumeraciones
TRAVEL_MODE_UNSPECIFIED Es el modo de viaje no especificado, equivalente a DRIVING.
DRIVING Es el modo de viaje correspondiente a las instrucciones sobre cómo llegar en automóvil (automóvil, etc.).
WALKING Es el modo de transporte correspondiente a las instrucciones sobre cómo llegar a pie.

UnloadingPolicy

Política sobre cómo se puede descargar un vehículo. Solo se aplica a los envíos que tienen un retiro y una entrega.

Los demás envíos pueden ocurrir en cualquier lugar de la ruta, independientemente de unloading_policy.

Enumeraciones
UNLOADING_POLICY_UNSPECIFIED Política de descarga no especificada: Las entregas deben realizarse después de los retiros correspondientes.
LAST_IN_FIRST_OUT Las entregas deben realizarse en orden inverso a las recuperaciones
FIRST_IN_FIRST_OUT Las entregas deben realizarse en el mismo orden que las recogidas

Punto de referencia

Encapsula un punto de referencia. Los puntos de referencia marcan las ubicaciones de llegada y salida de VisitRequests, y las ubicaciones de inicio y finalización de los vehículos.

Campos
side_of_road

bool

Opcional. Indica que la ubicación de este punto de referencia tiene la preferencia de que el vehículo se detenga en un lado particular de la ruta. Cuando establezcas este valor, la ruta pasará por la ubicación para que el vehículo pueda detenerse en el lado de la ruta hacia el que se orienta la ubicación desde el centro de la ruta. Esta opción no funciona para el modo de viaje "CAMINAR".

Campo de unión location_type. Son diferentes formas de representar una ubicación. Las direcciones (location_type) solo pueden ser una de las siguientes opciones:
location

Location

Es un punto especificado con coordenadas geográficas, incluido un encabezado opcional.

place_id

string

El ID de lugar del lugar de interés asociado con el punto de referencia.