Method: projects.optimizeTours

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 se deben llevar a cabo 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, en el que un Visit corresponde a un VisitRequest, que es un retiro o entrega para un Shipment.

El objetivo es proporcionar una asignación de ShipmentRoute a Vehicle que minimice el costo total cuando este 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 de acceso

Parámetros
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á automáticamente una región.

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 muestra una respuesta antes de que finalice el tiempo de espera o se alcance el plazo del servidor para las solicitudes síncronas, lo que ocurra primero.

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

Una duración en segundos con hasta nueve dígitos decimales, que terminan en “s”. Ejemplo: "3.5s".

model

object (ShipmentModel)

Modelo de envío a 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 usa para resolver la solicitud.

injectedFirstSolutionRoutes[]

object (ShipmentRoute)

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

El modelo está limitado cuando se compila la primera solución. Cualquier envío que no se realice en una ruta se omite de forma implícita en la primera solución, pero se pueden realizar en soluciones sucesivas.

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

  • Para todas las rutas, vehicleIndex debe estar dentro del rango y no debe estar duplicado.
  • para todas las visitas, shipmentIndex y visitRequestIndex deben estar dentro del rango.
  • solo se puede hacer referencia a un envío en una ruta.
  • el retiro de un envío para retiro y entrega debe realizarse antes de la entrega.
  • no se puede realizar más de una alternativa de retiro o entrega de un mismo envío.
  • de todas las rutas, los horarios aumentan (es decir, vehicleStartTime <= visits[0].start_time <= visits[1].start_time ... <= vehicleEndTime).
  • solo se podrá realizar un envío en un vehículo que esté permitido. Se permite un vehículo si el campo Shipment.allowed_vehicle_indices está vacío o si su vehicleIndex está incluido en Shipment.allowed_vehicle_indices.
  • Si estableces avoidUTurns como verdadera, se debe establecer injectedSolutionLocationToken para las visitas relevantes

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

injectedSolutionConstraint

object (InjectedSolutionConstraint)

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

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

refreshDetailsRoutes[]

object (ShipmentRoute)

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

A partir de 2020/11, esto solo propaga las polilíneas de rutas no vacías y requiere que populatePolylines sea verdadero.

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

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

Shipment.ignore y Vehicle.ignore no tienen efecto en el comportamiento. Las polilíneas se siguen propagando entre todas las visitas de 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, quizás porque se quitaron envíos o vehículos de la solicitud o se agregaron a ella.

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

Si un vehicleLabel en la solución inyectada no corresponde a un vehículo solicitado, la ruta correspondiente se quita de la solución junto con sus visitas. Si una shipmentLabel en la solución inyectada no corresponde a un envío de solicitud, la visita correspondiente se quita de la solución. Si un SkippedShipment.label en la solución inyectada no corresponde a un envío de solicitud, se quita SkippedShipment de la solución.

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

considerRoadTraffic

boolean

Ten en cuenta la estimación del tráfico para calcular los campos Transition.travel_duration, Visit.start_time y vehicleEndTime de ShipmentRoute. para configurar el campo ShipmentRoute.has_traffic_infeasibilities y calcular el campo OptimizeToursResponse.total_cost.

populatePolylines

boolean

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

populateTransitionPolylines

boolean

Si es verdadero, las polilíneas 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 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 esta preferencia se establece como "true", 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 mediante distancias geodésicas con una velocidad definida por geodesicMetersPerSecond.

label

string

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

geodesicMetersPerSecond

number

Cuando useGeodesicDistances es verdadero, se debe establecer este campo y definir la velocidad aplicada para calcular los tiempos de viaje. Su valor debe ser de al menos 1.0 metros/segundo.

maxValidationErrors

integer

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 de 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 su límite es de 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 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.