Package google.maps.routeoptimization.v1

Índice

RouteOptimization

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

Validez de ciertos tipos de campos:

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

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

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

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

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

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

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

Permisos de autorización

Requiere el siguiente alcance de OAuth:

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

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

  • routeoptimization.operations.create

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

OptimizeTours

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

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

Un modelo ShipmentModel consta principalmente de Shipment que deben realizarse y Vehicle que se pueden usar para transportar los Shipment. Los ShipmentRoute asignan Shipment a Vehicle. Más específicamente, asignan una serie de Visit a cada vehículo, donde un Visit corresponde a un VisitRequest, que es 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 sobre el método OptimizeTours para las optimizaciones que tardan más de unos minutos.

El long-running operation (LRO) que se muestra tendrá un nombre con el formato <parent>/operations/<operation_id> y se puede usar para hacer un seguimiento del progreso del procesamiento. El tipo de campo metadata es OptimizeToursLongRunningMetadata. El tipo de campo response es OptimizeToursResponse si 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 grandes y tamaños de entrada y salida grandes.

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

Se debe preferir este método en lugar del método OptimizeTours para las optimizaciones que tardan más de unos minutos y los tamaños de entrada y salida que son mayores que 8 MB, aunque también se puede usar para optimizaciones más cortas y más pequeñas.

El long-running operation (LRO) que se muestra tendrá un nombre con el formato <parent>/operations/<operation_id> y se puede usar para hacer un seguimiento del progreso del procesamiento. El tipo de campo metadata es OptimizeToursLongRunningMetadata. El tipo de campo response es OptimizeToursUriResponse si 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

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

Campos
performed_shipment_count

int32

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

travel_duration

Duration

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

wait_duration

Duration

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

delay_duration

Duration

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

break_duration

Duration

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

visit_duration

Duration

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

total_duration

Duration

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

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

double

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

max_loads

map<string, VehicleLoad>

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

performed_mandatory_shipment_count

int32

Cantidad de envíos obligatorios realizados.

Experimental: Es posible que el comportamiento o la existencia de este campo cambien en el futuro.

performed_shipment_penalty_cost_sum

double

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

Experimental: Es posible que el comportamiento o la existencia de este campo cambien en el futuro.

BatchOptimizeToursMetadata

Este tipo no tiene campos.

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

BatchOptimizeToursRequest

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

Campos
parent

string

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

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

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

model_configs[]

AsyncModelConfig

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

AsyncModelConfig

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

Campos
display_name

string

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

input_config

InputConfig

Obligatorio. Información sobre el modelo de entrada.

output_config

OutputConfig

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

BatchOptimizeToursResponse

Este tipo no tiene campos.

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

BreakRule

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

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

BreakRequest

Es la secuencia de pausas. Consulta el mensaje BreakRequest.

frequency_constraints[]

FrequencyConstraint

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

BreakRequest

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

Campos
earliest_start_time

Timestamp

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

latest_start_time

Timestamp

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

min_duration

Duration

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

FrequencyConstraint

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

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

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

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

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

Duration

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

max_inter_break_duration

Duration

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

DataFormat

Formatos de datos para archivos de entrada y salida.

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

DistanceLimit

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

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

Campos
max_meters

int64

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

soft_max_meters

int64

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

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

cost_per_kilometer_below_soft_max

double

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

  min(distance_meters, soft_max_meters) / 1000.0 *
  cost_per_kilometer_below_soft_max.

Este costo no se admite en route_distance_limit.

cost_per_kilometer_above_soft_max

double

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

  (distance_meters - soft_max_meters) / 1000.0 *
  cost_per_kilometer_above_soft_max.

El costo no debe ser negativo.

GcsDestination

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

Campos
uri

string

Obligatorio. URI de Google Cloud Storage

GcsSource

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

Campos
uri

string

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

InjectedSolutionConstraint

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

Campos
routes[]

ShipmentRoute

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

skipped_shipments[]

SkippedShipment

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

constraint_relaxations[]

ConstraintRelaxation

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

ConstraintRelaxation

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

Campos
relaxations[]

Relaxation

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

vehicle_indices[]

int32

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

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

Relajación

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

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

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

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

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

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

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

Campos
level

Level

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

threshold_time

Timestamp

Es el momento en el que se puede aplicar la relajación level o después de él.

threshold_visit_count

int32

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

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

Nivel

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

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

Enumeraciones
LEVEL_UNSPECIFIED

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

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

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

InputConfig

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

Campos
data_format

DataFormat

Obligatorio. El formato de los datos de entrada.

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

GcsSource

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

Ubicación

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

Campos
lat_lng

LatLng

Son las coordenadas geográficas del punto de referencia.

heading

int32

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

OptimizeToursLongRunningMetadata

Este tipo no tiene campos.

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

OptimizeToursRequest

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

Campos
parent

string

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

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

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

timeout

Duration

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

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

model

ShipmentModel

Modelo de envío para resolver.

solving_mode

SolvingMode

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

search_mode

SearchMode

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

injected_first_solution_routes[]

ShipmentRoute

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

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

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

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

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

injected_solution_constraint

InjectedSolutionConstraint

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

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

refresh_details_routes[]

ShipmentRoute

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

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

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

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

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

interpret_injected_solutions_using_labels

bool

Si es verdadero, haz lo siguiente:

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

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

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

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

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

consider_road_traffic

bool

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

populate_polylines

bool

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

populate_transition_polylines

bool

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

allow_large_deadline_despite_interruption_risk

bool

Si se establece, la solicitud puede tener 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 mucho mayor (pero aún pequeño).

use_geodesic_distances

bool

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

label

string

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

geodesic_meters_per_second

double

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

max_validation_errors

int32

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

SearchMode

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

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

SolvingMode

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

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

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

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

TRANSFORM_AND_RETURN_REQUEST

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

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

OptimizeToursResponse

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

Campos
routes[]

ShipmentRoute

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

request_label

string

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

skipped_shipments[]

SkippedShipment

La lista de todos los envíos omitidos

validation_errors[]

OptimizeToursValidationError

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

processed_request

OptimizeToursRequest

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

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

metrics

Metrics

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

Métricas

Métricas generales, agregadas en todas las rutas

Campos
aggregated_route_metrics

AggregatedMetrics

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

skipped_mandatory_shipment_count

int32

Cantidad de envíos obligatorios omitidos.

used_vehicle_count

int32

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

earliest_vehicle_start_time

Timestamp

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

latest_vehicle_end_time

Timestamp

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

costs

map<string, double>

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

total_cost

double

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

OptimizeToursUriMetadata

Este tipo no tiene campos.

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

OptimizeToursUriRequest

Es una solicitud que usa el método OptimizeToursUri.

Campos
parent

string

Obligatorio. 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. Es el URI del objeto de Cloud Storage que contiene el OptimizeToursRequest.

output

Uri

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

OptimizeToursUriResponse

Una respuesta que muestra 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 el contenido del recurso no se haya modificado.

OptimizeToursValidationError

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

Campos
code

int32

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

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

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

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

display_name

string

El nombre visible del error.

fields[]

FieldReference

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

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

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

error_message

string

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

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

offending_values

string

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

FieldReference

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

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

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

Campos
name

string

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

sub_field

FieldReference

Subcampo anidado de forma recursiva, si es necesario

Campo de unión index_or_key.

index_or_key puede ser una de las siguientes opciones:

index

int32

Es el índice del campo si se repite.

key

string

Es clave si el campo es un mapa.

OutputConfig

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

Campos
data_format

DataFormat

Obligatorio. El formato de los datos de salida.

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

GcsDestination

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

RouteModifiers

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

Campos
avoid_tolls

bool

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

avoid_highways

bool

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

avoid_ferries

bool

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

avoid_indoor

bool

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

Envío

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

Campos
display_name

string

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

pickups[]

VisitRequest

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

deliveries[]

VisitRequest

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

load_demands

map<string, Load>

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

allowed_vehicle_indices[]

int32

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

costs_per_vehicle[]

double

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

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

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

costs_per_vehicle_indices[]

int32

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

pickup_to_delivery_absolute_detour_limit

Duration

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

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

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

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

pickup_to_delivery_time_limit

Duration

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

shipment_type

string

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

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

label

string

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

ignore

bool

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

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

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

penalty_cost

double

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

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

pickup_to_delivery_relative_detour_limit

double

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

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

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

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

Cargar

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

Campos
amount

int64

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

VisitRequest

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

Campos
arrival_location

LatLng

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

arrival_waypoint

Waypoint

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

departure_location

LatLng

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

departure_waypoint

Waypoint

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

tags[]

string

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

time_windows[]

TimeWindow

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

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

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

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

duration

Duration

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

cost

double

Es el costo de atender esta solicitud de visita en una ruta del vehículo. 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>

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

visit_types[]

string

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

Un tipo solo puede aparecer una vez.

label

string

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

avoid_u_turns

bool

Especifica si se deben evitar los giros en U en las rutas de conducción en esta ubicación. La evitación de giro en U es el mejor esfuerzo y no se garantiza que se evite por completo. Esta es una función experimental y el 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 información.

ShipmentModel

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

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

Shipment

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

vehicles[]

Vehicle

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

objectives[]

Objective

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 la solicitud no se resolverá en este caso. Consulta la documentación correspondiente.

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

global_start_time

Timestamp

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

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

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

global_end_time

Timestamp

Si no se establece, se usa de forma predeterminada la fecha 1 de enero de 1971 a las 00:00:00 UTC (es decir, segundos: 31536000, nanos: 0).

global_duration_cost_per_hour

double

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

duration_distance_matrices[]

DurationDistanceMatrix

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

Ejemplos de uso:

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

string

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

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

duration_distance_matrix_dst_tags[]

string

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

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

transition_attributes[]

TransitionAttributes

Atributos de transición agregados al modelo.

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

Conjuntos de shipment_types incompatibles (consulta ShipmentTypeIncompatibility).

shipment_type_requirements[]

ShipmentTypeRequirement

Conjuntos de requisitos de shipment_type (consulta ShipmentTypeRequirement).

precedence_rules[]

PrecedenceRule

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

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

max_active_vehicles

int32

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

DurationDistanceMatrix

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

Campos
rows[]

Row

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

vehicle_start_tag

string

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

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

Todas las matrices deben tener un vehicle_start_tag diferente.

Fila

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

Campos
durations[]

Duration

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

meters[]

double

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

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 serie 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 información.

Campos
type

Type

Es el tipo de objetivo.

weight

double

Indica cuánto debe contar este objetivo en relación con los demás. Puede ser cualquier número no negativo, y los pesos no tienen que sumar 1. El valor predeterminado de los pesos es 1.0.

Tipo

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

Enumeraciones
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 que especifique el usuario, si aún no está presente.
MIN_DISTANCE Objetivos "MIN". Minimiza la distancia total recorrida.
MIN_WORKING_TIME Minimiza el tiempo de trabajo total, sumado en todos los vehículos.
MIN_TRAVEL_TIME Igual que en el punto anterior, pero enfocándose solo en el tiempo de viaje.
MIN_NUM_VEHICLES Minimiza la cantidad de vehículos que se usan.

PrecedenceRule

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

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

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

Campos
first_is_delivery

bool

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

second_is_delivery

bool

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

offset_duration

Duration

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

first_index

int32

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

second_index

int32

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

ShipmentRoute

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

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

Ten en cuenta que hacemos una distinción entre los siguientes conceptos:

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

Invariables:

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

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

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

Por último, aquí se muestra cómo se pueden organizar TRAVEL, BREAKS, DELAY y WAIT durante una transición.

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

Un ejemplo (complejo):

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

int32

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

vehicle_label

string

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

vehicle_start_time

Timestamp

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

vehicle_end_time

Timestamp

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

visits[]

Visit

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

transitions[]

Transition

Es la lista ordenada de transiciones de la ruta.

has_traffic_infeasibilities

bool

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

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

Es probable que la llegada a next_visit se produzca más tarde que el período actual debido al aumento de la estimación del tiempo de viaje travel_duration(previous_visit, next_visit) debido al tráfico. Además, es posible que una pausa se superponga con una visita debido a un aumento en las estimaciones de tiempo de viaje y las restricciones de los períodos de visita o descanso.

route_polyline

EncodedPolyline

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

breaks[]

Break

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

metrics

AggregatedMetrics

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

vehicle_fullness

VehicleFullness

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

Experimental: Es posible que el comportamiento o la existencia de este campo cambien en el futuro.

route_costs

map<string, double>

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

route_total_cost

double

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

Receso

Datos que representan la ejecución de una pausa.

Campos
start_time

Timestamp

Hora de inicio de una pausa.

duration

Duration

Es la duración de una pausa.

EncodedPolyline

Es la representación codificada de una polilínea. Puedes 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 un start_location o un end_location, las métricas de viaje correspondientes son 0.

Campos
travel_duration

Duration

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

travel_distance_meters

double

Distancia recorrida durante la transición.

traffic_info_unavailable

bool

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

delay_duration

Duration

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

break_duration

Duration

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

wait_duration

Duration

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

total_duration

Duration

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

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

Timestamp

Es la hora de inicio de esta transición.

route_polyline

EncodedPolyline

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

route_token

string

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

vehicle_loads

map<string, VehicleLoad>

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

Las cargas durante la primera transición son las cargas iniciales de la ruta del vehículo. Luego, después de cada visita, se agregan o se restan los load_demands de la visita para obtener las cargas de la siguiente transición, según si la visita fue una recolección o una entrega.

VehicleLoad

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

Campos
amount

int64

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

Visitar

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

Campos
shipment_index

int32

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

is_pickup

bool

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

visit_request_index

int32

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

start_time

Timestamp

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

load_demands

map<string, Load>

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

detour

Duration

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

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

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

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

string

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

visit_label

string

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

injected_solution_location_token

int32

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

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

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

ShipmentTypeIncompatibility

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

Campos
types[]

string

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

incompatibility_mode

IncompatibilityMode

Es el modo que se aplica a la incompatibilidad.

IncompatibilityMode

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

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

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

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

ShipmentTypeRequirement

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

Campos
required_shipment_type_alternatives[]

string

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

dependent_shipment_types[]

string

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

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

requirement_mode

RequirementMode

Es el modo que se aplica al requisito.

RequirementMode

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

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

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

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

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

SkippedShipment

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

Campos
index

int32

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

label

string

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

reasons[]

Reason

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

penalty_cost

double

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

Experimental: Es posible que el comportamiento o la existencia de este campo cambien 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: Solo se completa cuando los motivos involucran un vehículo.

Experimental: Es posible que el comportamiento o la existencia de este campo cambien en el futuro.

Motivo

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

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

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

Campos
code

Code

Consulta los comentarios de Code.

example_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: Es posible que el comportamiento o la existencia de este campo cambien 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 superó.

example_vehicle_index

int32

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

Código

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

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

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

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

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT

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

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

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

El campo ignore del vehículo es verdadero.

Experimental: Es posible que el comportamiento o la existencia de este campo cambien en el futuro.

SHIPMENT_IGNORED

El campo ignore del envío es verdadero.

Experimental: Es posible que el comportamiento o la existencia de este campo cambien en el futuro.

SKIPPED_IN_INJECTED_SOLUTION_CONSTRAINT

Se omite el envío en injected_solution_constraint.

Experimental: Es posible que el comportamiento o la existencia de este campo cambien 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: Es posible que el comportamiento o la existencia de este campo cambien en el futuro.

ZERO_PENALTY_COST

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

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

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

Timestamp

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

end_time

Timestamp

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

soft_start_time

Timestamp

Es la hora de inicio flexible del período.

soft_end_time

Timestamp

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

cost_per_hour_before_soft_start_time

double

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

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

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

cost_per_hour_after_soft_end_time

double

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

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

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

TransitionAttributes

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

Campos
src_tag

string

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

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

excluded_src_tag

string

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

dst_tag

string

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

excluded_dst_tag

string

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

cost

double

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

cost_per_kilometer

double

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

distance_limit

DistanceLimit

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

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

delay

Duration

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

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

URI

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

Campos
uri

string

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

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

Vehículo

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

Campos
display_name

string

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

travel_mode

TravelMode

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

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

start_waypoint

Waypoint

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

end_location

LatLng

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

end_waypoint

Waypoint

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

start_tags[]

string

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

No se permiten cadenas vacías ni duplicadas.

end_tags[]

string

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

No se permiten cadenas vacías ni duplicadas.

start_time_windows[]

TimeWindow

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

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

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

end_time_windows[]

TimeWindow

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

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

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

unloading_policy

UnloadingPolicy

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

load_limits

map<string, LoadLimit>

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

cost_per_hour

double

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

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

cost_per_traveled_hour

double

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

cost_per_kilometer

double

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

fixed_cost

double

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

used_if_route_is_empty

bool

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

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

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

route_duration_limit

DurationLimit

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

travel_duration_limit

DurationLimit

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

route_distance_limit

DistanceLimit

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

extra_visit_duration_for_visit_type

map<string, Duration>

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

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

break_rule

BreakRule

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

label

string

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

ignore

bool

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

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

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

travel_duration_multiple

double

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

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

Consulta también extra_visit_duration_for_visit_type a continuación.

DurationLimit

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

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

Campos
max_duration

Duration

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

soft_max_duration

Duration

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

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

quadratic_soft_max_duration

Duration

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

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

max_duration - quadratic_soft_max_duration <= 86400 seconds

cost_per_hour_after_soft_max

double

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

  cost_per_hour_after_soft_max * (duration - soft_max_duration)

El costo no debe ser negativo.

cost_per_square_hour_after_quadratic_soft_max

double

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

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

  cost_per_square_hour_after_quadratic_soft_max *
  (duration - quadratic_soft_max_duration)^2

El costo no debe ser negativo.

LoadLimit

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

Campos
soft_max_load

int64

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

cost_per_unit_above_soft_max

double

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

start_load_interval

Interval

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

end_load_interval

Interval

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

max_load

int64

Es la cantidad máxima de carga aceptable.

cost_per_kilometer

LoadCost

Es el costo de mover una unidad de carga en 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 información.

cost_per_traveled_hour

LoadCost

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

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

Intervalo

Intervalo de cargas aceptables.

Campos
min

int64

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

max

int64

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

LoadCost

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

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

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

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

y su ruta es inicio,recogida,recogida,entrega,entrega,fin 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 120.0.

Sin embargo, si la ruta es inicio,partida,entrega,partida,entrega,fin con transiciones:

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

entonces, el costo incurrido por 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 a lo largo de la ruta es 40.0.

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

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

Campos
load_threshold

int64

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

cost_per_unit_below_threshold

double

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

cost_per_unit_above_threshold

double

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

TravelMode

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

Debe 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 tengan aceras o senderos peatonales claros. Debes mostrar esta advertencia al usuario para todas las rutas de caminata que muestres en tu app.

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

UnloadingPolicy

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

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

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

VehicleFullness

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

Campos
max_fullness

double

Es el 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 no se configurará.

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 no se configurará.

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 no se configurará.

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 establece ningún campo Vehicle.load_limits, este campo no se establecerá.

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).

Punto de referencia

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

Campos
side_of_road

bool

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

vehicle_stopover

bool

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

Experimental: Es posible que el comportamiento o la existencia de este campo cambien en el futuro.

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

Location

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

place_id

string

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

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