Method: projects.locations.optimizeTours

Envia uma OptimizeToursRequest que contém uma ShipmentModel e retorna uma OptimizeToursResponse que contém ShipmentRoutes, que são um conjunto de rotas a serem realizadas por veículos, minimizando o custo geral.

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

O objetivo é fornecer uma atribuição de ShipmentRoutes a Vehicles que minimize o custo total, em que o custo tem 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. Segmente o projeto ou local 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 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 vai gerar uma solução (se possível) antes do tempo limite expirar.

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 resoluçã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 é limitado quando a primeira solução é criada. Quaisquer remessas não realizadas em um trajeto são implicitamente puladas 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 todas as rotas, vehicleIndex precisa estar no intervalo e não ser duplicado.
  • para todas as visitas, shipmentIndex e visitRequestIndex precisam estar no intervalo.
  • Um envio só pode ser referenciado em um trajeto.
  • a retirada de um envio de retirada e entrega precisa ser feita antes da entrega.
  • Não é possível fazer mais de uma alternativa de retirada ou entrega de um envio.
  • em todos os trajetos, os tempos estão aumentando (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 é permitido se Shipment.allowed_vehicle_indices estiver vazio ou se o vehicleIndex estiver incluído em 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 poderá ser retornado.

injectedSolutionConstraint

object (InjectedSolutionConstraint)

Limitar o algoritmo de otimização para encontrar uma solução final semelhante a uma anterior. Por exemplo, isso pode ser usado para congelar partes de rotas que já foram concluídas ou que serão concluídas, mas não podem ser modificadas.

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

refreshDetailsRoutes[]

object (ShipmentRoute)

Se não estiver vazio, as rotas serão atualizadas sem modificar a sequência de visitas ou os tempos de viagem: apenas outros detalhes serão atualizados. Isso não resolve o modelo.

A partir de novembro de 2020, isso preenche apenas as polilinhas de rotas não vazias e exige que populatePolylines seja verdadeiro.

Os campos routePolyline das rotas transmitidas podem ser inconsistentes com a rota transitions.

Esse 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 os envios ou veículos relacionados serem ignorados.

interpretInjectedSolutionsUsingLabels

boolean

Se for verdadeiro:

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

Se verdadeiro, os rótulos nas categorias a seguir precisam aparecer no máximo uma vez na categoria:

Se um vehicleLabel na solução injetada não corresponder a um veículo de solicitação, 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.

Remover visitas ao trajeto ou trajetos inteiros de uma solução injetada pode afetar as restrições implícitas, o que pode levar a mudanças na solução, erros de validação ou inviabilidade.

OBSERVAÇÃO: o autor da chamada precisa garantir que cada Vehicle.label (resp. Shipment.label) identifica de forma exclusiva uma entidade de veículo (envio resp.) 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 no cálculo dos campos ShipmentRoute, Transition.travel_duration, Visit.start_time e vehicleEndTime. na definição do campo ShipmentRoute.has_traffic_infeasibilities e no cálculo do campo OptimizeToursResponse.total_cost.

populatePolylines

boolean

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

populateTransitionPolylines

boolean

Se verdadeiro, as polilinhas e os tokens de rota serão preenchidos na resposta ShipmentRoute.transitions.

allowLargeDeadlineDespiteInterruptionRisk

boolean

Se esse valor 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 é de apenas 30 minutos. As solicitações de longa duração têm um risco de interrupção significativamente maior (mas ainda pequeno).

useGeodesicDistances

boolean

Se verdadeiro, as distâncias de viagem 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

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

geodesicMetersPerSecond

number

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

maxValidationErrors

integer

Corta o número de erros de validação retornados. Esses erros normalmente são anexados a um payload de erro INVALID_MCC como um detalhe de 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 o limite máximo é 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

Permissões do IAM

Requer a seguinte permissão do IAM no recurso parent:

  • routeoptimization.locations.use

Para mais informações, consulte a documentação do IAM.