Package google.maps.routeoptimization.v1

Índice

RouteOptimization

Servicio para optimizar los recorridos de vehículos.

Validez de ciertos tipos de campos:

  • google.protobuf.Timestamp
    • Las horas se expresan en tiempo Unix: segundos desde 1970-01-01T00:00:00+00:00.
    • Los segundos deben estar en el rango de [0, 253402300799], es decir, en el rango de [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • Los nanosegundos deben estar sin configurar o establecidos en 0.
  • google.protobuf.Duration
    • Los segundos deben estar en el rango de [0, 253402300799], es decir, en el rango de [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • Los nanosegundos deben estar sin configurar o establecidos en 0.
  • google.type.LatLng
    • La latitud debe estar en el rango [-90.0, 90.0].
    • La longitud debe estar en el rango [-180.0, 180.0].
    • Al menos una de las coordenadas de latitud y longitud debe ser distinta de cero.
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

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

Este método es una operación de larga duración (LRO). Las entradas (mensajes OptimizeToursRequest) y las salidas (mensajes OptimizeToursResponse) para la optimización 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 del LRO es falso, significa que aún se está procesando al menos una solicitud. Es posible que otras solicitudes se hayan completado correctamente y sus resultados estén disponibles en Cloud Storage.

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

Permisos de autorización

Requiere el siguiente alcance de OAuth:

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

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

  • routeoptimization.operations.create

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

OptimizeTours

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

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

Un modelo de ShipmentModel consta principalmente de Shipment que deben llevarse a cabo y Vehicle que se pueden usar para transportar los Shipment. Los ShipmentRoutes asignan Shipments a los Vehicles. Más específicamente, asignan una serie de Visits 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 ShipmentModel.

Permisos de autorización

Requiere el siguiente alcance de OAuth:

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

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

  • routeoptimization.locations.use

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

OptimizeToursLongRunning

rpc OptimizeToursLongRunning(OptimizeToursRequest) returns (Operation)

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

El long-running operation (LRO) que se devuelve tendrá un nombre con el formato <parent>/operations/<operation_id> y se podrá 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 la operación se realiza correctamente.

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

Permisos de autorización

Requiere el siguiente alcance de OAuth:

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

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

  • routeoptimization.operations.create

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

OptimizeToursUri

rpc OptimizeToursUri(OptimizeToursUriRequest) returns (Operation)

Esta es una variante del método OptimizeToursLongRunning diseñada para optimizaciones con valores de tiempo de espera y tamaños de entrada o 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 al método OptimizeTours para las optimizaciones que tardan más de unos minutos y los tamaños de entrada o salida que son mayores a 8 MB, aunque también se puede usar para optimizaciones más cortas y pequeñas.

El long-running operation (LRO) que se devuelve tendrá un nombre con el formato <parent>/operations/<operation_id> y se podrá usar para hacer un seguimiento del progreso del cálculo. El tipo de campo metadata es OptimizeToursLongRunningMetadata. El tipo de campo response es OptimizeToursUriResponse si la operación se realiza correctamente.

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

Permisos de autorización

Requiere el siguiente alcance de OAuth:

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

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

  • routeoptimization.operations.create

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

AggregatedMetrics

Son las métricas agregadas para ShipmentRoute (respectivamente, para OptimizeToursResponse en todos los elementos de Transition o Visit [respectivamente, en todos los elementos de ShipmentRoute]).

Campos
performed_shipment_count

int32

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 espera para una ruta o una solución.

delay_duration

Duration

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

break_duration

Duration

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

max_loads

map<string, VehicleLoad>

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

performed_mandatory_shipment_count

int32

Cantidad de envíos obligatorios realizados.

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

performed_shipment_penalty_cost_sum

double

Es la suma del 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.

Son los metadatos de la operación para las llamadas a BatchOptimizeToursRequest.

BatchOptimizeToursRequest

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

Campos
parent

string

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

Formato:

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

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

model_configs[]

AsyncModelConfig

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

AsyncModelConfig

Es la 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 y se puede usar como alias para hacer un seguimiento de los modelos.

input_config

InputConfig

Obligatorio. Es 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. Este valor se devuelve en la operación de larga duración después de que se completa la operación.

BreakRule

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

  • durante el viaje entre dos visitas (lo que incluye el tiempo inmediatamente anterior o posterior a una visita, pero no en el medio de una visita), en cuyo caso extiende el tiempo de tránsito correspondiente entre las visitas
  • o antes del arranque del vehículo (es posible que el vehículo no arranque en medio de una pausa), en cuyo caso no afecta la hora de arranque del vehículo.
  • o después del final del vehículo (ídem, con la hora de finalización del vehículo).
Campos
break_requests[]

BreakRequest

Es la secuencia de interrupciones. Ver el mensaje BreakRequest

frequency_constraints[]

FrequencyConstraint

Se pueden aplicar varios FrequencyConstraint. Todas deben satisfacerse 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 debe conocerse 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 orden (esto se verifica).

Campos
earliest_start_time

Timestamp

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

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

También 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 de 12 h, debe haber al menos un descanso de al menos una hora", ese ejemplo se traduciría al siguiente FrequencyConstraint:

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

Los tiempos 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 BreakRequest.

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

  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 este parámetro de restricción. No negativo. Consulta la descripción de FrequencyConstraint.

max_inter_break_duration

Duration

Obligatorio. Es el lapso máximo permitido de cualquier intervalo de tiempo en la ruta que no incluye, al menos de forma parcial, una interrupción de duration >= min_break_duration. Debe ser positivo.

DataFormat

Formatos de datos para archivos de entrada y salida

Enums
DATA_FORMAT_UNSPECIFIED Valor no válido. El formato no debe ser UNSPECIFIED.
JSON Es la notación de objetos de JavaScript.
PROTO_TEXT Es el formato de texto de Protocol Buffers. Consulta https://protobuf.dev/reference/protobuf/textformat-spec/

DistanceLimit

Es un límite que define la distancia máxima que se puede recorrer. Puede ser 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 ambos deben ser no negativos.

Campos
max_meters

int64

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

soft_max_meters

int64

Es un límite flexible que no aplica un límite de distancia máximo, 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 está por debajo del límite. De lo contrario, la fórmula que se usa para calcular el costo es la siguiente:

  (distance_meters - soft_max_meters) / 1000.0 *
  cost_per_kilometer_above_soft_max.

El costo no debe ser negativo.

GcsDestination

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

Campos
uri

string

Obligatorio. URI de Google Cloud Storage.

GcsSource

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

Campos
uri

string

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

InjectedSolutionConstraint

Es la solución insertada en la solicitud, que incluye 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 algunas rutas se omitan de la solución original. Las rutas y los envíos omitidos deben satisfacer las suposiciones básicas de validez 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 en la solución original. Observa el campo routes.

constraint_relaxations[]

ConstraintRelaxation

Para cero o más grupos de vehículos, especifica cuándo y en qué medida 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 relajarán las restricciones sobre las visitas y hasta qué nivel. Los envíos que se indican en el campo skipped_shipment están restringidos para que se omitan, es decir, no se pueden realizar.

Campos
relaxations[]

Relaxation

Son todas las relajaciones de 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 los 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 que como máximo un campo de relajación de restricciones esté vacío vehicle_indices. Un índice de vehículos solo se puede incluir una vez, incluso en 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).

Relajación

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

relaxations(i).level especifica el nivel de relajación de la restricción que se aplica a una visita #j que satisface lo siguiente:

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

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

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

Para aplicar un nivel de relajación si una visita cumple con threshold_visit_count O threshold_time, agrega dos relaxations con el mismo level: uno con solo threshold_visit_count establecido y el otro con solo threshold_time establecido. Si una visita satisface las condiciones de varios relaxations, se aplica el nivel más flexible. Como resultado, desde el inicio del vehículo hasta el final, pasando por las visitas a la ruta en orden, 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 momento y la secuencia de las visitas a la ruta que no satisfacen las condiciones de umbral de ningún relaxations están completamente restringidos, y no se pueden insertar visitas en estas secuencias. Además, si el inicio o el final de un vehículo no satisfacen las condiciones de ninguna relajación, la hora se fija, a menos que el vehículo esté vacío.

Campos
level

Level

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

threshold_time

Timestamp

Fecha y hora en la que se puede aplicar la relajación level.

threshold_visit_count

int32

Cantidad de visitas a partir de la cual se puede aplicar la relajación level. Si threshold_visit_count es 0 (o no está configurado), el level se puede aplicar directamente al inicio del vehículo.

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

Nivel

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

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

Enums
LEVEL_UNSPECIFIED

Nivel de relajación predeterminado implícito: 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 los horarios de inicio de las visitas y los horarios de inicio y finalización de los vehículos, pero cada visita seguirá vinculada al mismo vehículo y se deberá observar la secuencia de visitas: no se puede insertar ninguna visita entre ellas ni antes de ellas.
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD Es igual que RELAX_VISIT_TIMES_AFTER_THRESHOLD, pero la secuencia de visitas también es flexible: solo este vehículo puede realizar visitas, pero estas pueden no realizarse.
RELAX_ALL_AFTER_THRESHOLD Es igual que RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD, pero el vehículo también está relajado: las visitas son completamente gratuitas en el momento del umbral o después de este, y pueden dejar de realizarse.

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. Las direcciones (source) solo pueden ser una de las siguientes opciones:
gcs_source

GcsSource

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

Ubicación

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

Campos
lat_lng

LatLng

Son las coordenadas geográficas de la parada.

heading

int32

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

OptimizeToursLongRunningMetadata

Este tipo no tiene campos.

Son los metadatos de la operación para las llamadas a OptimizeToursLongRunning.

OptimizeToursRequest

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

Campos
parent

string

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

Formato:

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

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

timeout

Duration

Si se establece este tiempo de espera, el servidor 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 se agote el tiempo de espera.

model

ShipmentModel

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

solving_mode

SolvingMode

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

search_mode

SearchMode

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

injected_first_solution_routes[]

ShipmentRoute

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

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

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

  • Para todas las rutas, vehicle_index debe estar dentro del rango y no duplicarse.
  • Para todas las visitas, shipment_index y visit_request_index deben estar dentro del rango.
  • Solo se puede hacer referencia a un envío en una ruta.
  • La partida de un envío de retiro y entrega debe realizarse antes de la entrega.
  • No se puede realizar más de una alternativa de retiro o entrega de un envío.
  • para todas las rutas, los tiempos aumentan (es decir, vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time).
  • El 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 muestra un error de validación, sino que se puede mostrar un error que indique que no es factible.

injected_solution_constraint

InjectedSolutionConstraint

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

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

refresh_details_routes[]

ShipmentRoute

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

Desde el 2020/11, esto solo completa las polilíneas de las rutas no vacías y requiere que populate_polylines sea verdadero.

Los campos route_polyline de las rutas que se pasan pueden no ser coherentes con la ruta transitions.

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

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

interpret_injected_solutions_using_labels

bool

Si es verdadero, haz lo siguiente:

Esta interpretación se aplica a los campos injected_first_solution_routes, injected_solution_constraint y refresh_details_routes. Se puede usar cuando los índices de envíos o vehículos de la solicitud cambiaron desde que se creó la solución, 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 solicitud, se quita la ruta correspondiente de la solución junto con sus visitas. Si un shipment_label en la solución inyectada no corresponde a un envío de solicitud, se quita la visita correspondiente de la solución. Si un SkippedShipment.label en la solución insertada no corresponde a un envío de solicitud, se quita el SkippedShipment de la solución.

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

NOTA: El llamador debe asegurarse de que cada Vehicle.label (respectivamente, Shipment.label) identifica de forma única una entidad de vehículo (o envío) que se usa en las dos solicitudes pertinentes: 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 del 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 completarán las polilíneas en las respuestas de ShipmentRoute.

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 configura este parámetro, 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 (aunque sigue siendo pequeño).

use_geodesic_distances

bool

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

label

string

Es la etiqueta que se puede usar para identificar esta solicitud y que se devuelve en OptimizeToursResponse.request_label.

geodesic_meters_per_second

double

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

max_validation_errors

int32

Trunca la cantidad de errores de validación que se muestran. Por lo general, estos errores se adjuntan a una carga útil de error INVALID_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 y equilibra la latencia con la calidad de la solución. En todos los modos, se aplica el plazo global de la solicitud.

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

SolvingMode

Define cómo el solucionador debe controlar la solicitud. En todos los modos, excepto en 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. Es posible que se emitan advertencias en [OptimizeToursResponse.validation_errors][google.cloud.optimization.v1.OptimizeToursResponse.validation_errors].
VALIDATE_ONLY Solo valida el modelo sin resolverlo: completa tantos OptimizeToursResponse.validation_errors como sea posible.
DETECT_SOME_INFEASIBLE_SHIPMENTS

Solo completa 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 queda vacío.

IMPORTANTE: Aquí no se muestran todos los envíos no factibles, sino solo los que se detectan como no factibles durante el preprocesamiento.

TRANSFORM_AND_RETURN_REQUEST

Este modo solo funciona si ShipmentModel.objectives no está vacío. No se resolvió la solicitud. Solo se valida y se completa con los costos correspondientes a los objetivos determinados. 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

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

Campos
routes[]

ShipmentRoute

Son las rutas calculadas para cada vehículo. La ruta i-ésima corresponde al i-ésimo vehículo del modelo.

request_label

string

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

skipped_shipments[]

SkippedShipment

Es la lista de todos los envíos que se omitieron.

validation_errors[]

OptimizeToursValidationError

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

processed_request

OptimizeToursRequest

En algunos casos, modificamos la solicitud entrante antes de resolverla, es decir, agregamos costos. Si solving_mode == TRANSFORM_AND_RETURN_REQUEST, aquí se devuelve la solicitud modificada.

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

metrics

Metrics

Son las métricas de duración, distancia y uso de esta solución.

Métricas

Son las métricas generales, agregadas en todas las rutas.

Campos
aggregated_route_metrics

AggregatedMetrics

Se agregan en todas las rutas. Cada métrica es la suma (o el máximo, en el caso de 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

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 ShipmentRoute.vehicle_start_time para todos los vehículos usados.

latest_vehicle_end_time

Timestamp

Es la hora de finalización más reciente 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>

Costo de la solución, desglosado por los campos de solicitud relacionados con el costo. Las claves son rutas de acceso a .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 registran aquí en detalle, con la excepción de los costos relacionados con TransitionAttributes, que solo se registran de forma agregada a partir del 2022/01.

total_cost

double

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

OptimizeToursUriMetadata

Este tipo no tiene campos.

Son los metadatos de la operación para las llamadas a OptimizeToursUri.

OptimizeToursUriRequest

Es una solicitud que usa el método OptimizeToursUri.

Campos
parent

string

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

Formato:

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

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

input

Uri

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

output

Uri

Obligatorio. 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 el contenido del recurso.

OptimizeToursValidationError

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

Campos
code

int32

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

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

MULTIPLE ERRORS: Cuando hay varios errores, el proceso de validación intenta generar 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 de display_name="UNSPECIFIED", entre otros. Algunos errores pueden hacer que el proceso de validación omita otros errores.

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

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, puedes referirte a la primera recolección del vehículo núm. 4 y el envío núm. 2 de la siguiente manera:

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

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

error_message

string

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

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

offending_values

string

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

FieldReference

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

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

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

Campos
name

string

Nombre del campo, p.ej., "vehicles".

sub_field

FieldReference

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

Campo de unión index_or_key.

index_or_key puede ser una de las siguientes opciones:

index

int32

Índice del campo si se repite.

key

string

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 datos de salida.

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

GcsDestination

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

RouteModifiers

Encapsula un conjunto de condiciones opcionales que se deben satisfacer cuando se calculan rutas de vehículos. 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 incluyan rutas con peaje. Solo se aplica a los modos de viaje motorizados.

avoid_highways

bool

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

avoid_ferries

bool

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

avoid_indoor

bool

Opcional. Especifica si se debe evitar la navegación en interiores cuando sea razonable. Se dará 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 una de sus recolecciones hasta una de sus entregas. Para que el envío se considere realizado, un vehículo único debe visitar una de sus ubicaciones de retiro (y disminuir sus capacidades de repuesto en consecuencia) y, luego, visitar una de sus ubicaciones de entrega (y, por lo tanto, volver a aumentar sus capacidades de repuesto en consecuencia).

Campos
display_name

string

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

pickups[]

VisitRequest

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

deliveries[]

VisitRequest

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

load_demands

map<string, Load>

Demandas de carga del envío (por ejemplo, peso, volumen, cantidad de palets, 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étera. 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 realizarla. Los vehículos se indican por su índice en la lista vehicles de ShipmentModel.

costs_per_vehicle[]

double

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

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

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

costs_per_vehicle_indices[]

int32

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. Un índice de vehículos no se puede especificar 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 la partida hasta el destino. Si se especifica, debe ser no negativo, y el envío debe contener al menos un retiro y una entrega.

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

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

Si se especifican límites relativos y absolutos en el mismo envío, se usará el límite más restrictivo para cada par posible de retiro o entrega. Desde el 10/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 un retiro y una entrega. Esto no depende de las alternativas seleccionadas para el retiro y la entrega, ni de la velocidad del vehículo. Esto se puede especificar junto con las restricciones de desvío máximas: 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 recolecciones o 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 campo shipment_label del objeto ShipmentRoute.Visit correspondiente.

ignore

bool

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

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

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

penalty_cost

double

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

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

pickup_to_delivery_relative_detour_limit

double

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

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

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

Si se especifican límites relativos y absolutos en el mismo envío, se usará el límite más restrictivo para cada par posible de retiro o entrega. Desde el 10/2017, los desvíos solo se admiten cuando las duraciones de los viajes no dependen de los vehículos.

Cargar

Cuando se realiza una visita, se puede agregar una cantidad predefinida a la carga del vehículo si se trata de un retiro o 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. Dado que es un número entero, se recomienda a los usuarios que elijan una unidad adecuada para evitar la pérdida de precisión. Debe ser ≥ 0.

VisitRequest

Solicitud de una visita que se puede realizar en vehículo: tiene una ubicación geográfica (o dos, consulta a continuación), horarios de apertura y cierre representados por ventanas de tiempo, y un tiempo de duración del servicio (tiempo que pasa el vehículo una vez que llega para recoger o dejar mercancías).

Campos
arrival_location

LatLng

Es la ubicación geográfica a la que llega el vehículo cuando realiza esta acción de 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 ruta 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 el vehículo sale 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 la parada en la que el vehículo sale después de completar este VisitRequest. Se puede omitir si es igual a arrival_waypoint. Si el modelo de envío tiene matrices de distancia de duración, no se debe especificar departure_waypoint.

tags[]

string

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

time_windows[]

TimeWindow

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

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

Los períodos no deben superponerse ni ser adyacentes, y deben estar en orden ascendente.

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

duration

Duration

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

cost

double

Es el costo de atender esta solicitud de visita en una ruta de vehículo. Se puede usar para pagar diferentes costos por cada alternativa de retiro o entrega 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. 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 función para evitar giros en U es el mejor esfuerzo y 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 deben realizarse con un conjunto de vehículos, y minimiza el costo general, que es la suma de los siguientes elementos:

  • El costo de la planificación de rutas de los vehículos (suma del costo por tiempo total, el costo por tiempo de viaje y el costo fijo en 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 no debe tener 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 período del modelo debe ser inferior a un año, es decir, global_end_time y global_start_time deben estar a menos de 31536000 segundos de diferencia.

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

global_end_time

Timestamp

Si no se establece, se usa la hora predeterminada 00:00:00 UTC del 1 de enero de 1971 (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 del trabajo lo antes posible, por ejemplo. Este costo debe estar en la misma unidad que Shipment.penalty_cost.

duration_distance_matrices[]

DurationDistanceMatrix

Especifica las matrices de duración y distancia que se usan en el modelo. Si este campo está vacío, se usarán 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 la ubicación A y la finaliza en la ubicación A
  • 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 finaliza en locB, con la matriz "fast".
  • 1 vehículo que comienza su ruta en locB y la finaliza en locB, con la matriz "lenta".
  • 1 vehículo que comienza su ruta en locB y la finaliza 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 las distancias desde las visitas con la etiqueta duration_distance_matrix_src_tags(j) hasta otras visitas en la matriz i.

Las etiquetas corresponden a VisitRequest.tags o Vehicle.start_tags. Un VisitRequest o Vehicle determinado debe coincidir exactamente con una etiqueta en este campo. Ten en cuenta que las etiquetas de origen, destino y matriz de un Vehicle pueden ser las mismas. Del mismo modo, las etiquetas de origen y destino de un VisitRequest pueden ser las mismas. Todas las etiquetas deben ser diferentes y no pueden ser cadenas vacías. Si este campo no está vacío, duration_distance_matrices 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) (respectivamente, duration_distance_matrices(i).rows(j).meters(k)) define la duración (o la distancia) del viaje desde las visitas con la etiqueta duration_distance_matrix_src_tags(j) hasta las visitas con la etiqueta duration_distance_matrix_dst_tags(k) en la matriz i.

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

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 usan reglas de precedencia que incluyen 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 la visita y del vehículo hasta las ubicaciones de finalización de la visita y del vehículo.

Campos
rows[]

Row

Especifica las filas de la matriz de duración y distancia. Debe tener la misma cantidad de elementos que 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 exactamente con una matriz, es decir, exactamente uno de sus campos start_tags debe coincidir con el vehicle_start_tag de una matriz (y solo de esa matriz).

Todas las matrices deben tener un vehicle_start_tag diferente.

Fila

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

Campos
durations[]

Duration

Son los valores de duración para una fila determinada. Debe tener la misma cantidad de elementos que ShipmentModel.duration_distance_matrix_dst_tags.

meters[]

double

Son los valores de distancia para una fila determinada. Si no hay costos ni restricciones que hagan 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, p.ej., 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

Es el valor que se le debe asignar a este objetivo en relación con los demás. Puede ser cualquier número no negativo, y los pesos no tienen que sumar 1. Los pesos tienen un valor predeterminado de 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 total de trabajo, sumado para todos los vehículos
MIN_TRAVEL_TIME Igual que el anterior, pero enfocándose solo en el tiempo de viaje.
MIN_NUM_VEHICLES Minimiza la cantidad de vehículos que se usan.

PrecedenceRule

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

Varias precedencias pueden hacer referencia a los mismos eventos (o eventos relacionados), p.ej.: "El retiro de B se realiza después de la entrega de A" y "El retiro de C se realiza después del retiro 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 evento "first" es una entrega.

second_is_delivery

bool

Indica si el evento "segundo" es una entrega.

offset_duration

Duration

Es el desplazamiento entre el evento "primero" y el "segundo". Puede ser negativo.

first_index

int32

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

second_index

int32

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

ShipmentRoute

La ruta de un vehículo se puede descomponer a lo largo del eje temporal 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 tipos de datos:

  • "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 partida). Ocurren en un segundo determinado.
  • "intervalos de tiempo", como las visitas en sí y la transición entre visitas. Si bien los intervalos de tiempo a veces pueden tener una duración cero, es decir, comenzar y finalizar en el mismo segundo, a menudo tienen una duración positiva.

Invariantes:

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

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

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

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

  • No se superponen.
  • El DELAY es único y debe ser un período contiguo inmediatamente anterior a la próxima visita (o al final del viaje del vehículo). Por lo tanto, basta con conocer la duración de la demora para saber su hora de inicio y finalización.
  • Los BREAKS son períodos de tiempo contiguos y no superpuestos. La respuesta especifica la hora de inicio y la duración de cada interrupción.
  • 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 el "tiempo de 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

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

vehicle_label

string

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

vehicle_start_time

Timestamp

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

vehicle_end_time

Timestamp

Fecha y hora en que el vehículo finaliza su ruta.

visits[]

Visit

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

transitions[]

Transition

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 incoherencias en los horarios de las rutas se predicen con estimaciones de duración del viaje basadas en el tráfico. Es posible que no haya tiempo suficiente para completar el viaje ajustado al tráfico, las demoras y los descansos entre visitas, antes de la primera visita o después de la última, y, aun así, 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 más tarde que su intervalo actual debido al aumento de la estimación del tiempo de viaje travel_duration(previous_visit, next_visit) a causa del tráfico. Además, es posible que se fuerce una pausa para que se superponga con una visita debido a un aumento en las estimaciones del tiempo de viaje y a las restricciones de la ventana de tiempo de la visita o la pausa.

route_polyline

EncodedPolyline

Es la representación de la ruta en forma de polilínea codificada. 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 comienza en el start_time correspondiente y dura duration segundos.

metrics

AggregatedMetrics

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

vehicle_fullness

VehicleFullness

Campo VehicleFullness para calcular qué tan cerca están las métricas con límite de sus respectivos límites del vehículo. Sus campos son proporciones entre un campo de métricas con límite (p.ej., AggregatedMetrics.travel_distance_meters) y el límite del vehículo 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>

Costo de la ruta, desglosado por los campos de la solicitud relacionados con el costo. Las claves son rutas de acceso a .proto, relativas al 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 a lo largo de la ruta. Todos los costos definidos en el modelo se registran aquí en detalle, con la excepción de los costos relacionados con TransitionAttributes, que solo se registran de forma agregada a partir del 2022/01.

route_total_cost

double

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

Receso

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

Campos
start_time

Timestamp

Es la hora de inicio de un descanso.

duration

Duration

Es la duración de un descanso.

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

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

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

Campos
travel_duration

Duration

Duración del viaje durante esta transición.

travel_distance_meters

double

Distancia recorrida durante la transición.

traffic_info_unavailable

bool

Cuando se solicita el tráfico a través de OptimizeToursRequest.consider_road_traffic y no se puede recuperar la información del tráfico para un Transition, este valor booleano se establece como 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 la demora aplicadas a esta transición. Si hay alguna, la demora comienza exactamente delay_duration segundos antes del próximo evento (visita o finalización del vehículo). Consulta los TransitionAttributes.delay.

break_duration

Duration

Suma de la duración de los descansos que se producen durante esta transición, si corresponde. Los detalles sobre la hora de inicio y la duración de cada interrupción se almacenan en ShipmentRoute.breaks.

wait_duration

Duration

Tiempo de espera durante esta transición. La duración de espera corresponde al tiempo de inactividad y no incluye el tiempo de descanso. También ten en cuenta que este tiempo de espera se puede dividir en varios intervalos no contiguos.

total_duration

Duration

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

  • próxima visita start_time (o vehicle_end_time si 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 cambio de 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 la misma ruta. Este campo solo se propaga si populate_transition_polylines se establece como verdadero.

vehicle_loads

map<string, VehicleLoad>

Cargas de vehículos 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, los load_demands de la visita se suman o restan para obtener las cargas de la siguiente transición, según si la visita fue una recolección o una entrega.

VehicleLoad

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

Campos
amount

int64

Es la cantidad de carga 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

Índice del campo shipments en el ShipmentModel de origen.

is_pickup

bool

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

visit_request_index

int32

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

start_time

Timestamp

Fecha y hora en que comienza la visita. Ten en cuenta que es posible que el vehículo llegue antes a la ubicación de la visita. Los períodos coinciden con los de ShipmentModel.

load_demands

map<string, Load>

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

detour

Duration

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

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

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

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

string

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.

injected_solution_location_token

int32

Es un token opaco que representa información sobre la ubicación de una 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.

ShipmentTypeIncompatibility

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

Campos
types[]

string

Es la lista de tipos incompatibles. Dos envíos que tienen diferentes shipment_types entre los que se enumeran 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 apariencia de los 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:

  • Pueden compartir el mismo vehículo solo si uno se entrega antes de que se recoja el otro.
  • Cuando ambos envíos son solo para retiros (no entregas) o solo para entregas (no 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 de tipo required_shipment_type_alternatives en la misma ruta.

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

requirement_mode

RequirementMode

Es el modo aplicado 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 sin especificar. 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, el retiro de un envío "dependiente" debe tener una de las siguientes opciones:

  • Un envío "obligatorio" solo para entrega que se haya entregado en la ruta después de
  • Un envío "obligatorio" retirado en la ruta antes que él, y si el envío "obligatorio" tiene una entrega, esta entrega debe realizarse después del retiro del envío "dependiente".
IN_SAME_VEHICLE_AT_DELIVERY_TIME Igual que antes, excepto que los envíos "dependientes" deben tener un envío "obligatorio" en 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 la causa de la omisión, informamos el motivo aquí.

Campos
index

int32

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

label

string

Copia del Shipment.label correspondiente, si se especifica en 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 del 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 siguientes motivos. Nota: Este campo 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 enumerará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 son iguales, excepto example_vehicle_index. Ejemplo:

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

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

Campos
code

Code

Consulta los comentarios del código.

example_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. 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 excedió.

example_vehicle_index

int32

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

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 que haga que todos los envíos sean inviables.
DEMAND_EXCEEDS_VEHICLE_CAPACITY La demanda del envío supera la capacidad de un vehículo para algunos tipos de capacidad, uno de los cuales es 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, incluido el tiempo de viaje, el tiempo de espera y el tiempo de servicio, supera el route_duration_limit del vehículo.

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

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT Igual que antes, pero solo comparamos el tiempo de viaje mínimo y el travel_duration_limit del vehículo.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS El vehículo no puede realizar este envío en el mejor de los casos (consulta CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT para el cálculo del tiempo) si comienza en su hora de inicio más temprana: el tiempo total haría que el vehículo finalice 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 injected_solution_constraint.

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

VEHICLE_ROUTE_IS_FULLY_SEQUENCE_CONSTRAINED

La relajación de la ruta del vehículo especificada en injected_solution_constraint no permite insertar 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 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

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

Los límites de la ventana temporal estricta, start_time y end_time, imponen 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 temporal flexible, soft_start_time, expresa una preferencia para que el evento ocurra en soft_start_time o después de esa fecha, ya que genera un costo proporcional al tiempo que transcurre antes de soft_start_time. El límite superior de la ventana temporal flexible, soft_end_time, expresa una preferencia para que el evento ocurra en soft_end_time o antes, ya que incurre en un costo proporcional al tiempo que transcurre después de soft_end_time hasta que ocurre el evento. start_time, end_time, soft_start_time y soft_end_time deben estar dentro de los límites de tiempo globales (consulta ShipmentModel.global_start_time y ShipmentModel.global_end_time) y deben cumplir con lo siguiente:

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

Timestamp

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

end_time

Timestamp

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

soft_start_time

Timestamp

Es la hora de inicio flexible del período.

soft_end_time

Timestamp

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

cost_per_hour_before_soft_start_time

double

Es un costo por hora que se agrega a otros costos del modelo si el evento ocurre antes de soft_start_time. 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 configuró 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, y se calcula de la siguiente manera:

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

Este costo debe ser positivo, y el campo solo se puede configurar si se 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, todos los costos adicionales se suman y se aplica la restricción o el límite más estricto (siguiendo la semántica natural "Y").

Campos
src_tag

string

Son las 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 contienen src_tag o no contienen excluded_src_tag (según cuál de estos dos campos no esté vacío).

excluded_src_tag

string

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

dst_tag

string

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

excluded_dst_tag

string

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

cost

double

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

distance_limit

DistanceLimit

Especifica un límite en la distancia recorrida durante esta transición.

Desde el 2021/06, solo se admiten límites flexibles.

delay

Duration

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

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

URI

Es un identificador universal de recursos 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 los 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 comienza en start_location y termina 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 modo de viaje que afecta las rutas que puede usar el vehículo y su velocidad. Consulta también travel_duration_multiple.

route_modifiers

RouteModifiers

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

start_location

LatLng

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

start_waypoint

Waypoint

Es un punto de referencia que representa una ubicación geográfica en la que el vehículo se detiene antes de recoger cualquier envío. Si no se especifican start_waypoint ni start_location, el vehículo comienza en su primera parada. Si el modelo de envío tiene matrices de duración y distancia, no se debe especificar start_waypoint.

end_location

LatLng

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

end_waypoint

Waypoint

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

start_tags[]

string

Especifica las etiquetas adjuntas al 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

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

Los períodos que pertenecen al mismo campo repetido deben ser disjuntos, es decir, ningún período puede superponerse con otro ni ser adyacente a él, 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 solo 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 limitaciones, además de los límites de tiempo globales.

Los períodos que pertenecen al mismo campo repetido deben ser disjuntos, es decir, ningún período puede superponerse con otro ni ser adyacente a él, 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 solo período.

unloading_policy

UnloadingPolicy

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

load_limits

map<string, LoadLimit>

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

cost_per_hour

double

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

Es el costo por hora de la ruta del vehículo. Este costo se aplica al tiempo total que tarda la ruta y comprende el tiempo de 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 de viaje de la ruta del vehículo. Este costo solo se aplica al tiempo de viaje que toma la ruta (es decir, el que se informa en ShipmentRoute.transitions) y excluye el tiempo de espera y el tiempo de visita.

cost_per_kilometer

double

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

fixed_cost

double

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

used_if_route_is_empty

bool

Este campo solo se aplica a los vehículos cuando su ruta no incluye 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 su ubicación final, incluso si no realiza 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 su ubicación final, y no se programa ningún break_rule ni demora (desde TransitionAttributes) para este vehículo. En este caso, el objeto ShipmentRoute del vehículo no contiene ninguna información, excepto el índice y la etiqueta del vehículo.

route_duration_limit

DurationLimit

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

travel_duration_limit

DurationLimit

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

route_distance_limit

DistanceLimit

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

extra_visit_duration_for_visit_type

map<string, Duration>

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

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

break_rule

BreakRule

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

label

string

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

ignore

bool

Si es verdadero, used_if_route_is_empty debe ser falso y este vehículo permanecerá sin usarse.

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

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

travel_duration_multiple

double

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

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

Consulta también extra_visit_duration_for_visit_type a continuación.

DurationLimit

Es un límite que define 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 a un máximo de max_duration.

soft_max_duration

Duration

Es un límite flexible que no aplica un límite de duración máximo, pero, cuando se incumple, la ruta incurre en 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, la ruta incurre en un costo cuadrático en la duración. Este costo se suma a otros costos definidos en el modelo, con la misma unidad.

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

max_duration - quadratic_soft_max_duration <= 86400 seconds

cost_per_hour_after_soft_max

double

Es el costo por hora que se genera si se incumple el 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 cuadrada en el que se incurre si se incumple 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 alguna vez supera soft_max_load a lo largo de 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 solo 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 inicio 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

Costo de transportar una unidad de carga durante un kilómetro para este vehículo. Esto se puede usar como 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

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

Intervalo de importes de carga aceptables.

Campos
min

int64

Una carga mínima aceptable Debe ser ≥ 0. Si se especifican ambos, min debe ser menor o igual que 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 menor o igual que max.

LoadCost

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

  • min(carga, load_threshold) * cost_per_unit_below_threshold
  • máx.(0, carga - load_threshold) * cost_per_unit_above_threshold

Con este costo, las soluciones prefieren satisfacer primero las demandas altas o, de manera equivalente, satisfacer 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 start,pickup,pickup,delivery,delivery,end 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: 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 incurrido por este LoadCost es (cost_below * load_below * kilometers + 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 en la ruta es de 120.0.

Sin embargo, si la ruta es start,pickup,delivery,pickup,delivery,end con transiciones, sucede lo siguiente:

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 que genera 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 en la ruta es 40.0.

LoadCost hace que las soluciones con transiciones cargadas 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

Costo de mover una unidad de carga, para cada unidad entre 0 y el umbral. Debe ser un valor finito y mayor o igual que 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 igual a 0, se trata de un costo fijo por unidad. Debe ser un valor finito y mayor o igual que 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 Modo de viaje sin especificar, equivalente a DRIVING.
DRIVING Modo de viaje correspondiente a las instrucciones sobre cómo llegar en automóvil (coche, …).
WALKING Modo de viaje correspondiente a las indicaciones para llegar a pie.

UnloadingPolicy

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

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

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

VehicleFullness

VehicleFullness es una métrica que calcula qué tan lleno está un vehículo. Cada campo VehicleFullness se encuentra entre 0 y 1, y se calcula como la proporción entre un campo de métrica con límite (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 plenitud permanece sin establecer. Si el límite es 0, el campo se establece en 1. Nota: Cuando una ruta está sujeta a problemas de factibilidad de tráfico, algunos índices de ocupación sin procesar pueden superar el 1.0, p.ej., el vehículo puede exceder su límite de distancia. En estos casos, limitamos los valores de plenitud a 1.0.

Campos
max_fullness

double

Es el valor 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 Vehicle.route_distance_limit no está configurado, este campo tampoco lo estará.

travel_duration

double

Es la proporción entre [AggregatedMetrics.travel_duration_seconds][] y Vehicle.travel_duration_limit. Si Vehicle.travel_duration_limit no está configurado, este campo tampoco lo estará.

active_duration

double

Es la proporción entre [AggregatedMetrics.total_duration_seconds][] y Vehicle.route_duration_limit. Si Vehicle.route_duration_limit no está configurado, este campo tampoco lo estará.

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

Es 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 ruta. Los puntos de referencia marcan las ubicaciones de llegada y salida de los VisitRequests, y las ubicaciones de inicio y finalización de los vehículos.

Campos
side_of_road

bool

Opcional. Indica que la ubicación de este punto de referencia está destinada a que el vehículo se detenga en un lado específico de la ruta. Cuando configuras este valor, la ruta pasará por la ubicación para que el vehículo pueda detenerse al costado de la ruta hacia el que se inclina la ubicación desde el centro de la ruta. Esta opción no funciona para el modo de viaje "A PIE".

vehicle_stopover

bool

Indica que el punto de referencia está destinado a que los vehículos se detengan, con la intención de recoger o dejar pasajeros. Esta opción solo funciona para el modo de viaje "DRIVING" y cuando "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. Las direcciones (location_type) solo pueden ser una de las siguientes opciones:
location

Location

Es un punto especificado con coordenadas geográficas, que incluye un rumbo opcional.

place_id

string

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

Cuando uses un ID de lugar para especificar la ubicación de llegada o salida de un VisitRequest, usa un ID de lugar que sea lo suficientemente específico como para determinar una ubicación de 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.