Method: projects.optimizeToursLongRunning

Essa é uma variante do método projects.optimizeTours projetada para otimizações com valores de tempo limite grandes. Ele é preferível ao método projects.optimizeTours para otimizações que levam mais de alguns minutos.

A long-running operation (LRO) retornada terá um nome no formato <parent>/operations/<operation_id> e poderá ser usada para acompanhar o progresso do cálculo. O tipo de campo metadata é OptimizeToursLongRunningMetadata. O tipo de campo response será OptimizeToursResponse, se for bem-sucedido.

Solicitação HTTP

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

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/-

Os valores regionais de {location-id} não são compatíveis.

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 vai 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 vai gerar uma solução (se possível) antes que o tempo limite se esgote.

model

object (ShipmentModel)

Modelo de remessa 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)

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

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

A solução precisa atender a algumas premissas básicas de validade:

  • para todas as rotas, vehicleIndex precisa estar no intervalo e não pode ser duplicado.
  • Para todas as visitas, shipmentIndex e visitRequestIndex precisam estar no intervalo.
  • uma remessa só pode ser referenciada em uma rota.
  • a retirada de uma remessa de retirada e entrega precisa ser realizada antes da entrega.
  • não é possível realizar mais de uma alternativa de retirada ou de entrega de uma remessa.
  • para todas as rotas, os tempos estão aumentando (ou seja, 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 Shipment.allowed_vehicle_indices estiver vazio ou se o vehicleIndex dele 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)

Restringir 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 ainda 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 inviabilidade poderá ser retornado.

refreshDetailsRoutes[]

object (ShipmentRoute)

Se não estiverem vazias, as rotas fornecidas 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 só preenche as polilinhas de rotas não vazias e exige que populatePolylines seja verdadeiro.

Os campos routePolyline dos trajetos transmitidos 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 todas as rotas não vazias, independentemente de as remessas ou os 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 de remessa ou veículo na solicitação mudaram desde que a solução foi criada, talvez porque remessas ou veículos foram removidos ou adicionados à solicitação.

Se for 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 junto com as visitas. Se um shipmentLabel na solução injetada não corresponder a uma remessa de solicitação, a visita correspondente será removida da solução. Se um SkippedShipment.label na solução injetada não corresponder a uma remessa de solicitação, o SkippedShipment será removido da solução.

Remover visitas de rota ou rotas inteiras 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 exclusivamente uma entidade de veículo (ou envio) 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, ao definir o campo ShipmentRoute.has_traffic_infeasibilities e ao calcular o campo OptimizeToursResponse.total_cost.

populatePolylines

boolean

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

populateTransitionPolylines

boolean

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

allowLargeDeadlineDespiteInterruptionRisk

boolean

Se essa opção estiver definida, a solicitação poderá ter um prazo (consulte https://grpc.io/blog/deadlines) de até 60 minutos. Caso contrário, o prazo máximo é 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 for 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 definido e define a velocidade aplicada para calcular os tempos de viagem. O valor precisa ser de pelo menos 1,0 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 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 é 10.000.

Corpo da resposta

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

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.operations.create

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