Method: projects.locations.optimizeTours

Envia um OptimizeToursRequest contendo um ShipmentModel e retorna um OptimizeToursResponse contendo ShipmentRoutes, que são um conjunto de trajetos a serem realizados por veículos que minimizam o custo total.

Um modelo ShipmentModel consiste principalmente em Shipments que precisam ser realizadas e Vehicles que podem ser usadas para transportar as Shipments. Os ShipmentRoutes atribuem Shipments a Vehicles. Mais especificamente, eles atribuem uma série de Visits a cada veículo, em que um Visit corresponde a um VisitRequest, que é uma retirada ou entrega de um Shipment.

O objetivo é fornecer uma atribuição de ShipmentRoutes a Vehicles que minimize o custo total quando o custo tiver muitos componentes definidos no ShipmentModel.

Solicitação HTTP

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

O URL usa a sintaxe de transcodificação gRPC.

Parâmetros de caminho

Parâmetros
parent

string

Obrigatório. Projeto ou local de destino para fazer uma chamada.

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

Se nenhum local for especificado, uma região será escolhida automaticamente.

Corpo da solicitação

O corpo da solicitação contém dados com a seguinte estrutura:

Representação 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)

Se esse tempo limite for definido, o servidor retornará uma resposta antes que o período de tempo limite tenha decorrido ou que o prazo do servidor para solicitações síncronas seja atingido, o que ocorrer primeiro.

Para solicitações assíncronas, o servidor gerará uma solução (se possível) antes que o tempo limite tenha decorrido.

Uma duração em segundos com até nove dígitos fracionários, terminando em "s". Exemplo: "3.5s".

model

object (ShipmentModel)

Modelo de envio a ser resolvido.

solvingMode

enum (SolvingMode)

Por padrão, o modo de solução é DEFAULT_SOLVE (0).

searchMode

enum (SearchMode)

Modo de pesquisa usado para resolver a solicitação.

injectedFirstSolutionRoutes[]

object (ShipmentRoute)

Orientar o algoritmo de otimização para encontrar uma primeira solução semelhante a uma solução anterior.

O modelo é restrito quando a primeira solução é criada. As remessas não realizadas em uma rota são implicitamente ignoradas na primeira solução, mas podem ser realizadas em soluções sucessivas.

A solução precisa atender a algumas suposições básicas de validade:

  • para todos os trajetos, vehicleIndex precisa estar dentro do alcance e não ser duplicado.
  • para todas as visitas, shipmentIndex e visitRequestIndex precisam estar dentro do intervalo.
  • uma remessa só pode ser referenciada em uma rota.
  • a retirada de uma remessa de retirada/entrega deve ser realizada antes da entrega.
  • não pode ser realizada mais do que uma alternativa de retirada ou de entrega de um frete.
  • para todos os trajetos, os horários aumentam (por exemplo, vehicleStartTime <= visits[0].start_time <= visits[1].start_time ... <= vehicleEndTime).
  • uma remessa só pode ser realizada em um veículo permitido. Um veículo será permitido se a Shipment.allowed_vehicle_indices estiver vazia ou se o vehicleIndex estiver incluído no Shipment.allowed_vehicle_indices.

Se a solução injetada não for viável, um erro de validação não será necessariamente retornado, e um erro indicando inviabilidade pode ser retornado.

injectedSolutionConstraint

object (InjectedSolutionConstraint)

Restrinja o algoritmo de otimização para encontrar uma solução final semelhante a uma solução anterior. Por exemplo, isso pode ser usado para congelar partes de trajetos que já foram concluídos ou que estão a serem concluídos, mas não podem ser modificados.

Se a solução injetada não for viável, um erro de validação não será necessariamente retornado, e um erro indicando inviabilidade pode ser retornado.

refreshDetailsRoutes[]

object (ShipmentRoute)

Se não estiver vazio, os trajetos indicados serão atualizados sem modificar a sequência de visitas ou os tempos de viagem. Apenas outros detalhes serão atualizados. Isso não resolve o modelo.

Desde 2020/11, esse campo só preenche as polilinhas de trajetos não vazios e exige que populatePolylines seja "true".

Os campos routePolyline das rotas transmitidas podem ser inconsistentes com o trajeto transitions.

Este campo não pode ser usado com injectedFirstSolutionRoutes ou injectedSolutionConstraint.

Shipment.ignore e Vehicle.ignore não afetam o comportamento. As polilinhas ainda são preenchidas entre todas as visitas em todos os trajetos não vazios, independentemente de as remessas ou veículos relacionados serem ignorados.

interpretInjectedSolutionsUsingLabels

boolean

Se verdadeiro:

Essa interpretação se aplica aos campos injectedFirstSolutionRoutes, injectedSolutionConstraint e refreshDetailsRoutes. Ele pode ser usado quando os índices de remessa ou de veículo na solicitação foram alterados desde que a solução foi criada, talvez porque remessas ou veículos foram removidos ou adicionados à solicitação.

Se verdadeiro, os marcadores nas seguintes categorias devem aparecer no máximo uma vez em sua categoria:

Se um vehicleLabel na solução injetada não corresponder a um veículo solicitado, o trajeto correspondente será removido da solução com as visitas dele. Se um shipmentLabel na solução injetada não corresponder a um envio de solicitação, a visita correspondente será removida da solução. Se um SkippedShipment.label na solução injetada não corresponder a um envio de solicitação, o SkippedShipment será removido da solução.

A remoção de visitas ou trajetos inteiros de uma solução injetada pode afetar as restrições implícitas, o que pode levar à mudança da solução, a erros de validação ou à inviabilidade.

OBSERVAÇÃO: o autor da chamada precisa garantir que cada Vehicle.label (resp. Shipment.label identifica exclusivamente uma entidade de veículo (envio de resposta) usada nas duas solicitações relevantes: a solicitação anterior que produziu o OptimizeToursResponse usado na solução injetada e a solicitação atual que inclui a solução injetada. As verificações de exclusividade descritas acima não são suficientes para garantir esse requisito.

considerRoadTraffic

boolean

Considere a estimativa de tráfego ao calcular os campos ShipmentRoute, Transition.travel_duration, Visit.start_time e vehicleEndTime, definir o campo ShipmentRoute.has_traffic_infeasibilities e calcular o campo OptimizeToursResponse.total_cost.

populatePolylines

boolean

Se verdadeiro, as polilinhas serão preenchidas em ShipmentRoutes de resposta.

populateTransitionPolylines

boolean

Se verdadeiro, as polilinhas serão preenchidas na resposta ShipmentRoute.transitions.

allowLargeDeadlineDespiteInterruptionRisk

boolean

Se isso for definido, a solicitação poderá ter um prazo de até 60 minutos (consulte https://grpc.io/blog/deadlines). Caso contrário, o prazo máximo será de apenas 30 minutos. As solicitações de longa duração têm um risco significativamente maior (mas ainda pequeno) de interrupção.

useGeodesicDistances

boolean

Se verdadeiro, as distâncias de deslocamento serão calculadas usando distâncias geodésicas em vez de distâncias do Google Maps, e os tempos de viagem serão calculados usando distâncias geodésicas com uma velocidade definida por geodesicMetersPerSecond.

label

string

Identificador que pode ser usado para identificar essa solicitação, informado no OptimizeToursResponse.request_label.

geodesicMetersPerSecond

number

Quando useGeodesicDistances é verdadeiro, este campo precisa ser definido e define a velocidade aplicada para calcular os tempos de viagem. O valor precisa ser de pelo menos 1 metro/segundo.

maxValidationErrors

integer

Trunca o número de erros de validação retornados. Esses erros geralmente são anexados a um payload de erro INVALID_ARGUMENT como um detalhe do erro BadRequest (https://cloud.google.com/apis/design/errors#error_details), a menos que solvingMode=VALIDATE_ONLY: consulte o campo OptimizeToursResponse.validation_errors. O padrão é 100 e tem um limite de 10.000.

Corpo da resposta

Se a solicitação for bem-sucedida, o corpo da resposta conterá uma instância de OptimizeToursResponse.

Escopos de autorização

Requer o seguinte escopo OAuth:

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