Package google.maps.routeoptimization.v1

Índice

RouteOptimization

Es un servicio para optimizar los recorridos de los vehículos.

Validez de ciertos tipos de campos:

  • google.protobuf.Timestamp
    • Los tiempos se expresan en tiempo Unix: segundos desde 1970-01-01T00:00:00+00:00.
    • Los segundos deben estar en [0, 253402300799], es decir, en [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • Los nanosegundos deben estar sin configurar o configurados 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 deben estar sin configurar o configurados en 0.
  • google.type.LatLng
    • La latitud debe estar en [-90.0, 90.0].
    • La longitud debe estar en [-180.0, 180.0].
    • Al menos uno de los valores de latitud y longitud debe ser distinto de cero.
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

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

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

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

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

Si el campo done de la LRO es verdadero, significa que se procesaron todas las solicitudes. Los resultados de las solicitudes que se procesen correctamente estarán disponibles en Cloud Storage. Los resultados de las solicitudes que fallaron no estarán disponibles en Cloud Storage. Si se establece el campo error de la LRO, contendrá el error de una de las solicitudes con errores.

Permisos de autorización

Requiere el siguiente permiso de OAuth:

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

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

  • routeoptimization.operations.create

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

OptimizeTours

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

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

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

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

Permisos de autorización

Requiere el siguiente permiso de OAuth:

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

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

  • routeoptimization.locations.use

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

OptimizeToursLongRunning

rpc OptimizeToursLongRunning(OptimizeToursRequest) returns (Operation)

Esta es una variante del método OptimizeTours diseñado para optimizaciones con valores de tiempo de espera grandes. Se debe preferir por sobre el método OptimizeTours para las optimizaciones que tardan más de unos minutos.

El long-running operation (LRO) que se muestra tendrá un nombre con el formato <parent>/operations/<operation_id> y se puede usar para hacer un seguimiento del progreso del cálculo. El tipo de campo metadata es OptimizeToursLongRunningMetadata. El tipo de campo response es OptimizeToursResponse, si se realiza correctamente.

Permisos de autorización

Requiere el siguiente permiso de OAuth:

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

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

  • routeoptimization.operations.create

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

OptimizeToursUri

rpc OptimizeToursUri(OptimizeToursUriRequest) returns (Operation)

Esta es una variante del método OptimizeToursLongRunning diseñado para optimizaciones con valores de tiempo de espera grandes y tamaños de entrada y salida grandes.

El cliente especifica el URI del OptimizeToursRequest almacenado en Google Cloud Storage y el servidor escribe el OptimizeToursResponse en un URI de Google Cloud Storage especificado por el cliente.

Este método se debe preferir por sobre el método OptimizeTours para las optimizaciones que tardan más de unos minutos y los tamaños de entrada y salida que superan los 8 MB, aunque también se puede usar para optimizaciones más cortas y pequeñas.

El long-running operation (LRO) que se muestra tendrá un nombre con el formato <parent>/operations/<operation_id> y se puede usar para hacer un seguimiento del progreso del cálculo. El tipo de campo metadata es OptimizeToursUriMetadata. El tipo de campo response es OptimizeToursUriResponse, si se realiza correctamente.

Permisos de autorización

Requiere el siguiente permiso de OAuth:

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

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

  • routeoptimization.operations.create

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

AggregatedMetrics

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

Campos
performed_shipment_count

int32

Es la cantidad de envíos realizados. Ten en cuenta que un par de retiro y entrega solo se cuenta una vez.

travel_duration

Duration

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

wait_duration

Duration

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

delay_duration

Duration

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

break_duration

Duration

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

visit_duration

Duration

Es la duración total de la visita 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

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

max_loads

map<string, VehicleLoad>

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

performed_mandatory_shipment_count

int32

Es la cantidad de envíos obligatorios que se realizaron.

Experimental: El comportamiento o la existencia de este campo pueden cambiar en el futuro.

performed_shipment_penalty_cost_sum

double

Es la suma de los Shipment.penalty_cost de los envíos realizados.

Experimental: El comportamiento o la existencia de este campo pueden cambiar en el futuro.

BatchOptimizeToursMetadata

Este tipo no tiene campos.

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

BatchOptimizeToursRequest

Solicita optimizar 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/-

No se admiten los valores regionales de {location-id}.

model_configs[]

AsyncModelConfig

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

AsyncModelConfig

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

Campos
display_name

string

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

input_config

InputConfig

Obligatorio. Es la información sobre el modelo de entrada.

output_config

OutputConfig

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

BatchOptimizeToursResponse

Este tipo no tiene campos.

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

BreakRule

Son reglas para generar pausas de tiempo para un vehículo (p.ej., pausas para el almuerzo). Un descanso 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 ocurrir una pausa en los siguientes casos:

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

BreakRequest

Es una secuencia de pausas. Consulta el mensaje BreakRequest.

frequency_constraints[]

FrequencyConstraint

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

BreakRequest

La secuencia de descansos (es decir, su cantidad y orden) que se aplican a cada vehículo se debe conocer de antemano. Los 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 se verifica).

Campos
earliest_start_time

Timestamp

Obligatorio. Límite inferior (inclusive) del inicio del descanso.

latest_start_time

Timestamp

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

min_duration

Duration

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

FrequencyConstraint

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

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

El momento 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 especificados en el BreakRequest.

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

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

Duration

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

max_inter_break_duration

Duration

Obligatorio. Es el intervalo máximo permitido de cualquier intervalo de tiempo en la ruta que no incluya, al menos parcialmente, un descanso de duration >= min_break_duration. Debe ser positivo.

DataFormat

Formatos de datos para los archivos de entrada y salida.

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

DistanceLimit

Es un límite que define una distancia máxima que se puede recorrer. Puede ser de hardware o de software.

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

Campos
max_meters

int64

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

soft_max_meters

int64

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

Si se define, soft_max_meters debe ser menor que max_meters y no debe ser negativo.

cost_per_kilometer_below_soft_max

double

Costo por kilómetro incurrido, que aumenta hasta soft_max_meters, con la siguiente fórmula:

  min(distance_meters, soft_max_meters) / 1000.0 *
  cost_per_kilometer_below_soft_max.

Este costo no se admite en route_distance_limit.

cost_per_kilometer_above_soft_max

double

Es el costo por kilómetro en el que se incurre si la distancia supera el límite de soft_max_meters. El costo adicional es 0 si la distancia es inferior al límite; de lo contrario, la fórmula que se usa para calcular el costo es la siguiente:

  (distance_meters - soft_max_meters) / 1000.0 *
  cost_per_kilometer_above_soft_max.

El costo no debe ser negativo.

GcsDestination

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

Campos
uri

string

Obligatorio. Es el URI de Google Cloud Storage.

GcsSource

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

Campos
uri

string

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

InjectedSolutionConstraint

Es la solución que se inserta en la solicitud, incluida la información sobre qué visitas se deben restringir y cómo se deben restringir.

Campos
routes[]

ShipmentRoute

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

skipped_shipments[]

SkippedShipment

Son los envíos omitidos de la solución que se insertará. Es posible que algunos se omitan de la solución original. Consulta el campo routes.

constraint_relaxations[]

ConstraintRelaxation

Para cero o más grupos de vehículos, especifica cuándo y cuánto se deben flexibilizar las restricciones. Si este campo está vacío, todas las rutas de vehículos no vacías están completamente restringidas.

ConstraintRelaxation

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

Campos
relaxations[]

Relaxation

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

vehicle_indices[]

int32

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

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

Relaxation

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

relaxations(i).level especifica el nivel de relajación de la restricción que se aplica 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

Del mismo modo, el inicio del vehículo se flexibiliza a relaxations(i).level si cumple con lo siguiente:

  • vehicle_start_time >= relaxations(i).threshold_time Y
  • relaxations(i).threshold_visit_count == 0 y el final del vehículo se relaja a 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 el threshold_time, agrega dos relaxations con el mismo level: uno con solo threshold_visit_count establecido y el otro con solo threshold_time establecido. Si una visita cumple con las condiciones de varios relaxations, se aplica el nivel más flexible. Como resultado, desde el inicio del vehículo hasta las visitas de la ruta para llegar al final del vehículo, el nivel de relajación se vuelve más relajado, es decir, el nivel de relajación no disminuye a medida que avanza la ruta.

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

Campos
level

Level

Es el nivel de flexibilización de la restricción que se aplica cuando se cumplen las condiciones en threshold_time o después de esa fecha, Y al menos en threshold_visit_count.

threshold_time

Timestamp

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

threshold_visit_count

int32

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

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

Nivel

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

La siguiente enumeración se encuentra en orden de relajación creciente.

Enums
LEVEL_UNSPECIFIED

Nivel de relajación implícito predeterminado: no se relaja ninguna restricción, es decir, todas las visitas están completamente restringidas.

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

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

InputConfig

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

Campos
data_format

DataFormat

Obligatorio. Es el formato de los datos de entrada.

Campo de unión source. Obligatorio. source puede ser solo uno de los parámetros siguientes:
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 rumbo opcional).

Campos
lat_lng

LatLng

Son las coordenadas geográficas del punto de referencia.

heading

int32

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

OptimizeToursLongRunningMetadata

Este tipo no tiene campos.

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

OptimizeToursRequest

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

Campos
parent

string

Obligatorio. Es el proyecto o la ubicación de destino para realizar una llamada.

Formato:

  • projects/{project-id}
  • projects/{project-id}/locations/-

No se admiten los valores regionales de {location-id}.

timeout

Duration

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

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

model

ShipmentModel

Es el modelo de envío que se resolverá.

solving_mode

SolvingMode

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

search_mode

SearchMode

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

injected_first_solution_routes[]

ShipmentRoute

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

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

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

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

Si la solución insertada no es factible, no necesariamente se devuelve un error de validación, sino que se puede devolver un error que indique que no es factible.

injected_solution_constraint

InjectedSolutionConstraint

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

Si la solución insertada no es factible, no necesariamente se devuelve un error de validación, sino que se puede devolver un error que indique que no es factible.

refresh_details_routes[]

ShipmentRoute

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

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

Los campos route_polyline de las rutas pasadas pueden ser incoherentes con la ruta transitions.

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

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

interpret_injected_solutions_using_labels

bool

Si es verdadero:

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

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

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

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

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

consider_road_traffic

bool

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

populate_polylines

bool

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

populate_transition_polylines

bool

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

allow_large_deadline_despite_interruption_risk

bool

Si se establece, la solicitud puede tener un plazo (consulta https://grpc.io/blog/deadlines) de hasta 60 minutos. De lo contrario, el plazo máximo es de solo 30 minutos. Ten en cuenta que las solicitudes de larga duración tienen un riesgo de interrupción 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 la duración del viaje se calculará con distancias geodésicas con una velocidad definida por geodesic_meters_per_second.

label

string

Es la etiqueta que se puede usar para identificar esta solicitud, que se informa en OptimizeToursResponse.request_label.

geodesic_meters_per_second

double

Cuando use_geodesic_distances es verdadero, se debe establecer este campo y definir la velocidad que se aplica para calcular las duraciones de los viajes. Su valor debe ser de, al menos, 1.0 metros por segundo.

max_validation_errors

int32

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

SearchMode

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

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

SolvingMode

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

Enums
DEFAULT_SOLVE Resuelve el modelo. Se pueden emitir advertencias en [OptimizeToursResponse.validation_errors][google.cloud.optimization.v1.OptimizeToursResponse.validation_errors].
VALIDATE_ONLY Solo valida el modelo sin resolverlo: propaga la mayor cantidad posible de OptimizeToursResponse.validation_errors.
DETECT_SOME_INFEASIBLE_SHIPMENTS

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

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

TRANSFORM_AND_RETURN_REQUEST

Este modo solo funciona si ShipmentModel.objectives no está vacío. La solicitud no se resolvió. Solo se valida y se completa con los costos correspondientes a los objetivos dados. Consulta también la documentación de ShipmentModel.objectives. La solicitud resultante se devuelve como OptimizeToursResponse.processed_request.

Experimental: Consulta https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request para obtener más detalles.

OptimizeToursResponse

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

Campos
routes[]

ShipmentRoute

Son las rutas calculadas para cada vehículo. La 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

Es la lista de todos los envíos omitidos.

validation_errors[]

OptimizeToursValidationError

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

processed_request

OptimizeToursRequest

En algunos casos, modificamos la solicitud entrante antes de resolverla, p.ej., agregando costos. Si solving_mode == TRANSFORM_AND_RETURN_REQUEST, la solicitud modificada se devuelve aquí.

Experimental: Consulta https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request para obtener más detalles.

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

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

skipped_mandatory_shipment_count

int32

Es la cantidad de envíos obligatorios que se omitieron.

used_vehicle_count

int32

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

earliest_vehicle_start_time

Timestamp

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

latest_vehicle_end_time

Timestamp

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

costs

map<string, double>

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

total_cost

double

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

OptimizeToursUriMetadata

Este tipo no tiene campos.

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

OptimizeToursUriRequest

Es una solicitud que usa el método OptimizeToursUri.

Campos
parent

string

Obligatorio. Es el proyecto o la ubicación de destino para realizar una llamada.

Formato:

  • projects/{project-id}
  • projects/{project-id}/locations/-

No se admiten los valores regionales de {location-id}.

input

Uri

Obligatorio. El URI del objeto de Cloud Storage que contiene el OptimizeToursRequest.

output

Uri

Obligatorio. Es el URI del objeto de Cloud Storage que contendrá el OptimizeToursResponse.

OptimizeToursUriResponse

Es una respuesta que devuelve el método OptimizeToursUri.

Campos
output

Uri

Opcional. Es el URI del objeto de Cloud Storage que contiene el OptimizeToursResponse codificado como JSON o textproto. Si el objeto se codificó como JSON, la extensión del nombre del objeto será .json. Si el objeto se codificó como textproto, la extensión del nombre del objeto será .txtpb.

El crc32_checksum del recurso se puede usar para verificar que no se haya modificado su contenido.

OptimizeToursValidationError

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

Campos
code

int32

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

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

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

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

display_name

string

Es el nombre visible del error.

fields[]

FieldReference

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

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

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

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

offending_values

string

Puede contener los valores de los campos. Esta opción no siempre está disponible. No debes confiar en él de ninguna manera y solo debes usarlo 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° 2 de start_time_windows del vehículo n° 5 con 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 que el mensaje se sature.

Campos
name

string

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

sub_field

FieldReference

Es un subcampo anidado de forma recurrente, si es necesario.

Campo de unión index_or_key.

index_or_key puede ser una de las siguientes opciones:

index

int32

Es el índice del campo si se repite.

key

string

Es la 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. destination puede ser solo uno de los parámetros siguientes:
gcs_destination

GcsDestination

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

RouteModifiers

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

Campos
avoid_tolls

bool

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

avoid_highways

bool

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

avoid_ferries

bool

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

avoid_indoor

bool

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

Envío

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

Campos
display_name

string

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

pickups[]

VisitRequest

Es el conjunto de alternativas de retiro asociadas con el envío. Si no se especifica, el vehículo solo necesita visitar una ubicación correspondiente a las entregas.

deliveries[]

VisitRequest

Es el conjunto de alternativas de entrega asociadas al envío. Si no se especifica, el vehículo solo debe visitar una ubicación correspondiente a las recogidas.

load_demands

map<string, Load>

Son las demandas de carga del envío (por ejemplo, peso, volumen, cantidad de palés, etcétera). Las claves del mapa deben ser identificadores que describan el tipo de carga correspondiente y, de ser posible, 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 pueden realizar este envío. Si está vacío, todos los vehículos pueden realizarlo. Los vehículos se indican por su índice en la lista vehicles de ShipmentModel.

costs_per_vehicle[]

double

Especifica el costo que se genera cuando cada vehículo entrega este envío. Si se especifica, debe tener 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 la cantidad de vehículos en el modelo. El i-ésimo elemento 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 costos de este tipo.

costs_per_vehicle_indices[]

int32

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

pickup_to_delivery_absolute_detour_limit

Duration

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

Por ejemplo, supongamos que t es el tiempo más corto que se tarda en ir de la alternativa de retiro seleccionada directamente a la alternativa de entrega seleccionada. Luego, si configuras 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 usa el límite más restrictivo para cada par de retiro y entrega posible. A partir de octubre de 2017, los desvíos solo se admiten cuando las duraciones de los viajes no dependen de los vehículos.

pickup_to_delivery_time_limit

Duration

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

shipment_type

string

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

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

label

string

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

ignore

bool

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

Ignorar un envío genera un error de validación cuando hay algún shipment_type_requirements en el modelo.

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

penalty_cost

double

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

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

pickup_to_delivery_relative_detour_limit

double

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

Por ejemplo, supongamos que t es el tiempo más corto que se tarda en ir de la alternativa de retiro seleccionada directamente a la alternativa de entrega seleccionada. Luego, si configuras 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 usa el límite más restrictivo para cada par de retiro y entrega posible. A partir de octubre de 2017, los desvíos solo se admiten cuando las duraciones de los viajes no dependen de los vehículos.

Carga

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

Campos
amount

int64

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

VisitRequest

Es una solicitud de visita que puede realizar un vehículo. Tiene una ubicación geográfica (o dos, consulta más abajo), horarios de apertura y cierre representados por ventanas de tiempo, y una duración del servicio (tiempo que pasa el vehículo una vez que llega para retirar o entregar mercancías).

Campos
arrival_location

LatLng

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

arrival_waypoint

Waypoint

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

departure_location

LatLng

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

departure_waypoint

Waypoint

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

tags[]

string

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

time_windows[]

TimeWindow

Son los períodos 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, la hora de llegada y la duración no necesitan estar dentro de un período. Esto puede generar un tiempo de espera si el vehículo llega antes de TimeWindow.start_time.

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

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

cost_per_hour_after_soft_end_time y soft_end_time solo se pueden establecer si hay un único período.

duration

Duration

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

cost

double

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

load_demands

map<string, Load>

Son las demandas de carga de esta solicitud de visita. Es igual que el campo Shipment.load_demands, pero solo se aplica a este VisitRequest en lugar de a todo el Shipment. Las demandas que se indican aquí se agregan a las que se indican en Shipment.load_demands.

visit_types[]

string

Especifica los tipos de visita. Esto se puede usar para asignar el tiempo adicional que necesita un vehículo para completar 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.

avoid_u_turns

bool

Especifica si se deben evitar los giros en U en las rutas de conducción en esta ubicación. La evasión de giros en U se realiza de la mejor manera posible, pero no se garantiza que se eviten por completo. Esta es una función experimental y su comportamiento está sujeto a cambios.

Experimental: Consulta https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request para obtener más detalles.

ShipmentModel

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

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

Shipment

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

vehicles[]

Vehicle

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

objectives[]

Objective

Es el conjunto de objetivos de este modelo, que transformaremos en costos. Si no está vacío, el modelo de entrada debe ser sin costo. Para obtener la solicitud modificada, usa solving_mode = TRANSFORM_AND_RETURN_REQUEST. Ten en cuenta que, en este caso, no se resolverá la solicitud. Consulta la documentación correspondiente.

Experimental: Consulta https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request para obtener más detalles.

global_start_time

Timestamp

Hora de inicio y finalización global del modelo: no se puede considerar válida ninguna hora fuera de este rango.

El intervalo de tiempo del modelo debe ser inferior a un año, es decir, el global_end_time y el global_start_time deben estar dentro de los 31,536,000 segundos entre sí.

Cuando uses campos cost_per_*hour, te recomendamos que configures 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 establece, se usa 00:00:00 UTC, 1 de enero de 1970 (es decir, segundos: 0, nanosegundos: 0) como valor predeterminado.

global_end_time

Timestamp

Si no se establece, se usa como valor predeterminado el 1 de enero de 1971 a las 00:00:00 UTC (es decir, segundos: 31536000, nanosegundos: 0).

global_duration_cost_per_hour

double

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

duration_distance_matrices[]

DurationDistanceMatrix

Especifica las matrices de duración y distancia que se usan en el modelo. Si este campo está vacío, se usarán 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:

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

string

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

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

duration_distance_matrix_dst_tags[]

string

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

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

transition_attributes[]

TransitionAttributes

Se agregaron atributos de transición al modelo.

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

Conjuntos de shipment_types incompatibles (consulta ShipmentTypeIncompatibility).

shipment_type_requirements[]

ShipmentTypeRequirement

Conjuntos de requisitos de shipment_type (consulta ShipmentTypeRequirement).

precedence_rules[]

PrecedenceRule

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

IMPORTANTE: El uso de reglas de precedencia limita el tamaño del problema que se puede optimizar. Es posible que se rechacen las solicitudes que usen reglas de precedencia que incluyan muchos envíos.

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 usar 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 usar. Debe ser estrictamente positivo.

DurationDistanceMatrix

Especifica una matriz de duración y distancia desde las ubicaciones de inicio de las visitas y los vehículos hasta las ubicaciones de finalización de las visitas y los 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 inicio de vehículo debe coincidir con exactamente una matriz, es decir, exactamente uno de sus campos start_tags debe coincidir con el vehicle_start_tag de una matriz (y solo de esa matriz).

Todas las matrices deben tener un vehicle_start_tag diferente.

Fila

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

Campos
durations[]

Duration

Son los valores de duración de una fila determinada. Debe tener tantos elementos como ShipmentModel.duration_distance_matrix_dst_tags.

meters[]

double

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

Objetivo

Los objetivos reemplazan por completo el modelo de costos y, por lo tanto, son incompatibles con los costos preexistentes. Cada objetivo se asigna a una cantidad de costos predefinidos para, por ejemplo, vehículos, envíos o atributos de transición.

Experimental: Consulta https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request para obtener más detalles.

Campos
type

Type

Es el tipo de objetivo.

weight

double

Cuánto debe contar este objetivo en relación con los demás. Puede ser cualquier número no negativo, y no es necesario que la suma de los pesos sea 1. Los pesos se establecen de forma predeterminada en 1.0.

Tipo

Es el tipo de objetivo que se asignará a un conjunto de costos.

Enums
DEFAULT Se usará un conjunto predeterminado de costos para garantizar una solución razonable. Nota: Este objetivo se puede usar por sí solo, pero también se agregará siempre con un peso de 1.0, como referencia, a los objetivos especificados por el usuario, si aún no está presente.
MIN_DISTANCE Objetivos "MIN". Minimizar la distancia total recorrida
MIN_WORKING_TIME Minimizar el tiempo de trabajo total, sumado para todos los vehículos
MIN_TRAVEL_TIME Igual que lo anterior, pero enfocándose solo en la duración del viaje.
MIN_NUM_VEHICLES Minimizar la cantidad de vehículos utilizados

PrecedenceRule

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

Varias precedencias pueden hacer referencia a los mismos eventos (o relacionados), p.ej., "la recogida de B ocurre después de la entrega de A" y "la recogida de C ocurre después de la recogida de B".

Además, las precedencias solo se aplican cuando se realizan ambos envíos y, de lo contrario, 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

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

first_index

int32

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

second_index

int32

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

ShipmentRoute

La ruta de un vehículo se puede descomponer, a lo largo del eje 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 distinguimos entre los siguientes conceptos:

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

Invariantes:

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

Si nos acercamos, esto es lo que sucede durante un Transition y un Visit:

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

Por último, así es como se pueden organizar los estados TRAVEL, BREAKS, DELAY y WAIT durante una transición.

  • No se superponen.
  • La DEMORA es única y debe ser un período continuo justo antes de la siguiente visita (o el final del vehículo). Por lo tanto, basta con conocer la duración del retraso para saber su hora de inicio y de finalización.
  • Los BREAKS son períodos de tiempo contiguos que no se superponen. La respuesta especifica la hora de inicio y la duración de cada descanso.
  • TRAVEL y WAIT son "interrumpibles": se pueden interrumpir varias veces durante esta transición. Los clientes pueden suponer que el viaje se realiza "lo antes posible" y que la "espera" 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

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

vehicle_label

string

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

vehicle_start_time

Timestamp

Es la hora a la que el vehículo inicia su ruta.

vehicle_end_time

Timestamp

Es la hora en la que el vehículo finaliza su ruta.

visits[]

Visit

Es la secuencia ordenada de visitas que representa 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 se usa.

transitions[]

Transition

Es la lista ordenada de transiciones para la ruta.

has_traffic_infeasibilities

bool

Cuando OptimizeToursRequest.consider_road_traffic se establece como verdadero, este campo indica que las inconsistencias en los tiempos de las rutas se predicen con estimaciones de la duración del viaje basadas en el tráfico. Es posible que no haya tiempo suficiente para completar el viaje ajustado al tráfico, los retrasos y los descansos entre visitas, antes de la primera visita o después de la última, sin dejar de cumplir con los períodos de visita y del vehículo. Por ejemplo:

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

Es probable que la llegada a next_visit se produzca después de su ventana de tiempo actual debido al aumento de la estimación de la duración del viaje travel_duration(previous_visit, next_visit) por el tráfico. Además, es posible que se deba superponer una pausa con una visita debido a un aumento en las estimaciones de la duración del viaje y a las restricciones de la ventana de tiempo de la visita o de la pausa.

route_polyline

EncodedPolyline

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

breaks[]

Break

Son los 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 de esta ruta. Los campos de AggregatedMetrics se suman en todos los ShipmentRoute.transitions o ShipmentRoute.visits, según el contexto.

vehicle_fullness

VehicleFullness

Campo VehicleFullness para calcular qué tan cerca están las métricas limitadas de sus respectivos límites de vehículos. Sus campos son proporciones entre un campo de métrica limitado (p.ej., AggregatedMetrics.travel_distance_meters) y el límite de vehículos relacionado (p.ej., Vehicle.route_distance_limit).

Experimental: El comportamiento o la existencia de este campo pueden cambiar en el futuro.

route_costs

map<string, double>

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

route_total_cost

double

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

Receso

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

Campos
start_time

Timestamp

Es la hora de inicio de un descanso.

duration

Duration

Es la duración de una pausa.

EncodedPolyline

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

Campos
points

string

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

Transición

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

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

Campos
travel_duration

Duration

Duración del viaje durante esta transición.

travel_distance_meters

double

Es la distancia recorrida durante la transición.

traffic_info_unavailable

bool

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

delay_duration

Duration

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

break_duration

Duration

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

wait_duration

Duration

Es el tiempo que se pasa esperando durante esta transición. La duración de la espera corresponde al tiempo de inactividad y no incluye el tiempo de descanso. 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 por conveniencia. Es igual a lo siguiente:

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

Timestamp

Es la hora de inicio de esta transición.

route_polyline

EncodedPolyline

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

route_token

string

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

vehicle_loads

map<string, VehicleLoad>

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

Las cargas durante la primera transición son las cargas iniciales de la ruta del vehículo. Luego, después de cada visita, se agregan o restan los load_demands de la visita para obtener las cargas de la siguiente transición, según si la visita fue de retiro o de 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. La unidad de carga suele indicarse con el tipo. Consulta los Transition.vehicle_loads.

Visitar

Es una visita que se realiza durante una ruta. Esta visita corresponde a un retiro o una entrega de un Shipment.

Campos
shipment_index

int32

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

is_pickup

bool

Si es verdadero, la visita corresponde a la recogida de un Shipment. De lo contrario, corresponde a una entrega.

visit_request_index

int32

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

start_time

Timestamp

Es la hora a la que comienza la visita. Ten en cuenta que el vehículo puede llegar antes de esta hora a la ubicación de la visita. Los períodos son coherentes con el ShipmentModel.

load_demands

map<string, Load>

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

detour

Duration

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

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

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

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

string

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

visit_label

string

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

visit_type

VisitType

Opcional. Especifica el tipo de visita. Anula el campo Visit.is_pickup.

injected_solution_location_token

int32

Es un token opaco que representa información sobre una ubicación de visita.

Este campo se puede propagar en las visitas de las rutas de resultados cuando VisitRequest.avoid_u_turns se estableció como verdadero para esta visita o si ShipmentModel.avoid_u_turns se estableció como verdadero en la solicitud OptimizeToursRequest.

Experimental: Consulta https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request para obtener más detalles.

VisitType

Indica si la visita es para retirar o entregar un pedido, o bien si se trata de una visita a un Stop. Las visitas a una parada solo se usan cuando se habilita la optimización multimodal.

Enums
VISIT_TYPE_UNSPECIFIED Tipo de visita no especificado.
PICKUP_SHIPMENT La visita corresponde a la recolección de un envío.
DELIVER_SHIPMENT La visita corresponde a la entrega de un envío.

ShipmentTypeIncompatibility

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

Campos
types[]

string

Lista de tipos incompatibles. Dos envíos que tienen diferentes shipment_types entre los que se indican son "incompatibles".

incompatibility_mode

IncompatibilityMode

Es el modo que se aplica a la incompatibilidad.

IncompatibilityMode

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

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

En este modo, dos envíos con tipos incompatibles nunca pueden estar en el mismo vehículo al mismo tiempo:

  • Solo pueden compartir el mismo vehículo si uno se entrega antes de que se recoja el otro.
  • Cuando ambos envíos son solo de retiro (sin entregas) o solo de entrega (sin retiros), no pueden compartir el mismo vehículo.

ShipmentTypeRequirement

Especifica los requisitos entre los envíos según su shipment_type. Los detalles del requisito se definen según el modo de requisito.

Campos
required_shipment_type_alternatives[]

string

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

dependent_shipment_types[]

string

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

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

requirement_mode

RequirementMode

Es el modo que se aplica al requisito.

RequirementMode

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

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

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

Por lo tanto, una recolección de envío "dependiente" debe tener una de las siguientes opciones:

  • Un envío "obligatorio" solo de entrega que se entrega en la ruta después
  • Un envío "obligatorio" se recoge en la ruta antes de él y, si el envío "obligatorio" tiene una entrega, esta se debe realizar después de la recogida del envío "dependiente".
IN_SAME_VEHICLE_AT_DELIVERY_TIME Igual que antes, excepto que los envíos "dependientes" deben tener un envío "obligatorio" en su vehículo en el momento de la entrega.

SkippedShipment

Especifica los detalles de los envíos no realizados en una solución. En los casos triviales o si podemos identificar el motivo de la omisión, lo informamos 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 el Shipment.

reasons[]

Reason

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

penalty_cost

double

Esta es una copia de Shipment.penalty_cost, que se incluye aquí para que sea más fácil ver la gravedad de un envío omitido.

Experimental: El comportamiento o la existencia de este campo pueden cambiar en el futuro.

estimated_incompatible_vehicle_ratio

double

Es la proporción estimada de vehículos que no pueden realizar este envío por, al menos, uno de los motivos que se indican a continuación. Nota: Esto solo se completa cuando los motivos involucran un vehículo.

Experimental: El comportamiento o la existencia de este campo pueden cambiar en el futuro.

Motivo

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

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

El envío omitido no es compatible con ningún vehículo. Los motivos pueden ser diferentes para todos los vehículos, pero se superaría la capacidad de "Manzanas" de al menos un vehículo (incluido el vehículo 1), se superaría la capacidad de "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 del código.

example_vehicle_indices[]

int32

Es igual que example_vehicle_index, excepto que proporcionamos la lista de varios vehículos identificados. Esta lista no es necesariamente exhaustiva. Esto solo se completa si [fill_example_vehicle_indices_in_skipped_reasons][] es verdadero.

Experimental: El comportamiento o la existencia de este campo pueden cambiar en el futuro.

example_exceeded_capacity_type

string

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

example_vehicle_index

int32

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

Código

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

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

La distancia mínima necesaria para realizar este envío, es decir, desde 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 la 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 la duración del viaje, el tiempo de espera y el tiempo de servicio, supera el route_duration_limit del vehículo.

Nota: La duración del viaje se calcula en el mejor de los casos, es decir, como la distancia geodésica × 36 m/s (aproximadamente 130 km/h).

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

El campo ignore del vehículo es verdadero.

Experimental: El comportamiento o la existencia de este campo pueden cambiar en el futuro.

SHIPMENT_IGNORED

El campo ignore del envío es verdadero.

Experimental: El comportamiento o la existencia de este campo pueden cambiar en el futuro.

SKIPPED_IN_INJECTED_SOLUTION_CONSTRAINT

El envío se omite en el injected_solution_constraint.

Experimental: El comportamiento o la existencia de este campo pueden cambiar en el futuro.

VEHICLE_ROUTE_IS_FULLY_SEQUENCE_CONSTRAINED

La flexibilización de la ruta del vehículo especificada en injected_solution_constraint no permite que se inserte ninguna visita.

Experimental: El comportamiento o la existencia de este campo pueden cambiar en el futuro.

ZERO_PENALTY_COST

El envío tiene un costo de penalización de cero. Si bien esto puede ser útil como una opción de modelado avanzada, también puede explicar a posteriori por qué se omitió un envío.

Experimental: El comportamiento o la existencia de este campo pueden cambiar en el futuro.

TimeWindow

Las ventanas de tiempo restringen la hora de un evento, como la hora de llegada a una visita o la hora de inicio y finalización de un vehículo.

Los límites estrictos del período, start_time y end_time, aplican la hora más temprana y más tardía del evento, de modo que start_time <= event_time <= end_time. El límite inferior de la ventana de tiempo flexible, soft_start_time, expresa una preferencia para que el evento ocurra en soft_start_time o después de ese momento, lo que genera un costo proporcional al tiempo que transcurre antes de soft_start_time. El límite superior de la ventana de tiempo flexible, soft_end_time, expresa una preferencia para que el evento ocurra en soft_end_time o antes de esa hora, lo que genera un costo proporcional al tiempo que transcurre después de 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` <= `end_time` and
  0 <= `start_time` <= `soft_start_time` and
  0 <= `soft_end_time` <= `end_time`.
Campos
start_time

Timestamp

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

end_time

Timestamp

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

soft_start_time

Timestamp

Es la hora de inicio flexible del período.

soft_end_time

Timestamp

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

cost_per_hour_before_soft_start_time

double

Es un costo por hora que se agrega a otros costos del modelo si el evento ocurre antes de soft_start_time, 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 establecer si se estableció soft_start_time.

cost_per_hour_after_soft_end_time

double

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

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

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

TransitionAttributes

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

Campos
src_tag

string

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

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

excluded_src_tag

string

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

dst_tag

string

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

excluded_dst_tag

string

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

cost

double

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

cost_per_kilometer

double

Especifica un costo por kilómetro que se aplica a la distancia recorrida mientras se realiza esta transición. Se suma a cualquier Vehicle.cost_per_kilometer especificado en los vehículos.

distance_limit

DistanceLimit

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

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

delay

Duration

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

Esta demora siempre se produce después de finalizar la visita de origen y antes de comenzar la visita de destino.

URI

Es un identificador de recursos universal que apunta a un recurso que la API de Route Optimization puede leer y escribir.

Campos
uri

string

Es el URI del recurso. Es posible que el recurso aún no exista.

El contenido del recurso se codifica como JSON o textproto. Solo se admiten recursos de Google Cloud Storage. Si el recurso está codificado como JSON, el nombre del recurso debe tener el sufijo .json. Si el recurso está codificado como textproto, el nombre del recurso debe tener el sufijo .txtpb. Por ejemplo, un URI de Google Cloud Storage para un archivo codificado en JSON podría verse de la siguiente manera: gs://bucket/path/input/object.json.

Vehículo

Modela un vehículo en un problema de envío. Resolver un problema de envío creará una ruta que comenzará en start_location y terminará en end_location para este vehículo. Una ruta es una secuencia de visitas (consulta ShipmentRoute).

Campos
display_name

string

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

travel_mode

TravelMode

Es el medio de transporte, que afecta las rutas que puede usar el vehículo y su velocidad. Consulta también travel_duration_multiple.

route_modifiers

RouteModifiers

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

start_location

LatLng

Es la ubicación geográfica en la que comienza el vehículo antes de recoger cualquier envío. Si no se especifica, el vehículo comienza en su primera recogida. Si el modelo de envío tiene matrices de duración y distancia, no se debe especificar start_location.

start_waypoint

Waypoint

Es el punto de referencia que representa una ubicación geográfica en la que el vehículo comienza antes de retirar cualquier envío. Si no se especifica start_waypoint ni start_location, el vehículo comienza en su primera recogida. 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 en la que termina el vehículo después de completar su último VisitRequest. Si no se especifica, el ShipmentRoute del vehículo finaliza de inmediato cuando completa su último VisitRequest. Si el modelo de envío tiene matrices de duración y distancia, no se debe especificar end_location.

end_waypoint

Waypoint

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

start_tags[]

string

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

No se permiten cadenas vacías ni duplicadas.

end_tags[]

string

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

No se permiten cadenas vacías ni duplicadas.

start_time_windows[]

TimeWindow

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

Las ventanas de tiempo que pertenecen al mismo campo repetido deben ser disjuntas, es decir, ninguna ventana de tiempo puede superponerse con otra ni ser adyacente a ella, y deben estar en orden cronológico.

cost_per_hour_after_soft_end_time y soft_end_time solo se pueden establecer si hay un único período.

end_time_windows[]

TimeWindow

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

Las ventanas de tiempo que pertenecen al mismo campo repetido deben ser disjuntas, es decir, ninguna ventana de tiempo puede superponerse con otra ni ser adyacente a ella, y deben estar en orden cronológico.

cost_per_hour_after_soft_end_time y soft_end_time solo se pueden establecer si hay un único período.

unloading_policy

UnloadingPolicy

Es la política de descarga que se aplica al vehículo.

load_limits

map<string, LoadLimit>

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

cost_per_hour

double

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

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

cost_per_traveled_hour

double

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

cost_per_kilometer

double

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

fixed_cost

double

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

used_if_route_is_empty

bool

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

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

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

route_duration_limit

DurationLimit

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

travel_duration_limit

DurationLimit

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

route_distance_limit

DistanceLimit

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

extra_visit_duration_for_visit_type

map<string, Duration>

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

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

break_rule

BreakRule

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

label

string

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

ignore

bool

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

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

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

travel_duration_multiple

double

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

ADVERTENCIA: Las duraciones del 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 provocar una pérdida de precisión.

Consulta también extra_visit_duration_for_visit_type a continuación.

DurationLimit

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

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

Campos
max_duration

Duration

Es un límite estricto que restringe la duración para que sea, como máximo, max_duration.

soft_max_duration

Duration

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

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

quadratic_soft_max_duration

Duration

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

Si se establece quadratic_soft_max_duration, se deben cumplir las siguientes condiciones:

  • No debe ser un valor negativo.
  • Se debe definir max_duration.
  • quadratic_soft_max_duration debe ser inferior a max_duration.
  • 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

Es el costo por hora en el que se incurre si se incumple el umbral de soft_max_duration. El costo adicional es 0 si la duración es inferior al umbral; de lo contrario, el costo depende de la duración de la siguiente manera:

  cost_per_hour_after_soft_max * (duration - soft_max_duration)

El costo no debe ser negativo.

cost_per_square_hour_after_quadratic_soft_max

double

Es el costo por hora al cuadrado en el que se incurre 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, el costo depende de la duración de la siguiente manera:

  cost_per_square_hour_after_quadratic_soft_max *
  (duration - quadratic_soft_max_duration)^2

El costo no debe ser negativo.

LoadLimit

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

Campos
soft_max_load

int64

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

cost_per_unit_above_soft_max

double

Si la carga supera soft_max_load en la ruta de este vehículo, se aplica la siguiente penalización de costo (solo una vez por vehículo): (carga - soft_max_load) * cost_per_unit_above_soft_max. Todos los costos se suman y deben estar en la misma unidad que Shipment.penalty_cost. Los límites flexibles solo se pueden definir en los tipos que se aplican únicamente a las recolecciones o solo a las entregas en todo el modelo.

start_load_interval

Interval

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

end_load_interval

Interval

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

max_load

int64

Es la cantidad máxima aceptable de carga.

cost_per_kilometer

LoadCost

Es el costo de mover una unidad de carga a lo largo de un kilómetro para este vehículo. Esto se puede usar como un proxy para el consumo de combustible: si la carga es un peso (en Newtons), entonces carga*kilómetro tiene la dimensión de una energía.

Experimental: Consulta https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request para obtener más detalles.

cost_per_traveled_hour

LoadCost

Es el costo de viajar con una unidad de carga durante una hora para este vehículo.

Experimental: Consulta https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request para obtener más detalles.

Intervalo

Es el intervalo de cantidades de carga aceptables.

Campos
min

int64

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

max

int64

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

LoadCost

Es el costo de mover una unidad de carga durante un Transition. Para una carga determinada, el costo es la suma de dos partes:

  • min(load, load_threshold) * cost_per_unit_below_threshold
  • max(0, load - load_threshold) * cost_per_unit_above_threshold

Con este costo, las soluciones prefieren entregar primero las demandas altas o, de manera equivalente, recoger las demandas altas al final. Por ejemplo, si un vehículo tiene

load_limit {
  key: "weight"
  value {
    cost_per_kilometer {
      load_threshold: 15
      cost_per_unit_below_threshold: 2.0
      cost_per_unit_above_threshold: 10.0
    }
  }
}

y su ruta es inicio,retiro,retiro,entrega,entrega,fin con las siguientes transiciones:

transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 20 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }

entonces el costo en el que incurre este LoadCost es (cost_below * load_below * kilómetros + cost_above * load_above * kms)

  • transición 0: 0.0
  • transición 1: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • transición 2: 2.0 * 15 * 1.0 + 10.0 * (20 - 15) * 1.0 = 80.0
  • transición 3: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • transición 4: 0.0

Por lo tanto, el LoadCost de la ruta es 120.0.

Sin embargo, si la ruta es inicio,retiro,entrega,retiro,entrega,finalización con transiciones:

transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }

entonces el costo en el que incurre este LoadCost es

  • transición 0: 0.0
  • transición 1: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • transición 2: 0.0
  • transición 3: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • transición 4: 0.0

Aquí, el LoadCost sobre la ruta es 40.0.

LoadCost hace que las soluciones con transiciones de carga pesada sean más costosas.

Experimental: Consulta https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request para obtener más detalles.

Campos
load_threshold

int64

Es la cantidad de carga por encima de la cual el costo de mover una unidad de carga cambia de cost_per_unit_below_threshold a cost_per_unit_above_threshold. Debe ser >= 0.

cost_per_unit_below_threshold

double

Es el costo de mover una unidad de carga, para cada unidad entre 0 y el umbral. Debe ser un valor finito y >= 0.

cost_per_unit_above_threshold

double

Es el costo de mover una unidad de carga por cada unidad que supere el umbral. En el caso especial de que el umbral sea 0, se trata de un costo fijo por unidad. Debe ser un valor finito y >= 0.

TravelMode

Son los modos de viaje que pueden usar los vehículos.

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

Nota: Las rutas de WALKING están en versión beta y, a veces, es posible que no incluyan veredas o rutas peatonales claras. Debes mostrar esta advertencia al usuario para todas las rutas a pie que muestres en tu app.

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

UnloadingPolicy

Es la política sobre cómo se puede descargar un vehículo. Se aplica solo a los envíos que tienen un retiro y una entrega.

Otros envíos pueden realizarse en cualquier lugar de la ruta, independientemente de unloading_policy.

Enums
UNLOADING_POLICY_UNSPECIFIED Política de descarga no especificada; las entregas solo deben realizarse después de sus retiros correspondientes.
LAST_IN_FIRST_OUT Las entregas deben realizarse en el orden inverso al de las retiradas
FIRST_IN_FIRST_OUT Las entregas deben realizarse en el mismo orden que las recogidas

VehicleFullness

VehicleFullness es una métrica que calcula qué tan lleno está un vehículo. Cada campo VehicleFullness está entre 0 y 1, y se calcula como la proporción entre un campo de métrica limitado (p.ej., AggregatedMetrics.travel_distance_meters) y su límite de vehículo relacionado (p.ej., Vehicle.route_distance_limit), si existe. De lo contrario, la proporción de llenado no se establece. Si el límite es 0, el campo se establece en 1. Nota: Cuando una ruta está sujeta a inviabilidades de tráfico, algunas proporciones de ocupación sin procesar pueden superar 1.0, p.ej., el vehículo puede superar su límite de distancia. En estos casos, limitamos los valores de plenitud a 1.0.

Campos
max_fullness

double

Máximo de todos los demás campos de este mensaje.

distance

double

Es la proporción entre AggregatedMetrics.travel_distance_meters y Vehicle.route_distance_limit. Si no se establece Vehicle.route_distance_limit, este campo no se establecerá.

travel_duration

double

Es la proporción entre [AggregatedMetrics.travel_duration_seconds][] y Vehicle.travel_duration_limit. Si no se establece Vehicle.travel_duration_limit, este campo no se establecerá.

active_duration

double

Es la proporción entre [AggregatedMetrics.total_duration_seconds][] y Vehicle.route_duration_limit. Si no se establece Vehicle.route_duration_limit, este campo no se establecerá.

max_load

double

Es la proporción máxima entre todos los tipos de [AggregatedMetrics.max_load][] y sus respectivos Vehicle.load_limits. Si no se configuran todos los campos Vehicle.load_limits, este campo no se configurará.

active_span

double

La proporción (vehicle_end_time - vehicle_start_time) / (latest_vehicle_end_time - earliest_vehicle_start_time) para un vehículo determinado. Si el denominador no está presente, se usa (ShipmentModel.global_end_time - ShipmentModel.global_start_time) en su lugar.

Punto de referencia

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

Campos
side_of_road

bool

Opcional. Indica que la ubicación de este punto de referencia tiene como objetivo que el vehículo se detenga en un lado específico de la ruta. Cuando estableces este valor, la ruta pasa por la ubicación para que el vehículo pueda detenerse en el lado de la ruta hacia el que se sesga la ubicación desde el centro de la ruta. Esta opción no funciona para el modo de viaje "WALKING".

vehicle_stopover

bool

Indica que el punto de referencia está destinado a que los vehículos se detengan, ya sea para recoger o dejar pasajeros. Esta opción solo funciona para el modo de viaje "DRIVING" y cuando el "location_type" es "location".

Experimental: El comportamiento o la existencia de este campo pueden cambiar en el futuro.

Campo de unión location_type. Diferentes formas de representar una ubicación location_type puede ser solo uno de los parámetros siguientes:
location

Location

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

place_id

string

Es el ID de lugar del PDI asociado con el punto de referencia.

Cuando uses un ID de lugar para especificar la ubicación de llegada o salida de una VisitRequest, usa un ID de lugar que sea lo suficientemente específico como para determinar una ubicación LatLng para la navegación al lugar. Por ejemplo, un ID de lugar que representa un edificio es adecuado, pero no se recomienda un ID de lugar que representa una ruta.