Package google.maps.routeoptimization.v1

Índice

RouteOptimization

Un servicio para optimizar los recorridos en vehículos.

Validez de ciertos tipos de campos:

  • google.protobuf.Timestamp
    • Los horarios se expresan en tiempo Unix: segundos desde 1970-01-01T00:00:00+00:00.
    • segundos debe estar en [0, 253402300799], es decir, en [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • nanos se debe desactivar o establecer en 0.
  • google.protobuf.Duration
    • segundos debe estar en [0, 253402300799], es decir, en [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • nanos se debe desactivar o establecer en 0.
  • google.type.LatLng
    • la latitud debe estar entre [-90.0, 90.0].
    • 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 vehículos para uno o más mensajes de OptimizeToursRequest como un lote.

Este método es una operación de larga duración (LRO). Las entradas para la optimización (OptimizeToursRequest mensajes) y las salidas (OptimizeToursResponse mensajes) se leen o escriben desde y hacia 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 ShipmentRoute, que son un conjunto de rutas que deben realizar los vehículos para minimizar el costo total.

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 sus resultados estén disponibles en GCS.

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

Alcances 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 llevar a cabo 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, en el que un Visit corresponde a un VisitRequest, que es un retiro 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.

Alcances 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 de ShipmentRoute (resp. por OptimizeToursResponse para todos los elementos Transition o Visit (resp. de todos los ShipmentRoute).

Campos
performed_shipment_count

int32

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

travel_duration

Duration

Duración total del viaje de una ruta o una solución.

wait_duration

Duration

Duración de espera total 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

Duración total de las visitas 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

Distancia de viaje total para una ruta o una solución.

max_loads

map<string, VehicleLoad>

Carga máxima alcanzada en toda la ruta (solución correspondiente), para cada una de las cantidades en esta ruta (solución correspondiente), 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 de BatchOptimizeToursRequest

BatchOptimizeToursRequest

Solicitud para optimizar por lotes 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á automáticamente una región.

model_configs[]

AsyncModelConfig

Obligatorio. Información de entrada y salida de cada modelo de compra, como rutas de acceso de 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; los usuarios pueden usarlo como alias para realizar un seguimiento de los modelos.

input_config

InputConfig

Obligatorio. Información sobre el modelo de entrada.

output_config

OutputConfig

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

BatchOptimizeToursResponse

Este tipo no tiene campos.

Respuesta a un BatchOptimizeToursRequest. Esto se muestra en la operación de larga duración una vez que se completa la operación.

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. Es posible que se produzca una ruptura:

  • 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 del arranque del vehículo (es posible que no se encienda en medio de una pausa), en cuyo caso esto no afecta la hora de inicio del vehículo.
  • o después de que finaliza el vehículo (dito, con la hora de finalización del vehículo).
Campos
break_requests[]

BreakRequest

Secuencia de pausas. Lee el mensaje BreakRequest.

frequency_constraints[]

FrequencyConstraint

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

BreakRequest

La secuencia de descansos (es decir, el número y el orden) que corresponden a cada vehículo debe conocerse de antemano. Los objetos BreakRequest repetidos definen esa secuencia en el orden en que deben ocurrir. Sus períodos (earliest_start_time / latest_start_time) pueden superponerse, pero deben ser compatibles con el pedido (esto está marcado).

Campos
earliest_start_time

Timestamp

Obligatorio. Límite inferior (inclusivo) al inicio de la pausa.

latest_start_time

Timestamp

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

min_duration

Duration

Obligatorio. 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 mediante la aplicación de una frecuencia de pausa mínima, como "Debe haber una pausa de al menos 1 hora cada 12 horas". Si suponemos que esto se puede interpretar como "En cualquier período variable de 12 h, debe haber al menos una pausa de, al menos, una hora". Ese ejemplo se traduciría de la siguiente manera: 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 ya especificadas en el BreakRequest.

En la práctica, puede aplicarse una FrequencyConstraint a las pausas no consecutivas. Por ejemplo, el siguiente programa respeta el horario que indica "1 h cada 12 h". ejemplo:

  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. Duración mínima de la pausa para esta restricción. No es negativo. Consulta la descripción de FrequencyConstraint.

max_inter_break_duration

Duration

Obligatorio. Intervalo máximo permitido de cualquier intervalo de tiempo en la ruta que no incluye, al menos, una pausa de duration >= min_break_duration de forma parcial. Debe ser positivo.

DataFormat

Formatos de datos para archivos de entrada y salida.

Enumeraciones
DATA_FORMAT_UNSPECIFIED El valor no es válido. El formato no debe ser UNSPECIFIED.
JSON Notación de objetos de JavaScript.
PROTO_TEXT el formato de texto de los búferes de protocolo. 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 dura o blanda.

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

Campos
max_meters

int64

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 menor que max_meters y no debe ser negativo.

cost_per_kilometer_below_soft_max

double

Costo por kilómetro generado, que aumenta hasta soft_max_meters con la 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

Costo por kilómetro generado 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. El 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

Rutas de la solución para inyectar Algunas rutas pueden omitirse de la solución original. Las rutas y los envíos omitidos deben satisfacer las suposiciones de validez básicas que se indican para injected_first_solution_routes.

skipped_shipments[]

SkippedShipment

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

constraint_relaxations[]

ConstraintRelaxation

Para cero o más grupos de vehículos, especifica cuándo y en qué medida flexibilizar las restricciones. Si este campo está vacío, todas las rutas no vacías para vehículos tendrán una restricción total.

ConstraintRelaxation

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

Campos
relaxations[]

Relaxation

Todas las flexibilizaciones 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 relaxations se aplica a todos los vehículos que no se especifican en otros constraint_relaxations. Puede haber como máximo un campo predeterminado, es decir, un campo de relajación de restricciones como máximo puede estar 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ículos 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 el campo relaxations está vacío, la hora de inicio y la secuencia de todas las visitas del routes estarán completamente restringidas y no se podrán insertar ni agregar visitas nuevas a esas rutas. Además, la hora de inicio y finalización de un vehículo en routes tiene restricciones completas, a menos que el vehículo esté vacío (es decir, no tenga visitas y tenga el valor used_if_route_is_empty configurado como falso en el modelo).

relaxations(i).level especifica el nivel de flexibilización de restricciones aplicado a una visita #j que cumple con los siguientes requisitos:

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

De manera similar, el arranque del vehículo se relaja en 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 está relajado en relaxations(i).level si cumple con los siguientes requisitos:
  • 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 el threshold_visit_count O el threshold_time, agrega dos relaxations con el mismo level: uno con solo threshold_visit_count establecido y el otro con solo threshold_time configurado. Si una visita cumple con las condiciones de varios relaxations, se aplica el nivel más relajado. Como resultado, desde el inicio del vehículo hasta las visitas a la ruta hasta el final, 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 horario y la secuencia de las visitas de ruta que no cumplen con las condiciones límite de ninguna relaxations están completamente limitadas y no se puede insertar ninguna visita en estas secuencias. Además, si el inicio o la finalización de un vehículo no cumplen con las condiciones de relajación, el tiempo es fijo, a menos que el vehículo esté vacío.

Campos
level

Level

El nivel de relajación de la restricción que se aplica cuando se cumplen las condiciones en threshold_time o posteriores, Y al menos threshold_visit_count.

threshold_time

Timestamp

Hora en la que se puede aplicar la relajación level o después.

threshold_visit_count

int32

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

Si es route.visits_size() + 1, el level solo se puede aplicar al extremo del vehículo. Si es superior a route.visits_size() + 1, level no se aplica en absoluto a 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 siguiente enumeración está en orden de relajación creciente.

Enumeraciones
LEVEL_UNSPECIFIED

Nivel de relajación predeterminado implícito: Ninguna restricción es relajada, es decir, todas las visitas están completamente restringidas.

Este valor no se debe usar explícitamente 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á observar 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 en RELAX_VISIT_TIMES_AFTER_THRESHOLD, pero la secuencia de visitas también es relajada: solo este vehículo puede realizar visitas, pero es posible que dejen de realizarse.
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 una orientación opcional).

Campos
lat_lng

LatLng

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 el destino. Los valores de encabezado pueden variar de 0 a 360, donde 0 especifica la orientación hacia el norte, el 90 especifica la orientación hacia el este, etc.

OptimizeToursRequest

Solicitud que se debe proporcionar a un solucionador de problemas 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 finalice el tiempo de espera o se alcance el plazo 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 a 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 el algoritmo de optimización para encontrar una primera solución similar a la anterior.

El modelo está limitado cuando se compila la primera solución. Cualquier envío que no se realice en una ruta se omite de forma implícita en la primera solución, pero se pueden realizar en soluciones sucesivas.

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

  • Para todas las rutas, vehicle_index debe estar dentro del rango y no debe estar duplicado.
  • 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 mismo envío.
  • de todas las rutas, los horarios 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 el campo Shipment.allowed_vehicle_indices está vacío o si su vehicle_index está incluido en Shipment.allowed_vehicle_indices.

Si la solución inyectada no es factible, no se muestra necesariamente un error de validación y, en su lugar, puede devolverse un error que indica inviabilidad.

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 deben completarse, pero no deben modificarse.

Si la solución inyectada no es factible, no se muestra necesariamente un error de validación y, en su lugar, puede devolverse un error que indica inviabilidad.

refresh_details_routes[]

ShipmentRoute

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

A partir de 2020/11, esto solo propaga las polilíneas de rutas no vacías y 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 ni injected_solution_constraint.

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

interpret_injected_solutions_using_labels

bool

Si es verdadero:

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 envíos o vehículos de la solicitud o se agregaron a ella.

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 inyectada no corresponde a un vehículo solicitado, la ruta correspondiente se quita de la solución junto con sus visitas. Si una shipment_label en la solución inyectada no corresponde a un envío de solicitud, la visita correspondiente se quita de la solución. Si un SkippedShipment.label en la solución inyectada no corresponde a un envío de solicitud, se quita SkippedShipment de la solución.

Quitar las visitas de ruta o las 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 descritas anteriormente no son suficientes para garantizar este requisito.

consider_road_traffic

bool

Ten en cuenta la estimación del tráfico para calcular los campos Transition.travel_duration, Visit.start_time y vehicle_end_time de ShipmentRoute. para configurar el campo ShipmentRoute.has_traffic_infeasibilities y calcular el campo OptimizeToursResponse.total_cost.

populate_polylines

bool

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

populate_transition_polylines

bool

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

allow_large_deadline_despite_interruption_risk

bool

Si se establece, la solicitud puede tener un plazo (consulta https://grpc.io/blog/deadlines) de hasta 60 minutos. De lo contrario, el plazo máximo es 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 esta preferencia se establece como "true", 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 mediante distancias geodésicas con una velocidad definida por geodesic_meters_per_second.

label

string

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

geodesic_meters_per_second

double

Cuando use_geodesic_distances es verdadero, se debe establecer este campo y definir la velocidad aplicada 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 de 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 su límite es 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 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 la herramienta de resolución debe manejar 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 la mayor cantidad de OptimizeToursResponse.validation_errors 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 están configurados en la respuesta). Si se detectan incompatibilidades en las rutas de injected_solution_constraint, se propagan en el campo OptimizeToursResponse.validation_errors y el campo 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

Respuesta después de resolver un problema de optimización del recorrido que contiene las rutas seguidas por cada vehículo, los envíos que se omitieron y el costo total de la solución

Campos
routes[]

ShipmentRoute

Rutas calculadas para cada vehículo la i-ésima ruta corresponde al i-ésimo vehículo del modelo.

request_label

string

Copia de OptimizeToursRequest.label, si se especificó una etiqueta en la solicitud.

skipped_shipments[]

SkippedShipment

Se omite la lista de todos los envíos.

validation_errors[]

OptimizeToursValidationError

Lista de todos los errores de validación que pudimos detectar de forma independiente. Consulta “VARIOS ERRORES” explicación del 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 para esta solución.

Métricas

Métricas generales, agregadas en todas las rutas

Campos
aggregated_route_metrics

AggregatedMetrics

Corresponde a las rutas agregadas. Cada métrica es la suma (o máxima, para las cargas) de todos los campos ShipmentRoute.metrics del mismo nombre.

skipped_mandatory_shipment_count

int32

Cantidad de envíos obligatorios omitidos.

used_vehicle_count

int32

Cantidad de vehículos usados Nota: Si la ruta de un vehículo está vacía y el valor de Vehicle.used_if_route_is_empty es verdadero, el vehículo se considera usado.

earliest_vehicle_start_time

Timestamp

La hora de inicio más temprana de un vehículo usado, que se calcula como la hora mínima de ShipmentRoute.vehicle_start_time para todos los vehículos usados.

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>

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

total_cost

double

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

OptimizeToursValidationError

Describe un error o una advertencia que se encontró durante la validación de una OptimizeToursRequest.

Campos
code

int32

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

Otros campos (a continuación) proporcionan más contexto sobre el error.

VARIOS ERRORES: Cuando hay varios errores, el proceso de validación intenta generar 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. Algunas pueden provocar que el proceso de validación omita otros errores.

ESTIBILIDAD: 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 provocar que una solicitud determinada (no válida) genere un par diferente (code, display_name), porque el error nuevo ocultó el anterior (consulta "MULTIPLE ERRORS").

REFERENCE: una lista de todos los pares (código, nombre):

  • UNSPECIFIED = 0;
  • VALIDATION_TIMEOUT_ERROR = 10; No se pudo completar la validación dentro del plazo establecido.
  • REQUEST_OPTIONS_ERROR = 12;

    • REQUEST_OPTIONS_INVALID_SOLVING_MODE = 1201;
    • REQUEST_OPTIONS_INVALID_MAX_VALIDATION_ERRORS = 1,203;
    • REQUEST_OPTIONS_INVALID_GEODESIC_METERS_PER_SECOND = 1204;
    • REQUEST_OPTIONS_GEODESIC_METERS_PER_SECOND_TOO_SMALL = 1205;
    • REQUEST_OPTIONS_MISSING_GEODESIC_METERS_PER_SECOND = 1206;
    • REQUEST_OPTIONS_POPULATE_PATHFINDER_TRIPS_AND_GEODESIC_DISTANCE = 1207;
    • REQUEST_OPTIONS_COST_MODEL_OPTIONS_AND_GEODESIC_DISTANCE = 1,208;
    • REQUEST_OPTIONS_TRAVEL_MODE_INCOMPATIBLE_WITH_TRAFFIC = 1211;
    • REQUEST_OPTIONS_MULTIPLE_TRAFFIC_FLAVORS = 1212;
    • REQUEST_OPTIONS_INVALID_TRAFFIC_FLAVOR = 1213;
    • REQUEST_OPTIONS_TRAFFIC_HABILITADA_WITHOUT_GLOBAL_START_TIME = 1214;
    • REQUEST_OPTIONS_TRAFFIC_ENABLED_WITH_PRECEDENCES = 1215;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_MODE_INVALID = 1216;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_HABILITADA_WITHOUT_TRAFFIC = 1217;
  • INJECTED_SOLUTION_ERROR = 20;
    • INJECTED_SOLUTION_MISSING_LABEL = 2000;
    • INJECTED_SOLUTION_DUPLICATE_LABEL = 2001;
    • INJECTED_SOLUTION_AMBIGUOUS_INDEX = 2002;
    • INJECTED_SOLUTION_INFEASIBLE_after_GETTING_TRAVEL_TIMES = 2003;
    • INJECTED_SOLUTION_TRANSITION_INCONSISTENT_WITH_ACTUAL_TRAVEL = 2004;
    • INJECTED_SOLUTION_CONCURRENT_SOLUTION_TYPES = 2005;
    • INJECTED_SOLUTION_MORE_THAN_ONE_PER_TYPE = 2006;
    • INJECTED_SOLUTION_REFRESH_WITHOUT_POPULATE = 2008;
    • INJECTED_SOLUTION_CONSTRAINED_ROUTE_PORTION_INFEASIBLE = 2010;
  • SHIPMENT_MODEL_ERROR = 22;
    • SHIPMENT_MODEL_TOO_LARGE = 2200;
    • SHIPMENT_MODEL_TOO_MANY_CAPACITY_TYPES = 2201;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_NEGATIVE_OR_NAN = 2202;
    • SHIPMENT_MODEL_GLOBAL_END_TIME_TOO_LARGE_OR_NAN = 2203;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_AFTER_GLOBAL_END_TIME = 2204;
    • SHIPMENT_MODEL_GLOBAL_DURATION_TOO_LONG = 2205;
    • SHIPMENT_MODEL_MAX_ACTIVE_VEHICLES_NOT_POSITIVE = 2206;
    • SHIPMENT_MODEL_DURATION_MATRIX_TOO_LARGE = 2207;
  • INDEX_ERROR = 24;
  • TAG_ERROR = 26;
  • TIME_WINDOW_ERROR = 28;
    • TIME_WINDOW_INVALID_START_TIME = 2,800;
    • TIME_WINDOW_INVALID_END_TIME = 2,801;
    • TIME_WINDOW_INVALID_SOFT_START_TIME = 2,802;
    • TIME_WINDOW_INVALID_SOFT_END_TIME = 2803;
    • TIME_WINDOW_OUTSIDE_GLOBAL_TIME_WINDOW = 2804;
    • TIME_WINDOW_START_TIME_after_END_TIME = 2805;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_ antes_SOFT_START_TIME = 2,806;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_AFTER_SOFT_END_TIME = 2,807;
    • TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_WITHOUT_SOFT_START_TIME = 2808;
    • TIME_WINDOW_COST_after_SOFT_END_TIME_WITHOUT_SOFT_END_TIME = 2809;
    • TIME_WINDOW_SOFT_START_TIME_WITHOUT_COST_ antes_SOFT_START_TIME = 2810;
    • TIME_WINDOW_SOFT_END_TIME_WITHOUT_COST_AFTER_SOFT_END_TIME = 2811;
    • TIME_WINDOW_OVERLAPPING_ADJACENT_OR_EARLIER_THAN_PREVIOUS = 2812;
    • TIME_WINDOW_START_TIME_AFTER_SOFT_START_TIME = 2813;
    • TIME_WINDOW_SOFT_START_TIME_OUTSIDE_GLOBAL_TIME_WINDOW = 2819;
    • TIME_WINDOW_SOFT_END_TIME_OUTSIDE_GLOBAL_TIME_WINDOW = 2820;
    • TIME_WINDOW_SOFT_END_TIME_AFTER_END_TIME = 2816;
    • TIME_WINDOW_COST_PRIMARY_SOFT_START_TIME_SET_AND_MULTIPLE_WINDOWS = 2817;
    • TIME_WINDOW_COST_After_SOFT_END_TIME_SET_AND_MULTIPLE_WINDOWS = 2818;
    • TRANSITION_ATTRIBUTES_ERROR = 30;
    • TRANSITION_ATTRIBUTES_INVALID_COST = 3,000;
    • TRANSITION_ATTRIBUTES_INVALID_COST_PER_KILOMETER = 3001;
    • TRANSITION_ATTRIBUTES_DUPLICATE_TAG_PAIR = 3002;
    • TRANSITION_ATTRIBUTES_DISTANCE_LIMIT_MAX_METERS_UNSUPPORTED = 3003;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_SOURCE_TAGS = 3004;
    • TRANSITION_ATTRIBUTES_CONFLICTING_SOURCE_TAGS_FIELDS = 3005;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_DESTINATION_TAGS = 3006;
    • TRANSITION_ATTRIBUTES_CONFLICTING_DESTINATION_TAGS_FIELDS = 3007;
    • TRANSITION_ATTRIBUTES_DELAY_DURATION_NEGATIVE_OR_NAN = 3008;
    • TRANSITION_ATTRIBUTES_DELAY_DURATION_EXCEEDS_GLOBAL_DURATION = 3,009;
  • AMOUNT_ERROR = 31;
    • AMOUNT_NEGATIVE_VALUE = 3100;
  • LOAD_LIMIT_ERROR = 33;
    • LOAD_LIMIT_INVALID_COST_ABOVE_SOFT_MAX = 3303;
    • LOAD_LIMIT_SOFT_MAX_WITHOUT_COST_ABOVE_SOFT_MAX = 3304;
    • LOAD_LIMIT_COST_ABOVE_SOFT_MAX_WITHOUT_SOFT_MAX = 3305;
    • LOAD_LIMIT_NEGATIVE_SOFT_MAX = 3306;
    • LOAD_LIMIT_MIXED_DEMAND_TYPE = 3307;
    • LOAD_LIMIT_MAX_LOAD_NEGATIVE_VALUE = 3308;
    • LOAD_LIMIT_SOFT_MAX_ABOVE_MAX = 3309;
  • INTERVAL_ERROR = 34;
    • INTERVAL_MIN_EXCEEDS_MAX = 3401;
    • INTERVAL_NEGATIVE_MIN = 3402;
    • INTERVAL_NEGATIVE_MAX = 3403;
    • INTERVAL_MIN_EXCEEDS_CAPACITY = 3404;
    • INTERVAL_MAX_EXCEEDS_CAPACITY = 3405;
  • DISTANCE_LIMIT_ERROR = 36;
    • DISTANCE_LIMIT_INVALID_COST_AFTER_SOFT_MAX = 3,601;
    • DISTANCE_LIMIT_SOFT_MAX_WITHOUT_COST_after_SOFT_MAX = 3602;
    • DISTANCE_LIMIT_COST_After_SOFT_MAX_WITHOUT_SOFT_MAX = 3,603;
    • DISTANCE_LIMIT_NEGATIVE_MAX = 3604;
    • DISTANCE_LIMIT_NEGATIVE_SOFT_MAX = 3605;
    • DISTANCE_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3606;
  • DURATION_LIMIT_ERROR = 38;
    • DURATION_LIMIT_MAX_DURATION_NEGATIVE_OR_NAN = 3800;
    • DURATION_LIMIT_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3801;
    • DURATION_LIMIT_INVALID_COST_PER_HOUR_after_SOFT_MAX = 3,802;
    • DURATION_LIMIT_SOFT_MAX_WITHOUT_COST_after_SOFT_MAX = 3803;
    • DURATION_LIMIT_COST_after_SOFT_MAX_WITHOUT_SOFT_MAX = 3804;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3805;
    • DURATION_LIMIT_INVALID_COST_AFTER_QUADRATIC_SOFT_MAX = 3806;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_COST_PER_SQUARE_HOUR = 3,807;
    • DURATION_LIMIT_COST_PER_SQUARE_HOUR_WITHOUT_QUADRATIC_SOFT_MAX = 3808;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_MAX = 3809;
    • DURATION_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3810;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_LARGER_THAN_MAX = 3,811;
    • DURATION_LIMIT_diff_BETWEEN_MAX_AND_QUADRATIC_SOFT_MAX_TOO_LARGE = 3,812;
    • DURATION_LIMIT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3,813;
    • DURATION_LIMIT_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3814;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3815;
  • SHIPMENT_ERROR = 40;
    • SHIPMENT_PD_LIMIT_WITHOUT_PICKUP_AND_DELIVERY = 4014;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_NEGATIVE_OR_NAN = 4000;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4,001;
    • SHIPMENT_PD_RELATIVE_DETOUR_LIMIT_INVALID = 4,015;
    • SHIPMENT_PD_DETOUR_LIMIT_AND_EXTRA_VISIT_DURATION = 4016;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_NEGATIVE_OR_NAN = 4002;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4,003;
    • SHIPMENT_EMPTY_SHIPMENT_TYPE = 4004;
    • SHIPMENT_NO_PICKUP_NO_DELIVERY = 4005;
    • SHIPMENT_INVALID_PENALTY_COST = 4006;
    • SHIPMENT_ALLOWED_VEHICLE_INDEX_OUT_OF_BOUNDS = 4007;
    • SHIPMENT_DUPLICATE_ALLOWED_VEHICLE_INDEX = 4008;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITHOUT_INDEX = 4009;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITH_INDEX = 4010;
    • SHIPMENT_INVALID_COST_FOR_VEHICLE = 4011;
    • SHIPMENT_COST_FOR_VEHICLE_INDEX_OUT_OF_BOUNDS = 4012;
    • SHIPMENT_DUPLICATE_COST_FOR_VEHICLE_INDEX = 4013;
  • VEHICLE_ERROR = 42;
    • VEHICLE_EMPTY_REQUIRED_OPERATOR_TYPE = 4200;
    • VEHICLE_DUPLICATE_REQUIRED_OPERATOR_TYPE = 4201;
    • VEHICLE_NO_OPERATOR_WITH_REQUIRED_OPERATOR_TYPE = 4202;
    • VEHICLE_EMPTY_START_TAG = 4203;
    • VEHICLE_DUPLICATE_START_TAG = 4204;
    • VEHICLE_EMPTY_END_TAG = 4205;
    • VEHICLE_DUPLICATE_END_TAG = 4206;
    • VEHICLE_EXTRA_VISIT_DURATION_NEGATIVE_OR_NAN = 4207;
    • VEHICLE_EXTRA_VISIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4208;
    • VEHICLE_EXTRA_VISIT_DURATION_EMPTY_KEY = 4209;
    • VEHICLE_FIRST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4210;
    • VEHICLE_FIRST_SHIPMENT_IGNORED = 4211;
    • VEHICLE_FIRST_SHIPMENT_NOT_BOUND = 4212;
    • VEHICLE_LAST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4213;
    • VEHICLE_LAST_SHIPMENT_IGNORED = 4214;
    • VEHICLE_LAST_SHIPMENT_NOT_BOUND = 4215;
    • VEHICLE_IGNORED_WITH_used_IF_ROUTE_IS_EMPTY = 4216;
    • VEHICLE_INVALID_COST_PER_KILOMETER = 4217;
    • VEHICLE_INVALID_COST_PER_HOUR = 4218;
    • VEHICLE_INVALID_COST_PER_TRAVELED_HOUR = 4219;
    • VEHICLE_INVALID_FIXED_COST = 4220;
    • VEHICLE_INVALID_TRAVEL_DURATION_MULTIPLE = 4221;
    • VEHICLE_TRAVEL_DURATION_MULTIPLE_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4223;
    • VEHICLE_MATRIX_INDEX_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4224;
    • VEHICLE_Minimum_DURATION_LONGER_THAN_DURATION_LIMIT = 4222;
  • VISIT_REQUEST_ERROR = 44;
    • VISIT_REQUEST_EMPTY_TAG = 4,400;
    • VISIT_REQUEST_DUPLICATE_TAG = 4401;
    • VISIT_REQUEST_DURATION_NEGATIVE_OR_NAN = 4404;
    • VISIT_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4,405;
  • PRECEDENCE_ERROR = 46;
    • PRECEDENCE_RULE_MISSING_FIRST_INDEX = 4600;
    • PRECEDENCE_RULE_MISSING_SECOND_INDEX = 4601;
    • PRECEDENCE_RULE_FIRST_INDEX_OUT_OF_BOUNDS = 4602;
    • PRECEDENCE_RULE_SECOND_INDEX_OUT_OF_BOUNDS = 4603;
    • PRECEDENCE_RULE_DUPLICATE_INDEX = 4604;
    • PRECEDENCE_RULE_INEXISTENT_FIRST_VISIT_REQUEST = 4605;
    • PRECEDENCE_RULE_INEXISTENT_SECOND_VISIT_REQUEST = 4606;
  • BREAK_ERROR = 48;
    • BREAK_RULE_EMPTY = 4800;
    • BREAK_REQUEST_UNSPECIFIED_DURATION = 4801;
    • BREAK_REQUEST_UNSPECIFIED_EARLIEST_START_TIME = 4802;
    • BREAK_REQUEST_UNSPECIFIED_LATEST_START_TIME = 4803;
    • BREAK_REQUEST_DURATION_NEGATIVE_OR_NAN = 4804; = 4804;
    • BREAK_REQUEST_LATEST_START_TIME_BEFORE_EARLIEST_START_TIME = 4805;
    • BREAK_REQUEST_EARLIEST_START_TIME_BEFORE_GLOBAL_START_TIME = 4806;
    • BREAK_REQUEST_LATEST_END_TIME_after_GLOBAL_END_TIME = 4807;
    • BREAK_REQUEST_NON_SCHEDULABLE = 4808;
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_NEGATIVE_OR_NAN = 4809;
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_NEGATIVE_OR_NAN = 4810;
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4,811;
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4,812;
    • BREAK_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4,813;
    • BREAK_FREQUENCY_MISSING_MAX_INTER_BREAK_DURATION = 4814;
    • BREAK_FREQUENCY_MISSING_MIN_BREAK_DURATION = 4815;
  • SHIPMENT_TYPE_INCOMPATIBILITY_ERROR = 50;
    • SHIPMENT_TYPE_INCOMPATIBILITY_EMPTY_TYPE = 5001;
    • SHIPMENT_TYPE_INCOMPATIBILITY_LESS_THAN_TWO_TYPES = 5002;
    • SHIPMENT_TYPE_INCOMPATIBILITY_DUPLICATE_TYPE = 5003;
    • SHIPMENT_TYPE_INCOMPATIBILITY_INVALID_INCOMPATIBILITY_MODE = 5004;
    • SHIPMENT_TYPE_INCOMPATIBILITY_TOO_MANY_INCOMPATIBILITIES = 5005;
  • SHIPMENT_TYPE_REQUIREMENT_ERROR = 52;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE = 52001;
    • SHIPMENT_TYPE_REQUIREMENT_NO_DEPENDENT_TYPE = 52002;
    • SHIPMENT_TYPE_REQUIREMENT_INVALID_REQUIREMENT_MODE = 52003;
    • SHIPMENT_TYPE_REQUIREMENT_TOO_MANY_REQUIREMENTS = 52004;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_REQUIRED_TYPE = 52005;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_REQUIRED_TYPE = 52006;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE_FOUND = 52007;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_DEPENDENT_TYPE = 52008;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_DEPENDENT_TYPE = 52009;
    • SHIPMENT_TYPE_REQUIREMENT_SELF_DEPENDENT_TYPE = 52010;
    • SHIPMENT_TYPE_REQUIREMENT_GRAPH_HAS_CYCLES = 52,011;
  • VEHICLE_OPERATOR_ERROR = 54;
    • VEHICLE_OPERATOR_EMPTY_TYPE = 5400;
    • VEHICLE_OPERATOR_MULTIPLE_START_TIME_WINDOWS = 5401;
    • VEHICLE_OPERATOR_SOFT_START_TIME_WINDOW = 5402;
    • VEHICLE_OPERATOR_MULTIPLE_END_TIME_WINDOWS = 5403;
    • VEHICLE_OPERATOR_SOFT_END_TIME_WINDOW = 5404;
  • DURATION_SECONDS_MATRIX_ERROR = 56;
    • DURATION_SECONDS_MATRIX_DURATION_NEGATIVE_OR_NAN = 5600;
    • DURATION_SECONDS_MATRIX_DURATION_EXCEEDS_GLOBAL_DURATION = 5601;
  • WARNING = 9;
    • WARNING_INJECTED_FIRST_SOLUTION = 90;
      • WARNING_INJECTED_FIRST_SOLUTION_INFEASIBLE_SHIPMENTS_REMOVED = 9,000;
      • WARNING_INJECTED_FIRST_SOLUTION_INFEASIBLE_after_GETTING_TRAVEL_TIMES = 9001;
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, hacer referencia al vehículo núm. 4 y al primer retiro del envío núm. 2 se puede hacer 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

Cadena legible que describe el error Hay una asignación 1:1 entre code y error_message (cuando el código es != "UNSPECIFIED").

ESTABILIDAD: No estable: el mensaje de error asociado a un code determinado puede cambiar (con suerte para aclararlo) con el tiempo. En su lugar, confía en 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 usarlo solo para la depuración manual del modelo.

FieldReference

Especifica un contexto para el error de validación. Un FieldReference siempre hace referencia a un campo determinado en este archivo y sigue la misma estructura jerárquica. Por ejemplo, podríamos especificar el elemento no 2 de start_time_windows del vehículo no 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 se sature.

Campos
name

string

Es el nombre del campo, p. ej., "vehículos".

sub_field

FieldReference

Subcampo anidado de forma recurrente, si es necesario.

Campo de unión index_or_key.

index_or_key puede ser una de las siguientes opciones:

index

int32

Índice del campo si se repite.

key

string

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 al calcular 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á prioridad a las rutas que no contengan rutas con peaje. Solo se aplica a los medios de transporte motorizados.

avoid_highways

bool

Especifica si se deben evitar las autopistas cuando sea razonable. Se dará prioridad 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á prioridad a las rutas que no incluyan viajes en ferris. Solo se aplica a los modos de viaje motorizados.

avoid_indoor

bool

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

Envío

Es el envío de un solo artículo, desde uno de sus retiros hasta uno de sus entregas. 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 repuesto según corresponda) y, luego, visitar una de sus ubicaciones de entrega más adelante (y, por lo tanto, volver a aumentar sus capacidades libres 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 el conjunto de alternativas de retiro asociadas al envío. Si no se especifica, el vehículo solo deberá visitar la ubicación correspondiente a la entrega.

deliveries[]

VisitRequest

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

load_demands

map<string, Load>

Las demandas de carga 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, idealmente que también incluya 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ía, es posible que todos los vehículos la realicen. Los vehículos se proporcionan según 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:

  • 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 vehículos en el modelo. El elemento i-ésimo corresponde al vehículo núm. i del modelo.

Estos costos deben estar en la misma unidad que penalty_cost y no deben ser negativos. Si no hay tales costos, deje este campo vacío.

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 de desvío absoluto máximo en comparación con la ruta más corta desde el retiro hasta la entrega. Si se especifica, no debe ser negativo, y el envío debe contener al menos un retiro y una entrega.

Por ejemplo, que sea el tiempo más corto necesario para pasar de la alternativa de retiro seleccionada directamente a la alternativa de entrega seleccionada. Luego, configurar pickup_to_delivery_absolute_detour_limit aplica de manera forzosa lo siguiente:

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

Si se especifican límites relativos y absolutos en el mismo envío, se usa el límite más restrictivo para cada par posible de retiro y entrega. A partir de 2017/2010, los desvíos solo se admiten cuando la duración de los viajes no depende 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, no debe ser negativo, y el envío debe contener al menos un retiro y una entrega. Esto no depende de qué alternativas se seleccionen 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

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: Todos los retiros o las entregas 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 del shipment_label de la 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 costos en el modelo y debe ser positivo.

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

pickup_to_delivery_relative_detour_limit

double

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

Por ejemplo, que sea el tiempo más corto necesario para pasar de la alternativa de retiro seleccionada directamente a la alternativa de entrega seleccionada. Luego, configurar pickup_to_delivery_relative_detour_limit aplica de manera forzosa lo siguiente:

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

Si se especifican límites relativos y absolutos en el mismo envío, se usa el límite más restrictivo para cada par posible de retiro y entrega. A partir de 2017/2010, los desvíos solo se admiten cuando la duración de los viajes no depende 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

La cantidad de carga del vehículo que realiza la visita correspondiente variará. Como se trata de un número entero, se recomienda a los usuarios que elijan una unidad adecuada para evitar la pérdida de precisión. Debe ser mayor o igual que 0.

VisitRequest

Solicitud de una visita que se puede realizar desde un vehículo: tiene una ubicación geográfica (o dos, ver a continuación), horarios de apertura y cierre representados por períodos, y un tiempo de duración del servicio (tiempo que pasa el vehículo una vez que llega a retirar o dejar productos).

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

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

departure_location

LatLng

La ubicación geográfica donde 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

El punto de referencia desde el que sale el vehículo después de completar este VisitRequest. Se puede omitir si es igual que 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 o duplicadas.

time_windows[]

TimeWindow

Ventanas de tiempo que limitan la hora de llegada a 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 tiempo de espera si el vehículo llega antes de las TimeWindow.start_time.

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

Los períodos deben ser inconexos, es decir, no deben superponerse ni ser adyacentes a otros, 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

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

cost

double

Es el costo del servicio de esta solicitud de visita en una ruta vehicular. Se puede usar para pagar diferentes costos por cada retiro o entrega alternativo 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>

Cargar demandas de esta solicitud de visita. Es similar al campo Shipment.load_demands, con la excepción de que solo se aplica a este VisitRequest en lugar de a todo el Shipment. Las demandas que se enumeran aquí se agregan a las que se enumeran 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 un conjunto de vehículos debe realizar y, al mismo tiempo, minimiza el costo total, que es la suma de lo siguiente:

  • el costo de la planificación de ruta de los vehículos (suma del costo por tiempo total, costo por tiempo de viaje y costo fijo para todos los vehículos).
  • las penalizaciones por envíos no cumplidos.
  • 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 el conjunto de vehículos que se pueden usar para realizar visitas.

global_start_time

Timestamp

Hora de inicio y finalización globales del modelo: Ninguna hora fuera de este rango puede considerarse válida.

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 establecer esta ventana en un intervalo más pequeño para aumentar el rendimiento (p. ej., si haces un modelo de un solo día, debes establecer los límites de tiempo globales para ese día). Si no la estableces, se usará como valor predeterminado 00:00:00 UTC, 1 de enero de 1970 (es decir, segundos: 0, nanos: 0).

global_end_time

Timestamp

Si no la estableces, se usará como valor predeterminado 00:00:00 UTC, 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. Por ejemplo, los usuarios pueden asignar un costo por hora a esa cantidad para intentar optimizar la finalización del trabajo lo antes posible. 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 comienza su ruta en locA y finaliza en locA.
  • 1 solicitud de visita para retirar 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 inicia su ruta en la locA y la finaliza en locB, con la matriz “fast”.
  • 1 vehículo inicia su ruta en la locB y la finaliza en locB, con la matriz "slow".
  • 1 vehículo inicia su ruta en locB y lo finaliza en locB, mediante la matriz "fast".
  • 1 solicitud de visita para retirar 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 entre las visitas con la etiqueta duration_distance_matrix_src_tags(j) y 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 una Vehicle pueden ser iguales. Del mismo modo, las etiquetas de origen y destino de VisitRequest pueden ser iguales. Todas las etiquetas deben ser diferentes y no pueden ser cadenas vacías. Si este campo no está vacío, duration_distance_matrices no debe estar vacío.

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 (resp. la distancia) del viaje desde las visitas con la etiqueta duration_distance_matrix_src_tags(j) hasta 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 una Vehicle pueden ser iguales. Del mismo modo, las etiquetas de origen y destino de VisitRequest pueden ser iguales. Todas las etiquetas deben ser diferentes y no pueden ser cadenas vacías. Si este campo no está vacío, duration_distance_matrices no debe estar vacío.

transition_attributes[]

TransitionAttributes

Atributos de transición agregados al modelo.

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

Conjuntos de opciones de envío incompatibles (consulte ShipmentTypeIncompatibility).

shipment_type_requirements[]

ShipmentTypeRequirement

Conjuntos de requisitos de shipment_type (consulta ShipmentTypeRequirement).

precedence_rules[]

PrecedenceRule

Conjunto de reglas de precedencia que deben aplicarse en el modelo.

max_active_vehicles

int32

Restringe 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 utilizar para limitar la cantidad de rutas en los casos en que haya menos conductores que vehículos y la flota de vehículos sea heterogénea. 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 la visita y las ubicaciones de partida del vehículo para visitar, así como las ubicaciones de finalización 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

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 se ignoran de otra forma.

Campos
first_is_delivery

bool

Indica si el "primer" el evento es una entrega.

second_is_delivery

bool

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

offset_duration

Duration

El desplazamiento entre los "primeros" y "second" para cada evento. Puede ser negativo.

first_index

int32

Índice de envío del “primer” para cada evento. Se debe especificar este campo.

second_index

int32

Índice de envío del "segundo" para cada evento. Se debe especificar este campo.

ShipmentRoute

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

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

Ten en cuenta que hacemos una diferencia entre lo siguiente:

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

Invariantes:

  • Si hay n visitas, hay n+1 transiciones.
  • Una visita siempre está rodeada por una transición antes de ella (mismo índice) y una transición después de ella (índice + 1).
  • El inicio del vehículo siempre está seguido de la transición n° 0.
  • La transición #n siempre precede al final del vehículo.

Acerca la imagen. Esto es lo que sucede durante una Transition y una Visit:

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

Por último, aquí te mostramos cómo se pueden organizar los VIAJES, LOS DESCANSO, LA RETRASO y la ESPERA durante una transición.

  • No se superponen.
  • La demora es única y debe ser un período contiguo justo antes de la próxima visita (o la finalización 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 pausa.
  • 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 "esperar" llena el tiempo restante.

Un ejemplo (complejo):

                               TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
  ||     |       |           |       |           |         |         ||
  ||  T  |   B   |     T     |       |     B     |         |    D    ||
  ||  r  |   r   |     r     |   W   |     r     |    W    |    e    ||
  ||  a  |   e   |     a     |   a   |     e     |    a    |    l    ||
  ||  v  |   a   |     v     |   i   |     a     |    i    |    a    ||
  ||  e  |   k   |     e     |   t   |     k     |    t    |    y    ||
  ||  l  |       |     l     |       |           |         |         ||
  ||     |       |           |       |           |         |         ||
--++-----------------------------------------------------------------++-->
Campos
vehicle_index

int32

Vehículo que realiza la ruta, identificado por su índice en el origen ShipmentModel

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 finaliza su ruta.

visits[]

Visit

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

transitions[]

Transition

Es la lista ordenada de transiciones de la ruta.

has_traffic_infeasibilities

bool

Cuando la opción OptimizeToursRequest.consider_road_traffic se establece como verdadera, este campo indica que las inconsistencias en los horarios de la ruta se predicen mediante estimaciones de duración de 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 ocurra después de su período actual debido al aumento en la estimación del tiempo de viaje travel_duration(previous_visit, next_visit) debido al tráfico. Además, una pausa puede verse forzada a superponerse con una visita debido a un aumento en las estimaciones de tiempo de viaje y a las restricciones de los períodos de visitas o interrupciones.

route_polyline

EncodedPolyline

Representación de polilínea codificada de la ruta. Este campo solo se propaga si se establece OptimizeToursRequest.populate_polylines 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>

Costo de la ruta, desglosado por campos de solicitudes 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, los costos["model.shipments.pickups.cost"] es la suma de todos los costos de retiro en la ruta. Todos los costos definidos en el modelo se informan aquí en detalle, excepto los costos relacionados con TransitionAttributes que solo se informan de forma agregada a partir de 2022/01.

route_total_cost

double

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

Receso

Son datos que representan la ejecución de una pausa.

Campos
start_time

Timestamp

Es la hora de inicio de un descanso.

duration

Duration

Duración de la pausa.

EncodedPolyline

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

Campos
points

string

Cadena que representa 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

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 tráfico a través de OptimizeToursRequest.consider_road_traffic y la información sobre el tráfico no se pudo recuperar para un Transition, este valor booleano se establece como verdadero. Esto puede ser temporal (interrupción poco frecuente en los servidores de tráfico en tiempo real) o permanente (sin datos para esta ubicación).

delay_duration

Duration

Suma de las duraciones de los retrasos que se aplican a esta transición. Si hubiera alguno, el retraso comienza exactamente delay_duration segundos antes del próximo evento (finalización de la visita o el vehículo). Consulta los TransitionAttributes.delay.

break_duration

Duration

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

wait_duration

Duration

Tiempo de espera 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, proporcionada para mayor comodidad. Es igual a:

  • 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

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

vehicle_loads

map<string, VehicleLoad>

El vehículo se carga durante esta transición para cada tipo que aparezca en el Vehicle.load_limits de este vehículo o que tenga Shipment.load_demands distintos 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 próxima transición, dependiendo de si la visita fue un retiro 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

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

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

Campos
shipment_index

int32

Índice del campo shipments en la fuente ShipmentModel.

is_pickup

bool

Si es verdadero, la visita corresponde al retiro 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 a la que comienza la visita. Ten en cuenta que el vehículo puede llegar antes a la ubicación de la visita. Los horarios coinciden con el 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 corresponde a una entrega a domicilio. Las solicitudes se registran para los mismos tipos que Transition.loads (consulta este campo).

detour

Duration

Tiempo de desvío adicional 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 corresponde a una entrega a domicilio, 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

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

visit_label

string

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

ShipmentTypeIncompatibility

Especifica las incompatibilidades entre envíos según su tipo de envío. 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 con un shipment_types diferentes de los indicados son "incompatibles".

incompatibility_mode

IncompatibilityMode

Se aplicó el modo 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 ambas opciones son solo para retiros (no para entregas) o solo entregas (no retiros), no podrán compartir el mismo vehículo.
  • Si uno de los envíos tiene entrega y el otro tiene retiro, los dos envíos pueden compartir el mismo vehículo si el envío anterior se entrega antes de que se retire este último.

ShipmentTypeRequirement

Especifica los requisitos entre envíos según su tipo de envío. Los detalles del requisito se definen en función del modo de requisitos.

Campos
required_shipment_type_alternatives[]

string

Lista de tipos de envío alternativos que requiere dependent_shipment_types.

dependent_shipment_types[]

string

Todos los envíos con un tipo indicado en el campo dependent_shipment_types requieren que se visite al menos un envío del 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

Se aplica el modo al requisito.

RequirementMode

Modos que definen el aspecto de envíos dependientes en una ruta.

Enumeraciones
REQUIREMENT_MODE_UNSPECIFIED Modo de requisitos no especificado. Este valor nunca debe usarse.
PERFORMED_BY_SAME_VEHICLE En este modo, todo "dependiente" los envíos deben compartir el mismo vehículo que al menos uno de sus entre los envíos.
IN_SAME_VEHICLE_AT_PICKUP_TIME

Con el modo IN_SAME_VEHICLE_AT_PICKUP_TIME, todo “dependiente” los envíos deben tener al menos un envío en su vehículo al momento del retiro.

Un “dependiente” por lo tanto, el retiro del envío debe tener:

  • Un campo obligatorio solo para entregas envío entregado en la ruta después del
  • Un campo "obligatorio" envío recogido en la ruta antes de este y si la condición envío tiene una entrega, esta entrega debe realizarse después del dependiente retiro del envío.
IN_SAME_VEHICLE_AT_DELIVERY_TIME Igual que antes, excepto la cuenta "dependiente" los envíos deben tener un envío en el vehículo en el momento de la entrega.

SkippedShipment

Especifica los detalles de los envíos sin realizar en una solución. Para 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

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. Ver comentario arriba 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, las razones 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 las "manzanas" de al menos un vehículo se superará la capacidad (incluido el vehículo 1) y se superará el valor de "Peras" de al menos un vehículo se superaría la capacidad (incluido el vehículo 3) y se excedería el límite de distancia de al menos un vehículo (incluido el vehículo 1).

Campos
code

Code

Consulta los comentarios del Código.

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 está relacionado con una incompatibilidad de envío y vehículo, este campo proporciona el índice de un vehículo relevante.

Código

Código que identifica el tipo de motivo. En este caso, este orden no tiene sentido. En particular, no ofrece ninguna indicación sobre si un motivo determinado aparecerá antes que otro en la solución, si ambos aplican.

Enumeraciones
CODE_UNSPECIFIED Esto nunca debe usarse.
NO_VEHICLE No hay ningún vehículo en el modelo que hace que todos los envíos sean 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 de 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, incluidos 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 distancia geodésica x 36 m/s (aproximadamente 130 km/hora).

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT Igual que en el ejemplo 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 calcular el tiempo) si comienza en la hora de inicio más temprana: el tiempo total que el vehículo terminaría después de su última hora de finalización.
VEHICLE_NOT_ALLOWED El campo allowed_vehicle_indices del envío no está vacío y este vehículo no le pertenece.

TimeWindow

Las ventanas de tiempo limitan 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íodos de tiempo estricto, start_time y end_time, aplican la hora más temprana y más reciente del evento, de modo que start_time <= event_time <= end_time. El límite inferior del período flexible, soft_start_time, expresa una preferencia para que el evento ocurra en soft_start_time o después de esta si incurre en un costo proporcional a cuánto tiempo antes de que ocurra el evento soft_start_time. 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

La hora de inicio del período de tiempo real. Si no se especifica, se configurará como ShipmentModel.global_start_time.

end_time

Timestamp

Es la hora de finalización del período de tiempo real. Si no se especifica, se configurará como ShipmentModel.global_end_time.

soft_start_time

Timestamp

La hora de inicio suave del período.

soft_end_time

Timestamp

La hora de finalización suave 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

Un costo por hora agregado a otros costos en el modelo si el evento ocurre después del 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 atributos de transiciones entre dos visitas consecutivas en una ruta. Se pueden aplicar varios TransitionAttributes a la misma transición: en ese caso, todos los costos adicionales se suman y se aplica la restricción o el límite más estrictos (según la semántica natural “AND”).

Campos
src_tag

string

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

Una visita de origen o el inicio del vehículo coincide si su VisitRequest.tags o Vehicle.start_tags contienen src_tag o no contienen 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 o excluded_src_tag no debe 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 o excluded_dst_tag no debe estar vacío.

cost

double

Especifica un costo por realizar esta transición. Se encuentra en la misma unidad que todos los demás costos del modelo y no debe ser negativo. Este importe se suma a 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. Suma cualquier Vehicle.cost_per_kilometer especificado en los vehículos.

distance_limit

DistanceLimit

Especifica un límite para la distancia recorrida mientras se realiza esta transición.

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

delay

Duration

Especifica un retraso generado al realizar 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

Modela 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 finalizará a las end_location para este vehículo. Una ruta es una secuencia de visitas (consulta ShipmentRoute).

Campos
display_name

string

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

travel_mode

TravelMode

Indica el medio de transporte que afecta las rutas que utiliza 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 un vehículo determinado.

start_location

LatLng

Es la ubicación geográfica donde se inicia el vehículo antes de recoger cualquier envío. Si no se especifica, el vehículo inicia en el primer lugar 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 especifica start_waypoint ni start_location, el vehículo comienza en su primer recogida. Si el modelo de envío tiene matrices de duración y distancia, no se debe especificar start_waypoint.

end_location

LatLng

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 finalizará de inmediato cuando se complete el ú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 especifica 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 o duplicadas.

start_time_windows[]

TimeWindow

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 especifican, no hay limitación aparte de esos límites de tiempo globales.

Los períodos que pertenecen al mismo campo repetido deben ser inconexos, es decir, ningún período puede superponerse o ser 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 período único.

end_time_windows[]

TimeWindow

Períodos durante los cuales el vehículo puede llegar a su ubicación final. Deben estar dentro de los límites de tiempo globales (consulta los campos ShipmentModel.global_*). Si no se especifican, no hay limitación aparte de esos límites de tiempo globales.

Los períodos que pertenecen al mismo campo repetido deben ser inconexos, es decir, ningún período puede superponerse o ser 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 período único.

unloading_policy

UnloadingPolicy

Se aplica una política de descarga en el vehículo.

load_limits

map<string, LoadLimit>

Capacidades del vehículo (peso, volumen, cantidad de palés, por ejemplo) 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 de los vehículos: 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 toma la ruta y comprende el tiempo de viaje, de espera y de la visita. Usar 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 de la ruta (es decir, el que se informa en ShipmentRoute.transitions) y excluye el tiempo de espera y de la visita.

cost_per_kilometer

double

Costo por kilómetro de la ruta vehicular Este costo se aplica a la distancia informada en el ShipmentRoute.transitions y no se aplica a ninguna distancia recorrida implícitamente desde el arrival_location hasta el 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 vehículos cuando en su ruta no se hacen envíos. Indica si el vehículo se debe considerar como 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 sus vehicle_end_time y vehicle_start_time.

travel_duration_limit

DurationLimit

El límite 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

El límite 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 las cadenas visit_types y las duraciones. La duración es el tiempo adicional que se toma en VisitRequest.duration para las visitas con el visit_types especificado. Esta duración adicional de la visita 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 tipo en el mapa.

break_rule

BreakRule

Describe el programa de descanso 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 permanecerá sin uso.

Si un vehículo ignorado en injected_first_solution_routes realiza un envío, se omitirá en la primera solución, pero se podrá realizar libremente 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 que no está vacío y se ignoran todos los vehículos permitidos, este se omite en la respuesta.

travel_duration_multiple

double

Especifica un factor multiplicativo que se puede usar para aumentar o reducir los tiempos de viaje del vehículo. Por ejemplo, establecer este valor en 2.0 significa que este vehículo es más lento y tiene tiempos de viaje que son el doble de los que tienen los vehículos estándar. Esta cantidad múltiple no afecta la duración de las visitas. Afecta el costo si se especifican cost_per_hour o cost_per_traveled_hour. Debe pertenecer al 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 que se aplique este múltiplo, pero antes de realizar cualquier operación numérica, por lo tanto, un pequeño múltiplo puede generar 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 dura o blanda.

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

Campos
max_duration

Duration

Un límite estricto que restringe la duración a max_duration como máximo.

soft_max_duration

Duration

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

Si se define, soft_max_duration no debe ser negativo. 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 que no aplica un límite de duración máxima, pero, cuando se infringe, genera un costo cuadrático en la duración de la ruta. Este costo se suma a otros costos definidos en el modelo, con la misma unidad.

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

max_duration - quadratic_soft_max_duration <= 86400 seconds

cost_per_hour_after_soft_max

double

Costo por hora generado si se infringe el umbral de soft_max_duration. El costo adicional es de 0 si la duración está por debajo del umbral. De lo contrario, dependerá 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

Costo por hora cuadrada que se genera si se infringe el umbral de quadratic_soft_max_duration

El costo adicional es de 0 si la duración está por debajo del umbral. De lo contrario, dependerá 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

Un límite flexible de la carga Consulta los cost_per_unit_above_soft_max.

cost_per_unit_above_soft_max

double

Si en algún momento la carga supera los soft_max_load en la ruta de este vehículo, se aplicará la siguiente penalización de costo (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

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

end_load_interval

Interval

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

max_load

int64

La cantidad de carga máxima aceptable.

Intervalo

Intervalo de cantidades de carga aceptables

Campos
min

int64

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

max

int64

Una carga aceptable máxima Debe ser mayor o igual que 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.

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

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

UnloadingPolicy

Política sobre cómo se puede descargar un vehículo. Se aplica solo a los envíos que tengan retiro y 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 al de retiro
FIRST_IN_FIRST_OUT Las entregas deben realizarse en el mismo orden que los retiros

Punto de referencia

Encapsula un punto de referencia. Los puntos de referencia marcan las ubicaciones de llegada y salida de VisitRequests, así como las ubicaciones de partida y llegada de los Vehículos.

Campos
side_of_road

bool

Opcional. Indica que la ubicación de este punto de referencia tiene preferencia para que el vehículo se detenga en un lado en 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 “WALKING” medio de transporte.

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

Location

Es un punto que se especifica mediante coordenadas geográficas y que incluye una orientación opcional.

place_id

string

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