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
    • Las horas están en tiempo Unix: segundos desde 1970-01-01T00:00:00+00:00.
    • los segundos deben estar en [0, 253402300799], es decir, en [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • los nanosegundos no se deben configurar o se deben establecer en 0.
  • google.protobuf.Duration
    • los segundos deben estar en [0, 253402300799], es decir, en [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • los nanosegundos no se deben configurar o se deben establecer en 0.
  • google.type.LatLng
    • la latitud debe ser de [-90.0, 90.0].
    • la longitud debe estar en [-180.0, 180.0].
    • al menos uno de los valores de latitud y longitud no debe ser cero.
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

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

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

Permisos de autorización

Requiere el siguiente alcance de OAuth:

  • https://www.googleapis.com/auth/cloud-platform
OptimizeTours

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

Envía un OptimizeToursRequest con un ShipmentModel y muestra un OptimizeToursResponse con ShipmentRoute, que son un conjunto de rutas que realizarán los vehículos y que minimizan el costo general.

Un modelo ShipmentModel consta principalmente de Shipment que se deben realizar y Vehicle que se pueden usar para transportar los Shipment. Los ShipmentRoute asignan Shipment a Vehicle. Más concretamente, asigna una serie de elementos Visit a cada vehículo, en los que un Visit corresponde a un VisitRequest, que corresponde al retiro o la entrega de un Shipment.

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

Permisos de autorización

Requiere el siguiente alcance de OAuth:

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

AggregatedMetrics

Métricas agregadas de ShipmentRoute (resp. de OptimizeToursResponse en todos los elementos Transition o Visit [respetuos de todos los ShipmentRoute]).

Campos
performed_shipment_count

int32

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

travel_duration

Duration

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

wait_duration

Duration

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

delay_duration

Duration

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

break_duration

Duration

Duración total de la pausa para una ruta o solución.

visit_duration

Duration

Es la duración total de la visita para 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 total de viaje de una ruta o solución.

max_loads

map<string, VehicleLoad>

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

BatchOptimizeToursMetadata

Este tipo no tiene campos.

Metadatos de operación para llamadas a BatchOptimizeToursRequest.

BatchOptimizeToursRequest

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

Campos
parent

string

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

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

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

model_configs[]

AsyncModelConfig

Obligatorio. Información de entrada y salida en cada modelo de compra, como rutas 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. 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 la ubicación de salida deseada.

BatchOptimizeToursResponse

Este tipo no tiene campos.

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

BreakRule

Reglas para generar pausas para un vehículo (p.ej., horarios para almorzar). Una pausa es un período continuo durante el cual el vehículo permanece inactivo en su posición actual y no puede realizar ninguna visita. Puede producirse una pausa:

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

BreakRequest

La secuencia de las pausas. Revisa el mensaje BreakRequest.

frequency_constraints[]

FrequencyConstraint

Es posible que se apliquen varios FrequencyConstraint. Todos deben estar satisfechos con los BreakRequest de esta BreakRule. Consulta FrequencyConstraint.

BreakRequest

Se debe conocer de antemano la secuencia de descansos (es decir, su número y orden) que se aplican a cada vehículo. Los elementos 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á verificado).

Campos
earliest_start_time

Timestamp

Obligatorio. Límite inferior (inclusivo) al comienzo del descanso.

latest_start_time

Timestamp

Obligatorio. Límite superior (inclusivo) al comienzo del descanso.

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 aplicando 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 “Dentro de una ventana de tiempo variable de 12 h, debe haber al menos una pausa de al menos una hora”, ese ejemplo se traduciría a la siguiente FrequencyConstraint:

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

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

En la práctica, se puede aplicar un FrequencyConstraint a pausas no consecutivas. Por ejemplo, la siguiente programación respeta el ejemplo de "1 h cada 12 h":

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

Duration

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

max_inter_break_duration

Duration

Obligatorio. El intervalo máximo permitido de cualquier intervalo de tiempo de la ruta que no incluya, al menos, una pausa de duration >= min_break_duration. Debe ser positivo.

DataFormat

Formatos de datos para archivos de entrada y salida.

Enumeradores
DATA_FORMAT_UNSPECIFIED El valor no es válido. El formato no debe ser UNSPECIFIED.
JSON JavaScript Object Notation (Notación de objetos de JavaScript).
PROTO_TEXT Formato de texto de los búferes de protocolo Consulta https://protobuf.dev/reference/protobuf/textformat-spec/.

DistanceLimit

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

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

Campos
max_meters

int64

Un límite estricto que restringe la distancia a max_meters como máximo El límite no debe ser negativo.

soft_max_meters

int64

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

Si los soft_max_meters están definidos, deben ser inferiores a max_meters y no deben ser negativos.

cost_per_kilometer_above_soft_max

double

Costo por kilómetro acumulado 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 utiliza para calcular el costo es la siguiente:

  (distance_meters - soft_max_meters) / 1000.0 *
  cost_per_kilometer_above_soft_max.

El costo no debe ser negativo.

GcsDestination

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

Campos
uri

string

Obligatorio. URI de Google Cloud Storage.

GcsSource

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

Campos
uri

string

Obligatorio. 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 la información sobre qué visitas y cómo deben hacerlo.

Campos
routes[]

ShipmentRoute

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

skipped_shipments[]

SkippedShipment

Envíos omitidos de la solución que se inyecta. Algunos pueden omitirse de la solución original. Consulta el campo routes.

constraint_relaxations[]

ConstraintRelaxation

Especifica cuándo y cuánto debe flexibilizar las restricciones para cero o más grupos de vehículos. Si este campo está vacío, todas las rutas no vacías para vehículos tienen todas las limitaciones.

ConstraintRelaxation

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

Campos
relaxations[]

Relaxation

Todas las flexiones de las restricciones de visita 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 como la opción predeterminada, y relaxations se aplica a todos los vehículos que no se especificaron en otro constraint_relaxations. Puede haber un máximo de un valor predeterminado, es decir, un campo de relajación de restricciones como máximo vehicle_indices vacío. Un índice de vehículo solo se puede mostrar una vez, incluso en varias constraint_relaxations.

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

Relajación

Si el campo relaxations está vacío, la hora de inicio y la secuencia de todas las visitas del routes estarán totalmente limitadas, y no se podrán insertar ni agregar visitas nuevas a esas rutas. Además, las horas de inicio y finalización de un vehículo en routes tienen limitaciones totales, a menos que el vehículo esté vacío (es decir, no tiene visitas y se configuró used_if_route_is_empty como falso en el modelo).

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

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

De manera similar, el inicio del vehículo se relaja hasta relaxations(i).level si cumple con lo siguiente:

  • vehicle_start_time >= relaxations(i).threshold_time Y
  • relaxations(i).threshold_visit_count == 0 y la finalización del vehículo estará relajado hasta relaxations(i).level si cumple con lo siguiente:
  • vehicle_end_time >= relaxations(i).threshold_time Y
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

Para aplicar un nivel de relajación si una visita cumple con el threshold_visit_count O con el threshold_time, agrega dos relaxations con el mismo level: uno solo con threshold_visit_count establecido y el otro solo con threshold_time. Si una visita satisface 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 y hasta su finalización, el nivel de relajación se vuelve más relajado; es decir, el nivel de relajación no disminuye a medida que avanza la ruta.

El tiempo y la secuencia de visitas a la ruta que no cumplen con las condiciones de umbral de cualquier relaxations están completamente limitados, y no se pueden insertar visitas en estas secuencias. Además, si el arranque o la finalización de un vehículo no cumplen con las condiciones de relajación, el tiempo será fijo, a menos que el vehículo esté vacío.

Campos
level

Level

El nivel de relajación de restricciones que se aplica cuando se cumplen las condiciones en threshold_time y al menos threshold_visit_count.

threshold_time

Timestamp

Tiempo a partir del cual se puede aplicar la relajación level.

threshold_visit_count

int32

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

Si es route.visits_size() + 1, el level solo se puede aplicar al extremo del vehículo. Si es mayor que 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 se producen cuando esta satisface las condiciones de umbral.

La siguiente enumeración ordena el aumento de la relajación.

Enumeradores
LEVEL_UNSPECIFIED

Nivel de relajación predeterminado implícito: no hay restricciones de relajación, es decir, todas las visitas están totalmente limitadas.

Este valor no se debe usar explícitamente en level.

RELAX_VISIT_TIMES_AFTER_THRESHOLD Las horas de inicio y finalización del vehículo y las de inicio y finalización del vehículo serán relajadas, pero cada visita permanece vinculada al mismo vehículo y se debe respetar la secuencia de visitas: no se puede insertar ninguna visita entre ellos ni antes.
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD Es igual que RELAX_VISIT_TIMES_AFTER_THRESHOLD, pero la secuencia de visitas también es relajada: las visitas permanecen vinculadas simplemente al vehículo.
RELAX_ALL_AFTER_THRESHOLD Es igual que RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD, pero el vehículo también está tranquilo: las visitas son completamente gratuitas a la hora límite o después de ella, 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 datos de entrada.

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

GcsSource

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

Ubicación

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

Campos
lat_lng

LatLng

Las coordenadas geográficas del punto de referencia.

heading

int32

Indica la orientación según la brújula asociada con la dirección del flujo del tráfico. Este valor se utiliza para especificar el lado de la ruta que se usará para el punto de partida y el destino. Los valores de encabezado pueden ser de 0 a 360, donde 0 especifica la orientación hacia el norte, 90 indica la orientación hacia el este, etcétera.

OptimizeToursRequest

Solicitud para que se le presente a un solucionador de problemas de optimización de recorridos que define el modelo de envío que se debe resolver y los parámetros de optimización.

Campos
parent

string

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

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

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

timeout

Duration

Si se establece este tiempo de espera, el servidor mostrará una respuesta antes de que finalice el tiempo de espera o de que se alcance el plazo del servidor para las solicitudes síncronas, lo que ocurra primero.

Para las solicitudes asíncronas, el servidor generará una solución (si es posible) antes de que haya transcurrido 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

Modo de búsqueda que se usa para resolver la solicitud.

injected_first_solution_routes[]

ShipmentRoute

Guiar al algoritmo de optimización para que encuentre una primera solución similar a una anterior

El modelo se ve limitado cuando se compila la primera solución. Cualquier envío que no se realice en una ruta se omitirá implícitamente en la primera solución, pero se podrán 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 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.
  • el retiro de un envío para retiro debe realizarse antes de la entrega.
  • no se puede realizar más de una alternativa de retiro o entrega a un envío.
  • de todas las rutas, los horarios están aumentando (p.ej., vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time).
  • un envío solo puede realizarse en un vehículo permitido. Se permite un vehículo si Shipment.allowed_vehicle_indices está vacío o su vehicle_index se incluye en Shipment.allowed_vehicle_indices.

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

injected_solution_constraint

InjectedSolutionConstraint

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

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

refresh_details_routes[]

ShipmentRoute

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

A partir de 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 coincidan 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 afectan el comportamiento. Las polilíneas se siguen propagando entre todas las visitas de todas las rutas que no están 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ío o vehículos en 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 un shipment_label en la solución inyectada no corresponde al envío de una solicitud, se quita la visita correspondiente de la solución. Si un SkippedShipment.label en la solución insertada no corresponde al envío de una solicitud, se quita el SkippedShipment de la solución.

Quitar las visitas a rutas o rutas completas de una solución inyectada puede afectar 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 única una entidad de vehículo (envío de respuesta) utilizada en las dos solicitudes relevantes: la solicitud anterior que produjo el OptimizeToursResponse utilizado en la solución inyectada y la solicitud actual que incluye la solución inyectada. Las verificaciones de unicidad descritas anteriormente no son suficientes para garantizar este requisito.

consider_road_traffic

bool

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

populate_polylines

bool

Si es verdadero, las polilíneas se propagarán en 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 configura, 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 de 30 minutos. Ten en cuenta que las solicitudes de larga duración tienen un riesgo de interrupción significativamente mayor (pero aún pequeño).

use_geodesic_distances

bool

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

label

string

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

geodesic_meters_per_second

double

Cuando use_geodesic_distances es verdadero, se debe configurar este campo y se define la velocidad que se aplica para calcular los tiempos de viaje. Su valor debe ser de al menos 1 metros/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_ATTRIBUTE como detalle de error de BadRequest (https://cloud.google.com/apis/design/errors#error_details), a menos que resolviendo_mode=VALIDATE_ONLY: consulte el campo OptimizeToursResponse.validation_errors. El valor predeterminado es 100 y el límite es 10,000.

SearchMode

Modo que define el comportamiento de la búsqueda, sacrificando latencia de la calidad de la solución. En todos los modos, se aplica el plazo límite de solicitud global.

Enumeradores
SEARCH_MODE_UNSPECIFIED Modo de búsqueda sin especificar, equivalente a RETURN_FAST.
RETURN_FAST Detén la búsqueda después de encontrar la primera buena solución.
CONSUME_ALL_AVAILABLE_TIME Dedica todo el tiempo disponible a buscar mejores soluciones.

SolvingMode

Define la manera en que el solucionador 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.

Enumeradores
DEFAULT_SOLVE Resuelve el modelo.
VALIDATE_ONLY Solo valida el modelo sin resolverlo: propaga tantos OptimizeToursResponse.validation_errors como sea posible.
DETECT_SOME_INFEASIBLE_SHIPMENTS

Solo propaga OptimizeToursResponse.validation_errors o OptimizeToursResponse.skipped_shipments, y, en realidad, no resuelve el resto de la solicitud (status y routes no están configurados en la respuesta). Si se detectan incapacidades en las rutas de injected_solution_constraint, se propagarán en el campo OptimizeToursResponse.validation_errors y se dejará el campo OptimizeToursResponse.skipped_shipments vacío.

IMPORTANTE: Aquí no se devuelven todos los envíos inviables, sino solo los que se detecten 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 general 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

La lista de todos los envíos omitidos.

validation_errors[]

OptimizeToursValidationError

Lista de todos los errores de validación que pudimos detectar de forma independiente. Consulta la explicación de "VARIOS ERRORES" para el mensaje OptimizeToursValidationError.

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

Son datos agregados sobre las rutas. Cada métrica es la suma (o el máximo, para las cargas) en todos los campos ShipmentRoute.metrics con el 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 Vehicle.used_if_route_is_empty es verdadero, se considerará que el vehículo está usado.

earliest_vehicle_start_time

Timestamp

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

latest_vehicle_end_time

Timestamp

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

costs

map<string, double>

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

total_cost

double

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

OptimizeToursValidationError

Describe un error que se encontró al validar un OptimizeToursRequest.

Campos
code

int32

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

En otros campos (a continuación), se proporciona 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 son “fatales”, lo que significa que detienen todo el proceso de validación. Este es el caso de los errores display_name="UNSPECIFIED", entre otros. Algunas pueden hacer que el proceso de validación omita otros errores.

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

REFERENCIA: 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.
  • REQUEST_OPTIONS_ERROR = 12;

    • REQUEST_OPTIONS_INVALID_SOLVING_MODE = 1201;
    • REQUEST_OPTIONS_INVALID_MAX_VALIDATION_ERRORS = 1203;
    • REQUEST_OPTIONS_INVALID_GEODESIC_METERS_PER_SECOND = 1204;
    • REQUEST_OPTIONS_GEODESIC_METERS_PER_SECONDS_TOO_SMALL = 1,205;
    • REQUEST_OPTIONS_MISSING_GEODESIC_METERS_PER_SECOND = 1206;
    • REQUEST_OPTIONS_POPULATE_PATHFINDER_TRIPS_AND_GEODESIC_DISTANCE = 1,207;
    • REQUEST_OPTIONS_COST_MODEL_OPTIONS_AND_GEODESIC_DISTANCE = 1,208;
    • REQUEST_OPTIONS_TRAVEL_MODE_INCOMPATIBLE_WITH_TRAFFIC = 1,211;
    • REQUEST_OPTIONS_MULTIPLE_TRAFFIC_FLAVORS = 1,212;
    • REQUEST_OPTIONS_INVALID_TRAFFIC_FLAVOR = 1,213;
    • REQUEST_OPTIONS_TRAFFIC_Legacy_WITHOUT_GLOBAL_START_TIME = 1,214;
    • REQUEST_OPTIONS_TRAFFIC_ENABLED_WITH_PRECEDENCES = 1,215;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_MODE_INVALID = 1216;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_HOURS_WITHOUT_TRAFFIC = 1,217;
  • INJECTED_SOLUTION_ERROR = 20;
    • INJECTED_SOLUTION_MISSING_LABEL = 2,000;
    • INJECTED_SOLUTION_DUPLICATE_LABEL = 2,001;
    • INJECTED_SOLUTION_AMBIGUOUS_INDEX = 2002;
    • INJECTED_SOLUTION_INFEASIBLE_After_GETTING_TRAVEL_TIMES = 2,003;
    • INJECTED_SOLUTION_TRANSITION_INCONSISTENT_WITH_ACTUAL_TRAVEL = 2,004;
    • INJECTED_SOLUTION_CONCURRENT_SOLUTION_TYPES = 2,005;
    • INJECTED_SOLUTION_MORE_THAN_ONE_PER_TYPE = 2,006;
    • INJECTED_SOLUTION_REFRESH_WITHOUT_POPULATE = 2008;
    • INJECTED_SOLUTION_CONSTRAINED_ROUTE_PORTION_INFEASIBLE = 2010;
  • SHIPMENT_MODEL_ERROR = 22;
    • SHIPMENT_MODEL_TOO_LARGE = 2,200;
    • SHIPMENT_MODEL_TOO_MANY_CAPACITY_TYPES = 2,201;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_NEGATIVE_OR_NAN = 2,202;
    • SHIPMENT_MODEL_GLOBAL_END_TIME_TOO_LARGE_OR_NAN = 2,203;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_After_GLOBAL_END_TIME = 2,204;
    • SHIPMENT_MODEL_GLOBAL_DURATION_TOO_LONG = 2,205;
    • SHIPMENT_MODEL_MAX_ACTIVE_VEHICLES_NOT_POSITIVE = 2,206;
    • SHIPMENT_MODEL_DURATION_MATRIX_TOO_LARGE = 2,207;
  • INDEX_ERROR = 24;
  • TAG_ERROR = 26;
  • TIME_WINDOW_ERROR = 28;
    • TIME_WINDOW_INVALID_START_TIME = 2800;
    • TIME_WINDOW_INVALID_END_TIME = 2801;
    • TIME_WINDOW_INVALID_SOFT_START_TIME = 2,802;
    • TIME_WINDOW_INVALID_SOFT_END_TIME = 2,803;
    • TIME_WINDOW_OUTSIDE_GLOBAL_TIME_WINDOW = 2,804.
    • TIME_WINDOW_START_TIME_After_END_TIME = 2,805;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_Before_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 = 2,808.
    • TIME_WINDOW_COST_After_SOFT_END_TIME_WITHOUT_SOFT_END_TIME = 2,809;
    • TIME_WINDOW_SOFT_START_TIME_WITHOUT_COST_Before_SOFT_START_TIME = 2,810.
    • TIME_WINDOW_SOFT_END_TIME_WITHOUT_COST_NEXT_SOFT_END_TIME = 2,811;
    • TIME_WINDOW_OVERLAPPING_ADJACENT_OR_EARLIER_THAN_PREVIOUS = 2,812;
    • TIME_WINDOW_START_TIME_After_SOFT_START_TIME = 2,813;
    • TIME_WINDOW_SOFT_START_TIME_After_END_TIME = 2,814;
    • TIME_WINDOW_START_TIME_After_SOFT_END_TIME = 2,815;
    • TIME_WINDOW_SOFT_END_TIME_After_END_TIME = 2,816;
    • TIME_WINDOW_COST_before_SOFT_START_TIME_SET_AND_MULTIPLE_WINDOWS = 2,817;
    • TIME_WINDOW_COST_After_SOFT_END_TIME_SET_AND_MULTIPLE_WINDOWS = 2,818;
    • TRANSITION_ATTRIBUTES_ERROR = 30;
    • TRANSITION_ATTRIBUTES_INVALID_COST = 3000;
    • TRANSITION_ATTRIBUTES_INVALID_COST_PER_KILOMETER = 3,001;
    • TRANSITION_ATTRIBUTES_DUPLICATE_TAG_PAIR = 3,002;
    • TRANSITION_ATTRIBUTES_DISTANCE_LIMIT_MAX_METERS_UNSUPPORTED = 3,003;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_SOURCE_TAGS = 3,004;
    • TRANSITION_ATTRIBUTES_CONFLICTING_SOURCE_TAGS_FIELDS = 3,005;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_DESTINATION_TAGS = 3,006;
    • TRANSITION_ATTRIBUTES_CONFLICTING_DESTINATION_TAGS_FIELDS = 3,007;
    • TRANSITION_ATTRIBUTES_DELAY_DURATION_NEGATIVE_OR_NAN = 3,008;
    • TRANSITION_ATTRIBUTES_DELAY_DURATION_EXCEEDS_GLOBAL_DURATION = 3,009;
  • AMOUNT_ERROR = 31;
    • AMOUNT_NEGATIVE_VALUE = 3,100;
  • LOAD_LIMIT_ERROR = 33;
    • LOAD_LIMIT_INVALID_COST_ABOVE_SOFT_MAX = 3,303;
    • LOAD_LIMIT_SOFT_MAX_WITHOUT_COST_ABOVE_SOFT_MAX = 3,304;
    • LOAD_LIMIT_COST_ABOVE_SOFT_MAX_WITHOUT_SOFT_MAX = 3,305;
    • LOAD_LIMIT_NEGATIVE_SOFT_MAX = 3,306;
    • LOAD_LIMIT_MIXED_DEMAND_TYPE = 3,307;
    • LOAD_LIMIT_MAX_LOAD_NEGATIVE_VALUE = 3,308;
    • LOAD_LIMIT_SOFT_MAX_ABOVE_MAX = 3,309;
  • INTERVAL_ERROR = 34;
    • INTERVAL_MIN_EXCEEDS_MAX = 3,401;
    • INTERVAL_NEGATIVE_MIN = 3402;
    • INTERVAL_NEGATIVE_MAX = 3403;
    • INTERVAL_MIN_EXCEEDS_CAPACITY = 3,404;
    • INTERVAL_MAX_EXCEEDS_CAPACITY = 3,405;
  • DISTANCIA_LIMIT_ERROR = 36;
    • DISTANCE_LIMIT_INVALID_COST_DESPUÉS_SOFT_MAX = 3,601;
    • DISTANCIA_LIMIT_SOFT_MAX_WITHOUT_COST_NEXT_SOFT_MAX = 3,602;
    • DISTANCIA_LIMIT_COST_After_SOFT_MAX_WITHOUT_SOFT_MAX = 3,603;
    • DISTANCIA_LIMIT_NEGATIVE_MAX = 3,604;
    • DISTANCIA_LIMIT_NEGATIVE_SOFT_MAX = 3,605;
    • DISTANCIA_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3,606;
  • DURATION_LIMIT_ERROR = 38;
    • DURATION_LIMIT_MAX_DURATION_NEGATIVE_OR_NAN = 3,800;
    • DURATION_LIMIT_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3,801;
    • DURATION_LIMIT_INVALID_COST_PER_HOUR_After_SOFT_MAX = 3,802;
    • DURATION_LIMIT_SOFT_MAX_WITHOUT_COST_NEXT_SOFT_MAX = 3,803;
    • DURATION_LIMIT_COST_After_SOFT_MAX_WITHOUT_SOFT_MAX = 3,804;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3,805;
    • DURATION_LIMIT_INVALID_COST_After_QUADRATIC_SOFT_MAX = 3,806;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_COST_PER_square_HOUR = 3,807;
    • DURATION_LIMIT_COST_PER_square_HOUR_WITHOUT_QUADRATIC_SOFT_MAX = 3,808;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_MAX = 3,809;
    • DURATION_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3,810;
    • 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 = 3,814
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3,815;
  • SHIPMENT_ERROR = 40;
    • SHIPMENT_PD_LIMIT_WITHOUT_PICKUP_AND_DELIVERY = 4,014;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_NEGATIVE_OR_NAN = 4,000;
    • 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 = 4,016;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_NEGATIVE_OR_NAN = 4,002;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4,003;
    • SHIPMENT_EMPTY_SHIPMENT_TYPE = 4,004;
    • SHIPMENT_NO_PICKUP_NO_DELIVERY = 4,005;
    • SHIPMENT_INVALID_PENALTY_COST = 4,006;
    • SHIPMENT_ALLOWED_VEHICLE_INDEX_OUT_OF_BOUNDS = 4,007;
    • SHIPMENT_DUPLICATE_ALLOWED_VEHICLE_INDEX = 4,008;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITHOUT_INDEX = 4,009;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITH_INDEX = 4,010;
    • SHIPMENT_INVALID_COST_FOR_VEHICLE = 4011;
    • SHIPMENT_COST_FOR_VEHICLE_INDEX_OUT_OF_BOUNDS = 4,012;
    • SHIPMENT_DUPLICATE_COST_FOR_VEHICLE_INDEX = 4,013;
  • VEHICLE_ERROR = 42;
    • VEHICLE_EMPTY_REQUIRED_OPERATOR_TYPE = 4,200;
    • VEHICLE_DUPLICATE_REQUIRED_OPERATOR_TYPE = 4,201;
    • VEHICLE_NO_OPERATOR_WITH_REQUIRED_OPERATOR_TYPE = 4,202;
    • VEHICLE_EMPTY_START_TAG = 4,203;
    • VEHICLE_DUPLICATE_START_TAG = 4,204;
    • VEHICLE_EMPTY_END_TAG = 4,205;
    • VEHICLE_DUPLICATE_END_TAG = 4206;
    • VEHICLE_EXTRA_VISIT_DURATION_NEGATIVE_OR_NAN = 4,207;
    • VEHICLE_EXTRA_VISIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4,208;
    • VEHICLE_EXTRA_VISIT_DURATION_EMPTY_KEY = 4209;
    • VEHICLE_FIRST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4,210;
    • VEHICLE_FIRST_SHIPMENT_IGNORED = 4,211;
    • VEHICLE_FIRST_SHIPMENT_NOT_BOUND = 4,212;
    • VEHICLE_LAST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4,213;
    • VEHICLE_LAST_SHIPMENT_IGNORED = 4214;
    • VEHICLE_LAST_SHIPMENT_NOT_BOUND = 4,215;
    • VEHICLE_IGNORED_WITH_USE_IF_ROUTE_IS_EMPTY = 4,216;
    • VEHICLE_INVALID_COST_PER_KILOMETER = 4,217;
    • VEHICLE_INVALID_COST_PER_HOUR = 4,218;
    • VEHICLE_INVALID_COST_PER_TRAVELED_HOUR = 4,219;
    • VEHICLE_INVALID_FIXED_COST = 4,220;
    • VEHICLE_INVALID_TRAVEL_DURATION_MULTIPLE = 4,221;
    • VEHICLE_TRAVEL_DURATION_MULTIPLE_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4,223;
    • VEHICLE_MATRIX_INDEX_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4,224;
    • VEHICLE_SPECIFIC_DURATION_LONGER_THAN_DURATION_LIMIT = 4,222;
  • VISIT_REQUEST_ERROR = 44;
    • VISIT_REQUEST_EMPTY_TAG = 4400;
    • VISIT_REQUEST_DUPLICATE_TAG = 4401;
    • VISIT_REQUEST_DURATION_NEGATIVE_OR_NAN = 4404;
    • VISIT_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4,405
  • PRECEDENCE_ERROR = 46;
  • BREAK_ERROR = 48;
    • BREAK_RULE_EMPTY = 4800;
    • BREAK_REQUEST_UNSPECIFIED_DURATION = 4801;
    • BREAK_REQUEST_UNSPECIFIED_EARLIEST_START_TIME = 4,802;
    • BREAK_REQUEST_UNSPECIFIED_LATEST_START_TIME = 4,803;
    • BREAK_REQUEST_DURATION_NEGATIVE_OR_NAN = 4,804; = 4,804;
    • BREAK_REQUEST_LATEST_START_TIME_Before_EARLIEST_START_TIME = 4,805;
    • BREAK_REQUEST_EARLIEST_START_TIME_Before_GLOBAL_START_TIME = 4,806;
    • BREAK_REQUEST_LATEST_END_TIME_After_GLOBAL_END_TIME = 4,807;
    • BREAK_REQUEST_NON_SCHEDULABLE = 4808;
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_NEGATIVE_OR_NAN = 4,809;
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_NEGATIVE_OR_NAN = 4,810;
    • 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 = 4,814;
    • BREAK_FREQUENCY_MISSING_MIN_BREAK_DURATION = 4,815;
  • SHIPMENT_TYPE_INCOMPATIBILITY_ERROR = 50;
    • SHIPMENT_TYPE_INCOMPATIBILITY_EMPTY_TYPE = 5,001;
    • SHIPMENT_TYPE_INCOMPATIBILITY_LESS_THAN_TWO_TYPES = 5,002;
    • SHIPMENT_TYPE_INCOMPATIBILITY_DUPLICATE_TYPE = 5,003;
    • SHIPMENT_TYPE_INCOMPATIBILITY_INVALID_INCOMPATIBILITY_MODE = 5004;
    • SHIPMENT_TYPE_INCOMPATIBILITY_TOO_MANY_INCOMPATIBILITIES = 5,005;
  • SHIPMENT_TYPE_REQUIREMENT_ERROR = 52;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE = 52,001;
    • SHIPMENT_TYPE_REQUIREMENT_NO_DEPENDENT_TYPE = 52,002;
    • SHIPMENT_TYPE_REQUIREMENT_INVALID_REQUIREMENT_MODE = 52003;
    • SHIPMENT_TYPE_REQUIREMENT_TOO_MANY_REQUIREMENTS = 52,004;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_REQUIRED_TYPE = 52,005;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_REQUIRED_TYPE = 52,006;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE_FOUND = 52,007;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_DEPENDENT_TYPE = 52,008;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_DEPENDENT_TYPE = 52,009;
    • SHIPMENT_TYPE_REQUIREMENT_SELF_DEPENDENT_TYPE = 52,010;
    • SHIPMENT_TYPE_REQUIREMENT_GRAPH_HAS_CYCLES = 52011;
  • VEHICLE_OPERATOR_ERROR = 54;
    • VEHICLE_OPERATOR_EMPTY_TYPE = 5,400;
    • VEHICLE_OPERATOR_MULTIPLE_START_TIME_WINDOWS = 5,401;
    • VEHICLE_OPERATOR_SOFT_START_TIME_WINDOW = 5,402;
    • VEHICLE_OPERATOR_MULTIPLE_END_TIME_WINDOWS = 5,403;
    • VEHICLE_OPERATOR_SOFT_END_TIME_WINDOW = 5,404;
  • DURATION_SECONDS_MATRIX_ERROR = 56;
    • DURATION_SECONDS_MATRIX_DURATION_NEGATIVE_OR_NAN = 5,600;
    • DURATION_SECONDS_MATRIX_DURATION_EXCEEDS_GLOBAL_DURATION = 5,601
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° 4 y al primer retiro del envío n° 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 debería 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 != "UNSPECIFIED").

STABILITY: No es estable: el mensaje de error asociado a un code determinado puede cambiar (esperemos que lo aclaremos) con el tiempo. En su lugar, utiliza display_name y code.

offending_values

string

Puede contener los valores de los campos. 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 de este archivo y sigue la misma estructura jerárquica. Por ejemplo, podemos especificar el elemento n.o 2 de start_time_windows del vehículo n.o 5 usando lo siguiente:

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 amontonar el mensaje.

Campos
name

string

Nombre del campo, p.ej., "vehículos".

sub_field

FieldReference

Subcampo anidado de forma recursiva, si es necesario.

Campo de unión index_or_key.

index_or_key puede ser una de las siguientes opciones:

index

int32

Í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. Es 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.

Envío

Es el envío de un solo artículo, desde uno de sus puntos de retiro hasta una 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 libres 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

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 debe visitar una ubicación que corresponda a las entregas.

deliveries[]

VisitRequest

Es el conjunto de alternativas de entrega asociadas con el envío. Si no se especifica, el vehículo solo debe visitar una ubicación que corresponda al punto 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 en el mapa deben ser identificadores que describan el tipo de carga correspondiente; idealmente, también deben incluir 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 puede realizar este envío. Si está vacío, es posible que todos los vehículos lo hagan. Los vehículos se proporcionan según su índice en la lista vehicles de ShipmentModel.

costs_per_vehicle[]

double

Especifica el costo que se cobra cuando cada vehículo entrega este envío. Si se especifica, debe tener una de las siguientes opciones:

  • 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 corresponde al vehículo #i del modelo.

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

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 el índice de un 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 máximo en comparación con la ruta más corta desde el punto de partida 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, supongamos que hay un menor tiempo que lleva pasar directamente de la alternativa de retiro seleccionada a la alternativa de entrega seleccionada. Luego, cuando se configura pickup_to_delivery_absolute_detour_limit, se aplica 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 usará el límite más restrictivo para cada par posible de retiro/entrega. A partir de 2017/10, los desvíos solo se admiten cuando la duración de los viajes no depende de vehículos.

pickup_to_delivery_time_limit

Duration

Especifica la duración máxima desde el inicio del retiro hasta 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 retiro y entrega, ni de la velocidad del vehículo. Esto se puede especificar junto con las restricciones máximas de desvío: 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).

Es diferente 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 aparece en la respuesta en shipment_label de la ShipmentRoute.Visit correspondiente.

ignore

bool

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

Si ignoras un envío, se generará un error de validación cuando haya shipment_type_requirements en el modelo.

Si ignoras un envío que se realiza en injected_first_solution_routes o injected_solution_constraint, se permite que la resolución quite las visitas de retiro o entrega relacionadas de la ruta en cuestió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 puede expresarse en la misma unidad que se usa para todos los demás campos relacionados con los costos en el modelo y debe ser positivo.

IMPORTANTE: Si no se especifica esta penalización, se considera que es infinita, es decir, se debe completar 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 punto de partida 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, supongamos que hay un menor tiempo que lleva pasar directamente de la alternativa de retiro seleccionada a la alternativa de entrega seleccionada. Luego, cuando se configura pickup_to_delivery_relative_detour_limit, se aplica 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 usará el límite más restrictivo para cada par posible de retiro/entrega. A partir de 2017/10, los desvíos solo se admiten cuando la duración de los viajes no depende de vehículos.

Carga

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

Campos
amount

int64

Puede variar la cantidad de carga del vehículo que realiza la visita correspondiente. Dado que 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

Es una solicitud de visita que se puede realizar en un vehículo. Tiene una ubicación geográfica (o dos, consulta más abajo), los horarios de apertura y cierre representados por períodos de tiempo, y el tiempo de duración del servicio (el tiempo que pasa el vehículo hasta que llega a recoger o dejar la mercadería).

Campos
arrival_location

LatLng

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

arrival_waypoint

Waypoint

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

departure_location

LatLng

Es la 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

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

tags[]

string

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

time_windows[]

TimeWindow

Son las ventanas de tiempo que restringen la hora de llegada a una visita. Ten en cuenta que un vehículo puede salir fuera del período de llegada, es decir, no es necesario que la hora de llegada y la duración estén dentro del margen de tiempo establecido. Es posible que se genere tiempo de espera si el vehículo llega antes del TimeWindow.start_time.

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

Los períodos de tiempo deben ser inconexos, es decir, ningún período debe superponerse ni ser adyacente a otro, y deben estar en orden creciente.

cost_per_hour_after_soft_end_time y soft_end_time solo se pueden configurar si hay una única ventana de tiempo.

duration

Duration

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

cost

double

Costo de mantenimiento de esta solicitud de visita en una ruta para vehículos. Se puede usar para pagar diferentes costos por cada retiro alternativo o entrega de un envío. Este costo debe ser la misma unidad que Shipment.penalty_cost y no debe ser negativo.

load_demands

map<string, Load>

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

visit_types[]

string

Especifica los tipos de visitas. Esto se puede usar para asignar tiempo adicional que se requiere 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 general, que es la suma de lo siguiente:

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

Shipment

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

vehicles[]

Vehicle

Conjunto de vehículos que se puede usar para realizar visitas.

global_start_time

Timestamp

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

El intervalo de tiempo del modelo debe ser inferior a un año, es decir, los valores de global_end_time y global_start_time deben estar a menos de 3,153,6,000 segundos entre sí.

Cuando uses los campos cost_per_*hour, te recomendamos establecer esta ventana en un intervalo más pequeño para aumentar el rendimiento (p. ej., si modelas un solo día, debes establecer los límites de tiempo globales para ese día). Si no se configura, se usa como valor predeterminado 00:00:00 UTC, 1 de enero de 1970 (es decir, segundos: 0, nanos: 0).

global_end_time

Timestamp

Si no se establece, se usa 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 vigente más reciente de todos los vehículos. Por ejemplo, los usuarios pueden asignar un costo por hora a esa cantidad para intentar realizar optimizaciones en función de la finalización más temprana de los trabajos. Este costo debe ser 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, en su lugar se usarán las distancias geodésicas o de Google Maps, 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:

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

string

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

Las etiquetas corresponden a VisitRequest.tags o Vehicle.start_tags. Un objeto VisitRequest o Vehicle determinado debe coincidir exactamente con una etiqueta de este campo. Ten en cuenta que las etiquetas de origen, de destino y de matriz de Vehicle pueden ser iguales. De manera similar, las etiquetas de origen y de 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 estarlo.

duration_distance_matrix_dst_tags[]

string

Etiquetas que definen los destinos de las matrices de duración y distancia; duration_distance_matrices(i).rows(j).durations(k) (resp. duration_distance_matrices(i).rows(j).meters(k)) define la duración (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 objeto VisitRequest o Vehicle determinado debe coincidir exactamente con una etiqueta de este campo. Ten en cuenta que las etiquetas de origen, de destino y de matriz de Vehicle pueden ser iguales. De manera similar, las etiquetas de origen y de 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 estarlo.

transition_attributes[]

TransitionAttributes

Atributos de transición agregados al modelo.

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

Conjuntos de shipping_types incompatibles (consulta ShipmentTypeIncompatibility).

shipment_type_requirements[]

ShipmentTypeRequirement

Conjuntos de requisitos de shipment_type (consulta ShipmentTypeRequirement).

precedence_rules[]

PrecedenceRule

Conjunto de reglas de prioridad que se deben aplicar 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 el caso de que haya menos conductores que vehículos y que la flota de vehículos sea heterogénea. Luego, la optimización seleccionará el mejor subconjunto de vehículos para utilizar. Debe ser estrictamente positivo.

DurationDistanceMatrix

Especifica una matriz de duración y distancia desde las ubicaciones de partida de las visitas y los vehículos hasta las ubicaciones de las visitas y de salida de vehículos.

Campos
rows[]

Row

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

vehicle_start_tag

string

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

Cada partida de vehículo debe coincidir exactamente con una matriz, es decir, uno de los 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 de una fila determinada. Debe tener tantos elementos como ShipmentModel.duration_distance_matrix_dst_tags.

meters[]

double

Valores de distancia para una fila determinada. Si ningún costo o restricción hace referencia a las distancias en el modelo, este campo puede quedar vacío; de lo contrario, debe tener tantos elementos como durations.

PrecedenceRule

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

Varias prioridades pueden hacer referencia a los mismos eventos (o relacionados), p.ej., “el retiro de B ocurre después de la entrega de A” y “el retiro de C ocurre después de la entrega de B”.

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

Campos
first_is_delivery

bool

Indica si el "primer" evento es una entrega.

second_is_delivery

bool

Indica si el "segundo" evento es una entrega.

offset_duration

Duration

El desplazamiento entre el "primer" y el "segundo" evento Puede ser negativo.

first_index

int32

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

second_index

int32

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

ShipmentRoute

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

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

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

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

Invariantes:

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

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

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

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

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

Un ejemplo (complejo):

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

int32

El 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, que equivale a ShipmentModel.vehicles(vehicle_index).label, si se especifica.

vehicle_start_time

Timestamp

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

vehicle_end_time

Timestamp

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

visits[]

Visit

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

transitions[]

Transition

Lista ordenada de transiciones para la ruta.

has_traffic_infeasibilities

bool

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

  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 sea posterior a su período actual debido a la mayor estimación del tiempo de viaje travel_duration(previous_visit, next_visit) debido al tráfico. Además, es posible que una pausa se superponga con una visita debido a un aumento en las estimaciones del tiempo de viaje y las restricciones de los períodos de visitas o pausas.

route_polyline

EncodedPolyline

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

breaks[]

Break

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

metrics

AggregatedMetrics

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

route_costs

map<string, double>

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

route_total_cost

double

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

Receso

Datos que representan la ejecución de un salto.

Campos
start_time

Timestamp

Hora de inicio del descanso.

duration

Duration

Es la duración de la pausa.

EncodedPolyline

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

Campos
points

string

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

Transición

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

Si el vehículo no tiene start_location ni 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 no se pudo recuperar la información de tráfico de una Transition, este valor booleano se establece en verdadero. Esto puede ser temporal (problemas poco frecuentes en los servidores de tráfico en tiempo real) o permanentes (sin datos de esta ubicación).

delay_duration

Duration

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

break_duration

Duration

Es la suma de la duración de las pausas que 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 espera corresponde al tiempo de inactividad y no incluye el tiempo de descanso. Además, ten en cuenta que este tiempo de espera puede dividirse en varios intervalos no contiguos.

total_duration

Duration

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

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

Timestamp

Es la hora de inicio de esta transición.

route_polyline

EncodedPolyline

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

vehicle_loads

map<string, VehicleLoad>

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

Las cargas de la primera transición son las cargas iniciales de la ruta del vehículo. Luego, después de cada visita, se agregan o se restan los load_demands de la visita para obtener las cargas de la siguiente transición, en función de si se realizó 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

Es la cantidad de carga en el 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 un Shipment.

Campos
shipment_index

int32

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

is_pickup

bool

Si es verdadero, la visita corresponde a una partida 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 de esa fecha a la ubicación de la visita. Los horarios coinciden con ShipmentModel.

load_demands

map<string, Load>

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

detour

Duration

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

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 vehículo start_location 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 apariencia de envíos incompatibles en la misma ruta se restringe según el modo de incompatibilidad.

Campos
types[]

string

Lista de tipos incompatibles. Dos envíos con shipment_types diferentes entre los indicados son "incompatibles".

incompatibility_mode

IncompatibilityMode

Se aplicó el modo a la incompatibilidad.

IncompatibilityMode

Medios que definen la restricción de apariencia de envíos incompatibles en la misma ruta

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

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

  • Si ambos son solo pedidos para retirar (no entregas) o solo entregas (no retiros), no pueden compartir el mismo vehículo.
  • Si uno de los envíos tiene una entrega y el otro un retiro, los dos envíos pueden compartir el mismo vehículo siempre que el primer envío se entregue antes de que el último se recoja.

ShipmentTypeRequirement

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

Campos
required_shipment_type_alternatives[]

string

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

dependent_shipment_types[]

string

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

NOTA: No se permiten cadenas de requisitos en las que un shipment_type depende de sí misma.

requirement_mode

RequirementMode

Modo aplicado al requisito.

RequirementMode

Medios que definen la apariencia de los envíos dependientes en una ruta

Enumeradores
REQUIREMENT_MODE_UNSPECIFIED No se especificó el modo de requisitos. Este valor nunca debe usarse.
PERFORMED_BY_SAME_VEHICLE En este modo, todos los envíos "dependientes" deben compartir el mismo vehículo que al menos uno de sus envíos "obligatorios".
IN_SAME_VEHICLE_AT_PICKUP_TIME

Con el modo IN_SAME_VEHICLE_AT_PICKUP_TIME, todos los envíos "dependientes" deben tener al menos un envío "obligatorio" en el vehículo al momento de retirarlo.

Por lo tanto, el retiro de un envío "dependiente" debe incluir:

  • Un envío solo “obligatorio” que se entrega en la ruta posterior
  • Un envío "obligatorio" que se recoge en la ruta antes de este y, si el envío "obligatorio" tiene una entrega, esta debe realizarse después de que el envío "dependiente" lo retire.
IN_SAME_VEHICLE_AT_DELIVERY_TIME Es igual que antes, excepto que los envíos “dependientes” deben tener un envío “obligatorio” en su vehículo al momento de la entrega.

SkippedShipment

Especifica los detalles de los envíos no realizados en una solución. En 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 los motivos que explican por qué se omitió el envío. Consulta el comentario de más arriba Reason.

Motivo

Aquí se indicarán los motivos por los que se omitió el envío. 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, todos los campos son iguales, excepto example_vehicle_index. Ejemplo:

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

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

Campos
code

Code

Consulta los comentarios de Code.

example_exceeded_capacity_type

string

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

example_vehicle_index

int32

Si el motivo está relacionado con una incompatibilidad de un vehículo de envío, este campo proporciona el índice de un vehículo relevante.

Código

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

Enumeradores
CODE_UNSPECIFIED Nunca debe usarse. Si no podemos comprender por qué se omitió un envío, simplemente te devolvemos un conjunto vacío de motivos.
NO_VEHICLE No hay ningún vehículo en el modelo que haga 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 la start_location del vehículo hasta las ubicaciones de retiro o entrega del envío y hasta la ubicación final del vehículo supera las 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 los route_duration_limit del vehículo.

Nota: El tiempo de viaje se calcula en el mejor de los casos, es decir, como una distancia geodésica x 36 m/s (aproximadamente 130 km/hora).

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT Igual que lo anterior, pero solo comparamos la duración mínima de viaje y el travel_duration_limit del vehículo.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS En el mejor de los casos, el vehículo no puede realizar este envío (consulta CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT para obtener el cálculo del tiempo) si comienza la hora de inicio más temprana. En este caso, el tiempo total provocaría que el vehículo finalice después de la ú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

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

Los límites de ventana 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 de la ventana de tiempo flexible, soft_start_time, expresa una preferencia para que el evento ocurra a partir de soft_start_time, ya que incurre en un costo proporcional al tiempo antes de soft_start_time que ocurra el evento. El límite superior de la ventana de tiempo flexible, soft_end_time, expresa una preferencia para que el evento ocurra a partir del soft_end_time o antes, ya que incurre en un costo proporcional al tiempo después de que ocurre el evento soft_end_time. 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` <= `soft_start_time` <= `end_time` and
  0 <= `start_time` <= `soft_end_time` <= `end_time`.
Campos
start_time

Timestamp

La hora de inicio del período de tiempo difícil. Si no se especifica, se establecerá en ShipmentModel.global_start_time.

end_time

Timestamp

La hora de finalización del período difícil Si no se especifica, se establecerá en 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

Un costo por hora agregado a otros costos en el modelo si el evento ocurre antes de soft_start_time, que se calcula 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 configurar si se configuró soft_start_time.

cost_per_hour_after_soft_end_time

double

Un costo por hora agregado a otros costos del modelo si el evento ocurre después de soft_end_time. 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 configurar si se configuró soft_end_time.

TransitionAttributes

Especifica los atributos de las transiciones entre dos visitas consecutivas de una ruta. Se pueden aplicar varias 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 de “AND”).

Campos
src_tag

string

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

Una visita de origen o un inicio de un vehículo coinciden si su VisitRequest.tags o Vehicle.start_tags contienen src_tag o no 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 los valores de src_tag y excluded_src_tag no debe estar vacío.

dst_tag

string

Una visita a destino o un final de vehículo coincide si su VisitRequest.tags o Vehicle.end_tags contienen dst_tag o no 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 los valores de dst_tag y excluded_dst_tag no debe estar vacío.

cost

double

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

distance_limit

DistanceLimit

Especifica un límite en 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 cuando se realiza esta transición.

Esta demora siempre ocurre después de que finaliza la visita de origen y antes de comenzar la visita de destino.

Vehículo

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

Campos
display_name

string

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

travel_mode

TravelMode

El medio de transporte que afecta las rutas utilizables por el vehículo y su velocidad. Consulta también travel_duration_multiple.

start_location

LatLng

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

end_location

LatLng

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

end_waypoint

Waypoint

Punto de referencia que representa una ubicación geográfica donde termina 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 inmediatamente 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 comienzo de la ruta del vehículo.

No se permiten cadenas vacías o 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 cumplir con los límites de tiempo globales (consulta los campos ShipmentModel.global_*). Si no se especifica, no hay límites además de esos límites de tiempo globales.

Las ventanas temporales que pertenecen al mismo campo repetido deben ser inconexas, es decir, ninguna ventana de tiempo 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 una única ventana de tiempo.

end_time_windows[]

TimeWindow

Períodos durante los cuales el vehículo puede llegar a la ubicación de destino. Deben cumplir con los límites de tiempo globales (consulta los campos ShipmentModel.global_*). Si no se especifica, no hay límites además de esos límites de tiempo globales.

Las ventanas temporales que pertenecen al mismo campo repetido deben ser inconexas, es decir, ninguna ventana de tiempo 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 una única ventana de tiempo.

unloading_policy

UnloadingPolicy

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

load_limits

map<string, LoadLimit>

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

cost_per_hour

double

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

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

cost_per_traveled_hour

double

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

cost_per_kilometer

double

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

fixed_cost

double

Se aplica un costo fijo si se usa este vehículo para realizar un envío.

used_if_route_is_empty

bool

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

Si es verdadero, el vehículo va desde su ubicación de partida hasta su ubicación final, incluso si no realiza ningún envío, y se tienen en cuenta los costos de tiempo y distancia resultantes del viaje hasta el final.

De lo contrario, no se desplaza desde su ubicación de partida hasta su ubicación de finalización, y no se programaron break_rule ni retrasos (desde el TransitionAttributes) para este vehículo. En este caso, el ShipmentRoute del vehículo no contiene ninguna información, excepto el índice y la etiqueta del vehículo.

route_duration_limit

DurationLimit

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

travel_duration_limit

DurationLimit

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 recorrido 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 objeto OptimizeToursResponse determinado, la distancia de 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 a las duraciones. La duración es el tiempo adicional al que se realizará VisitRequest.duration en las visitas con el visit_types especificado. Esta duración adicional de la visita agrega 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á de manera forzosa 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á en desuso.

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

Si un vehículo ignorado se realiza un envío en injected_solution_constraint y cualquier retiro o entrega relacionado tiene la obligación de permanecer en el vehículo (es decir, no es distendido al nivel RELAX_ALL_AFTER_THRESHOLD), se omitirá 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, se omitirá en la respuesta.

travel_duration_multiple

double

Especifica un factor multiplicativo que se puede usar para aumentar o disminuir los tiempos de viaje de este vehículo. Por ejemplo, si se establece en 2.0, este vehículo es más lento y tiene tiempos de viaje que son el doble de los de los vehículos estándar. Esta acción múltiple no afecta la duración de las visitas. Esto afecta el costo si se especifican cost_per_hour o cost_per_traveled_hour. Debe estar en el rango [0.001, 1,000.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 múltiplo pequeño puede producir 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 la duración máxima de la ruta de un vehículo. Puede ser duro o blando.

Cuando se define un campo de límite flexible, se deben definir en conjunto el umbral de límite flexible 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 el valor de max_duration, soft_max_duration debe ser menor que max_duration.

quadratic_soft_max_duration

Duration

Un límite flexible no aplica un límite de duración máxima, pero cuando se infringe, la ruta genera un costo cuadrático de duración. 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 ser superior a 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 0 si la duración es inferior al umbral. De lo contrario, depende de la duración de la siguiente manera:

  cost_per_hour_after_soft_max * (duration - soft_max_duration)

El costo no debe ser negativo.

cost_per_square_hour_after_quadratic_soft_max

double

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

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

  cost_per_square_hour_after_quadratic_soft_max *
  (duration - quadratic_soft_max_duration)^2

El costo no debe ser negativo.

LoadLimit

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

Campos
soft_max_load

int64

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

cost_per_unit_above_soft_max

double

Si la carga supera los soft_max_load en la ruta del vehículo, se aplicará la siguiente penalización por 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 máxima de carga aceptable.

Intervalo

Intervalo de cantidades de carga aceptables

Campos
min

int64

Una carga mínima aceptable. Debe ser mayor o igual que 0. Si se especifican ambos, min debe ser ≤ max.

max

int64

Una carga máxima aceptable. 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

Medios de transporte que pueden usar los vehículos.

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

Enumeradores
TRAVEL_MODE_UNSPECIFIED Medio de transporte no especificado, que equivale a DRIVING.
DRIVING Medio de transporte correspondiente a las indicaciones 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 únicamente a los envíos que ofrecen retiro y entrega.

Otros envíos son gratuitos en cualquier lugar de la ruta, independientemente de unloading_policy.

Enumeradores
UNLOADING_POLICY_UNSPECIFIED Política de descarga no especificada; las entregas deben realizarse después de su recogida correspondiente.
LAST_IN_FIRST_OUT Las entregas deben realizarse en el orden inverso a los retiros.
FIRST_IN_FIRST_OUT Las entregas deben realizarse en el mismo orden que las retiros

Waypoint

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 finalización de los vehículos.

Campos
side_of_road

bool

Opcional. Indica que la ubicación de este punto de referencia tiene la preferencia de que el vehículo se detenga en un lado particular de la ruta. Cuando estableces este valor, la ruta pasará por la ubicación para que el vehículo pueda detenerse en el costado de la ruta en el que se encuentra sesgada desde el centro de la ruta. Esta opción no funciona para el medio de transporte "WALKING".

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

Location

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

place_id

string

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