Method: projects.optimizeTours

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

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

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

Solicitud HTTP

POST https://routeoptimization.googleapis.com/v1/{parent=projects/*}:optimizeTours

La URL usa la sintaxis de la transcodificación gRPC.

Parámetros de ruta

Parámetros
parent

string

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

Formato:

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

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

Cuerpo de la solicitud

El cuerpo de la solicitud contiene datos con la siguiente estructura:

Representación JSON
{
  "timeout": string,
  "model": {
    object (ShipmentModel)
  },
  "solvingMode": enum (SolvingMode),
  "searchMode": enum (SearchMode),
  "injectedFirstSolutionRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "injectedSolutionConstraint": {
    object (InjectedSolutionConstraint)
  },
  "refreshDetailsRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "interpretInjectedSolutionsUsingLabels": boolean,
  "considerRoadTraffic": boolean,
  "populatePolylines": boolean,
  "populateTransitionPolylines": boolean,
  "allowLargeDeadlineDespiteInterruptionRisk": boolean,
  "useGeodesicDistances": boolean,
  "label": string,
  "geodesicMetersPerSecond": number,
  "maxValidationErrors": integer
}
Campos
timeout

string (Duration format)

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

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

model

object (ShipmentModel)

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

solvingMode

enum (SolvingMode)

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

searchMode

enum (SearchMode)

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

injectedFirstSolutionRoutes[]

object (ShipmentRoute)

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

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

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

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

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

injectedSolutionConstraint

object (InjectedSolutionConstraint)

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

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

refreshDetailsRoutes[]

object (ShipmentRoute)

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

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

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

Este campo no se debe usar junto con injectedFirstSolutionRoutes ni injectedSolutionConstraint.

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

interpretInjectedSolutionsUsingLabels

boolean

Si es verdadero:

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

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

Si un vehicleLabel en la solución insertada no corresponde a un vehículo de la solicitud, la ruta correspondiente se quita de la solución junto con sus visitas. Si un shipmentLabel 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 insertada no corresponde a un envío de la solicitud, se quita el SkippedShipment de la solución.

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

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

considerRoadTraffic

boolean

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

populatePolylines

boolean

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

populateTransitionPolylines

boolean

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

allowLargeDeadlineDespiteInterruptionRisk

boolean

Si se establece, la solicitud puede tener un plazo (consulta https://grpc.io/blog/deadlines) de hasta 60 minutos. De lo contrario, el plazo máximo es de solo 30 minutos. Ten en cuenta que las solicitudes de larga duración tienen un riesgo de interrupción significativamente mayor (pero aún pequeño).

useGeodesicDistances

boolean

Si es verdadero, las distancias de viaje se calcularán con distancias geodésicas en lugar de distancias de Google Maps, y la duración del viaje se calculará con distancias geodésicas con una velocidad definida por geodesicMetersPerSecond.

label

string

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

geodesicMetersPerSecond

number

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

maxValidationErrors

integer

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

Cuerpo de la respuesta

Si se ejecuta de forma correcta, el cuerpo de la respuesta contiene una instancia de OptimizeToursResponse.

Permisos de autorización

Requiere el siguiente permiso de OAuth:

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

Permisos de IAM

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

  • routeoptimization.locations.use

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