Package google.maps.routeoptimization.v1

Índice

RouteOptimization

Um serviço para otimizar tours de veículos.

Validade de determinados tipos de campos:

  • google.protobuf.Timestamp
    • Os horários estão no horário Unix: segundos desde 1970-01-01T00:00:00+00:00.
    • Os segundos precisam estar em [0, 253402300799], ou seja, em [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • O valor de nanos precisa ser redefinido ou definido como 0.
  • google.protobuf.Duration
    • Os segundos precisam estar em [0, 253402300799], ou seja, em [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • O valor de nanos precisa ser redefinido ou definido como 0.
  • google.type.LatLng
    • A latitude precisa estar entre -90,0 e 90,0.
    • A longitude precisa estar entre -180,0 e 180,0.
    • pelo menos um dos valores de latitude e longitude precisa ser diferente de zero.
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

Otimiza os passeios de veículos para uma ou mais mensagens OptimizeToursRequest como um lote.

Esse método é uma operação de longa duração (LRO). As entradas para otimização (mensagens OptimizeToursRequest) e saídas (mensagens OptimizeToursResponse) são lidas e gravadas no Cloud Storage no formato especificado pelo usuário. Assim como o método OptimizeTours, cada OptimizeToursRequest contém um ShipmentModel e retorna um OptimizeToursResponse com campos ShipmentRoute, que são um conjunto de rotas a serem realizadas por veículos, minimizando o custo geral.

O usuário pode consultar operations.get para verificar o status da LRO:

Se o campo done do LRO for falso, pelo menos uma solicitação ainda estará sendo processada. Outras solicitações podem ter sido concluídas e os resultados estão disponíveis no Cloud Storage.

Se o campo done da LRO for verdadeiro, todas as solicitações foram processadas. Os resultados de todas as solicitações processadas com sucesso vão estar disponíveis no Cloud Storage. As solicitações que falharem não terão os resultados disponíveis no Cloud Storage. Se o campo error do LRO estiver definido, ele vai conter o erro de uma das solicitações com falha.

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.

OptimizeTours

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

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 ShipmentModel consiste principalmente de Shipments que precisam ser realizados e Vehicles que podem ser usados para transportar os Shipments. As 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 coleta ou entrega de um 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.

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.

AggregatedMetrics

Métricas agregadas para ShipmentRoute (ou OptimizeToursResponse em todos os elementos Transition e/ou Visit).ShipmentRoute

Campos
performed_shipment_count

int32

Número de envios realizados. Um par de retirada e entrega só é contabilizado uma vez.

travel_duration

Duration

Duração total da viagem de uma rota ou solução.

wait_duration

Duration

Duração total de espera para uma rota ou solução.

delay_duration

Duration

Duração total do atraso de uma rota ou solução.

break_duration

Duration

Duração total da pausa de uma rota ou solução.

visit_duration

Duration

Duração total da visita de uma rota ou solução.

total_duration

Duration

A duração total precisa ser igual à soma de todas as durações acima. Para rotas, também corresponde a:

[ShipmentRoute.vehicle_end_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_end_time] - [ShipmentRoute.vehicle_start_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_start_time]
travel_distance_meters

double

Distância total de uma rota ou solução.

max_loads

map<string, VehicleLoad>

Carga máxima alcançada em toda a rota (ou solução), para cada uma das quantidades nessa rota (ou solução), calculada como o máximo em todas as Transition.vehicle_loads (ou ShipmentRoute.metrics.max_loads.

BatchOptimizeToursMetadata

Esse tipo não tem campos.

Metadados da operação para chamadas BatchOptimizeToursRequest.

BatchOptimizeToursRequest

Solicite a otimização em lote de tours como uma operação assíncrona. Cada arquivo de entrada precisa ter um OptimizeToursRequest, e cada arquivo de saída precisa ter um OptimizeToursResponse. A solicitação contém informações para ler/gravar e analisar os arquivos. Todos os arquivos de entrada e saída precisam estar no mesmo projeto.

Campos
parent

string

Obrigatório. Segmente o projeto e o 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.

model_configs[]

AsyncModelConfig

Obrigatório. Informações de entrada/saída de cada modelo de compra, como caminhos de arquivo e formatos de dados.

AsyncModelConfig

Informações para resolver um modelo de otimização de forma assíncrona.

Campos
display_name

string

Opcional. O nome do modelo definido pelo usuário pode ser usado como alias pelos usuários para acompanhar os modelos.

input_config

InputConfig

Obrigatório. Informações sobre o modelo de entrada.

output_config

OutputConfig

Obrigatório. As informações do local de saída desejado.

BatchOptimizeToursResponse

Esse tipo não tem campos.

Resposta a um BatchOptimizeToursRequest. Isso é retornado na operação de longa duração após a conclusão dela.

BreakRule

Regras para gerar intervalos de tempo para um veículo (por exemplo, intervalos para almoço). Uma pausa é um período contíguo em que o veículo permanece ocioso na posição atual e não pode realizar nenhuma visita. Uma pausa pode ocorrer:

  • durante o deslocamento entre duas visitas (que inclui o tempo imediatamente antes ou depois de uma visita, mas não no meio dela). Nesse caso, o tempo de trânsito correspondente entre as visitas é estendido,
  • ou antes do início do veículo (o veículo não pode começar no meio de uma pausa). Nesse caso, o início do veículo não é afetado.
  • ou após o término do veículo (idem, com o horário de término do veículo).
Campos
break_requests[]

BreakRequest

Sequência de intervalos. Confira a mensagem BreakRequest.

frequency_constraints[]

FrequencyConstraint

Várias FrequencyConstraint podem ser aplicadas. Todos eles precisam ser atendidos pelos BreakRequests deste BreakRule. Consulte FrequencyConstraint.

BreakRequest

A sequência de intervalos (ou seja, o número e a ordem) que se aplicam a cada veículo precisa ser conhecida com antecedência. Os BreakRequests repetidos definem essa sequência, na ordem em que precisam ocorrer. Os intervalos de tempo (earliest_start_time / latest_start_time) podem se sobrepor, mas precisam ser compatíveis com o pedido (isso é verificado).

Campos
earliest_start_time

Timestamp

Obrigatório. Limite inferior (inclusive) no início da pausa.

latest_start_time

Timestamp

Obrigatório. Limite superior (inclusivo) no início da pausa.

min_duration

Duration

Obrigatório. Duração mínima do intervalo. Precisa ser positivo.

FrequencyConstraint

É possível restringir ainda mais a frequência e a duração dos intervalos especificados acima, impondo uma frequência mínima de intervalo, como "É preciso ter um intervalo de pelo menos 1 hora a cada 12 horas". Supondo que isso possa ser interpretado como "Em qualquer janela de tempo deslizante de 12 horas, deve haver pelo menos uma pausa de pelo menos uma hora", esse exemplo seria traduzido para o seguinte FrequencyConstraint:

{
   min_break_duration { seconds: 3600 }         # 1 hour.
   max_inter_break_duration { seconds: 39600 }  # 11 hours (12 - 1 = 11).
}

O tempo e a duração dos intervalos na solução vão respeitar todas essas restrições, além das janelas de tempo e durações mínimas já especificadas no BreakRequest.

Na prática, um FrequencyConstraint pode ser aplicado a intervalos não consecutivos. Por exemplo, a programação a seguir respeita o exemplo de "1h a cada 12h":

  04:00 vehicle start
   .. performing travel and visits ..
  09:00 1 hour break
  10:00 end of the break
   .. performing travel and visits ..
  12:00 20-min lunch break
  12:20 end of the break
   .. performing travel and visits ..
  21:00 1 hour break
  22:00 end of the break
   .. performing travel and visits ..
  23:59 vehicle end
Campos
min_break_duration

Duration

Obrigatório. Duração mínima do intervalo para essa restrição. Não negativo. Consulte a descrição de FrequencyConstraint.

max_inter_break_duration

Duration

Obrigatório. Intervalo máximo permitido de qualquer intervalo de tempo no trajeto que não inclua pelo menos parcialmente uma pausa de duration >= min_break_duration. Precisa ser positivo.

DataFormat

Formatos de dados para arquivos de entrada e saída.

Enums
DATA_FORMAT_UNSPECIFIED Valor inválido, o formato não pode ser UNSPECIFIED.
JSON Notation de objeto JavaScript.
PROTO_TEXT Formato de texto de Buffers de protocolo. Consulte https://protobuf.dev/reference/protobuf/textformat-spec/

DistanceLimit

Um limite que define a distância máxima que pode ser percorrida. Ele pode ser hardware ou software.

Se um limite flexível for definido, soft_max_meters e cost_per_kilometer_above_soft_max também precisarão ser definidos e não podem ser negativos.

Campos
max_meters

int64

Um limite rígido que restringe a distância a no máximo max_metros. O limite não pode ser negativo.

soft_max_meters

int64

Um limite flexível não aplica um limite máximo de distância, mas, quando violado, resulta em um custo que se soma a outros custos definidos no modelo, com a mesma unidade.

Se definido, soft_max_meters precisa ser menor que max_meters e não negativo.

cost_per_kilometer_below_soft_max

double

Custo por quilômetro incorrido, aumentando até soft_max_meters, com a fórmula:

  min(distance_meters, soft_max_meters) / 1000.0 *
  cost_per_kilometer_below_soft_max.

Esse custo não é aceito em route_distance_limit.

cost_per_kilometer_above_soft_max

double

Custo por quilômetro incorrido se a distância for superior ao limite de soft_max_meters. O custo adicional é 0 se a distância estiver abaixo do limite. Caso contrário, a fórmula usada para calcular o custo é a seguinte:

  (distance_meters - soft_max_meters) / 1000.0 *
  cost_per_kilometer_above_soft_max.

O custo não pode ser negativo.

GcsDestination

O local do Google Cloud Storage em que os arquivos de saída serão gravados.

Campos
uri

string

Obrigatório. URI do Google Cloud Storage.

GcsSource

O local do Google Cloud Storage em que o arquivo de entrada será lido.

Campos
uri

string

Obrigatório. URI de um objeto do Google Cloud Storage com o formato gs://bucket/path/to/object.

InjectedSolutionConstraint

Solução injetada na solicitação, incluindo informações sobre quais visitas precisam ser restringidas e como elas precisam ser restringidas.

Campos
routes[]

ShipmentRoute

Rotas da solução a ser injetada. Algumas rotas podem ser omitidas da solução original. As rotas e os envios pulados precisam atender às suposições de validade básicas listadas para injected_first_solution_routes.

skipped_shipments[]

SkippedShipment

Envios ignorados da solução a ser injetada. Alguns podem ser omitidos da solução original. Consulte o campo routes.

constraint_relaxations[]

ConstraintRelaxation

Para zero ou mais grupos de veículos, especifica quando e quanto relaxar as restrições. Se esse campo estiver vazio, todas as rotas de veículos não vazias serão totalmente restritas.

ConstraintRelaxation

Para um grupo de veículos, especifica em quais limites as restrições de visitas serão relaxadas e em qual nível. Os envios listados no campo skipped_shipment são restritos a serem pulados, ou seja, não podem ser realizados.

Campos
relaxations[]

Relaxation

Todas as flexibilizações de restrição de visitas que serão aplicadas a visitas em trajetos com veículos em vehicle_indices.

vehicle_indices[]

int32

Especifica os índices de veículos a que a restrição de visita relaxations se aplica. Se estiver vazio, será considerado o padrão, e o relaxations será aplicado a todos os veículos que não forem especificados em outro constraint_relaxations. Pode haver no máximo um padrão, ou seja, no máximo um campo de relaxamento de restrição pode ser vehicle_indices vazio. Um índice de veículo só pode ser listado uma vez, mesmo em vários constraint_relaxations.

Um índice de veículo é mapeado da mesma forma que ShipmentRoute.vehicle_index, se interpret_injected_solutions_using_labels for verdadeiro (consulte o comentário fields).

Relaxamento

Se relaxations estiver vazio, o horário de início e a sequência de todas as visitas em routes serão totalmente restritos, e nenhuma nova visita poderá ser inserida ou adicionada a esses trajetos. Além disso, o horário de início e término de um veículo em routes é totalmente restrito, a menos que o veículo esteja vazio (ou seja, não tenha visitas e tenha used_if_route_is_empty definido como falso no modelo).

relaxations(i).level especifica o nível de relaxamento de restrição aplicado a uma visita #j que atende a:

  • route.visits(j).start_time >= relaxations(i).threshold_time E
  • j + 1 >= relaxations(i).threshold_visit_count

Da mesma forma, a inicialização do veículo é relaxada para relaxations(i).level se ele atender aos seguintes requisitos:

  • vehicle_start_time >= relaxations(i).threshold_time E
  • relaxations(i).threshold_visit_count == 0 e a extremidade do veículo é relaxada para relaxations(i).level se ela atender aos seguintes requisitos:
  • vehicle_end_time >= relaxations(i).threshold_time E
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

Para aplicar um nível de relaxamento se uma visita atende aos requisitos de threshold_visit_count OU threshold_time, adicione duas relaxations com o mesmo level: uma com apenas threshold_visit_count definida e a outra com apenas threshold_time definida. Se uma visita atender às condições de vários relaxations, o nível mais flexível será aplicado. Como resultado, do início do veículo até as visitas de rota em ordem até o final do veículo, o nível de relaxamento se torna mais relaxado, ou seja, o nível de relaxamento não diminui à medida que a rota avança.

O tempo e a sequência de visitas de rota que não atendem às condições de limite de qualquer relaxations são totalmente restritos, e nenhuma visita pode ser inserida nessas sequências. Além disso, se o início ou o fim de um veículo não atender às condições de qualquer relaxamento, o tempo será fixo, a menos que o veículo esteja vazio.

Campos
level

Level

O nível de relaxamento de restrição que se aplica quando as condições em ou após threshold_time E pelo menos threshold_visit_count são atendidas.

threshold_time

Timestamp

O tempo em que ou após o qual a level de relaxamento pode ser aplicada.

threshold_visit_count

int32

O número de visitas a partir do qual a flexibilização level pode ser aplicada. Se threshold_visit_count for 0 (ou não for definido), o level poderá ser aplicado diretamente na inicialização do veículo.

Se for route.visits_size() + 1, o level só poderá ser aplicado ao veículo. Se for maior que route.visits_size() + 1, level não será aplicada a essa rota.

Nível

Expressa os diferentes níveis de relaxamento de restrição, que são aplicados a uma visita e às que seguem quando ela atende às condições de limite.

A enumeração abaixo está em ordem de relaxamento crescente.

Enums
LEVEL_UNSPECIFIED

Nível de relaxamento padrão implícito: nenhuma restrição é relaxada, ou seja, todas as visitas são totalmente restritas.

Esse valor não pode ser usado explicitamente em level.

RELAX_VISIT_TIMES_AFTER_THRESHOLD Os horários de início e término da visita e do veículo serão relaxados, mas cada visita continua vinculada ao mesmo veículo, e a sequência de visitas precisa ser observada: nenhuma visita pode ser inserida entre elas ou antes delas.
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD Igual a RELAX_VISIT_TIMES_AFTER_THRESHOLD, mas a sequência de visitas também é relaxada: as visitas só podem ser realizadas por esse veículo, mas podem não ser realizadas.
RELAX_ALL_AFTER_THRESHOLD Igual a RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD, mas o veículo também é relaxado: as visitas são totalmente sem custo financeiro no horário limite ou depois dele e podem não ser realizadas.

InputConfig

Especifique uma entrada para [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours].

Campos
data_format

DataFormat

Obrigatório. O formato dos dados de entrada.

Campo de união source. Obrigatório. source pode ser apenas de um dos tipos a seguir:
gcs_source

GcsSource

Um local do Google Cloud Storage. Ele precisa ser um único objeto (arquivo).

Local

Encapsula um local (um ponto geográfico e um título opcional).

Campos
lat_lng

LatLng

As coordenadas geográficas do ponto de passagem.

heading

int32

A direção da bússola associada à direção do fluxo de tráfego. Esse valor é usado para especificar o lado da estrada a ser usado para retirada e entrega. Os valores de direção podem variar de 0 a 360, em que 0 especifica uma direção de norte, 90 especifica uma direção de leste etc.

OptimizeToursRequest

Solicitação para ser enviada a um solucionador de otimização de tour, que define o modelo de envio a ser resolvido, bem como os parâmetros de otimização.

Campos
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.

timeout

Duration

Se esse tempo limite for definido, o servidor vai retornar uma resposta antes que o período de tempo limite expire ou 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.

model

ShipmentModel

Modelo de envio a ser resolvido.

solving_mode

SolvingMode

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

search_mode

SearchMode

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

injected_first_solution_routes[]

ShipmentRoute

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

O modelo é limitado quando a primeira solução é criada. Todos os envios não realizados em uma rota são omitidos implicitamente na primeira solução, mas podem ser realizados em soluções sucessivas.

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

  • para todas as rotas, vehicle_index precisa estar no intervalo e não ser duplicado.
  • para todas as visitas, shipment_index e visit_request_index 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.
  • para todas as rotas, os tempos estão aumentando (ou seja, vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time).
  • 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 vehicle_index 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 a inviabilidade poderá ser retornado.

injected_solution_constraint

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.

refresh_details_routes[]

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.

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

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

Esse campo não pode ser usado com injected_first_solution_routes ou injected_solution_constraint.

Shipment.ignore e Vehicle.ignore não têm efeito no 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.

interpret_injected_solutions_using_labels

bool

Se verdadeiro:

Essa interpretação se aplica aos campos injected_first_solution_routes, injected_solution_constraint e refresh_details_routes. Ele pode ser usado quando os índices de envio ou veículo na solicitação mudaram desde a criação da solução, talvez porque os envios ou veículos foram removidos ou adicionados à solicitação.

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

Se um vehicle_label na solução injetada não corresponder a um veículo de solicitação, a rota correspondente será removida da solução junto com as visitas. Se um shipment_label 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 a rotas 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 de forma exclusiva uma entidade de veículo (ou remessa) usada nas duas solicitações relevantes: a anterior, que produziu o OptimizeToursResponse usado na solução injetada, e a atual, que inclui a solução injetada. As verificações de exclusividade descritas acima não são suficientes para garantir esse requisito.

consider_road_traffic

bool

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

populate_polylines

bool

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

populate_transition_polylines

bool

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

allow_large_deadline_despite_interruption_risk

bool

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).

use_geodesic_distances

bool

Se definido como "true", as distâncias de viagem serão calculadas usando distâncias geodésicas em vez das distâncias do Google Maps, e os tempos de viagem serão calculados usando distâncias geodésicas com uma velocidade definida por geodesic_meters_per_second.

label

string

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

geodesic_meters_per_second

double

Quando use_geodesic_distances for 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.

max_validation_errors

int32

Corta 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 o campo OptimizeToursResponse.validation_errors seja igual a solving_mode=VALIDATE_ONLY. O padrão é 100,e o limite é 10.000.

SearchMode

Modo que define o comportamento da pesquisa, trocando a latência pela qualidade da solução. Em todos os modos, o prazo de solicitação global é aplicado.

Enums
SEARCH_MODE_UNSPECIFIED Modo de pesquisa não especificado, equivalente a RETURN_FAST.
RETURN_FAST Pare a pesquisa depois de encontrar a primeira solução válida.
CONSUME_ALL_AVAILABLE_TIME Use todo o tempo disponível para buscar soluções melhores.

SolvingMode

Define como o solucionador precisa processar a solicitação. Em todos os modos, exceto VALIDATE_ONLY, se a solicitação for inválida, você receberá um erro INVALID_REQUEST. Consulte max_validation_errors para limitar o número de erros retornados.

Enums
DEFAULT_SOLVE Resolva o modelo. Os avisos podem ser emitidos em [OptimizeToursResponse.validation_errors][google.cloud.optimization.v1.OptimizeToursResponse.validation_errors].
VALIDATE_ONLY Valida o modelo sem resolvê-lo: preenche o maior número possível de OptimizeToursResponse.validation_errors.
DETECT_SOME_INFEASIBLE_SHIPMENTS

Só preenche OptimizeToursResponse.validation_errors ou OptimizeToursResponse.skipped_shipments e não resolve o restante da solicitação (status e routes não são definidos na resposta). Se forem detectadas inviabilidades nas rotas injected_solution_constraint, elas serão preenchidas no campo OptimizeToursResponse.validation_errors e OptimizeToursResponse.skipped_shipments será deixado em branco.

IMPORTANTE: nem todos os envios inviáveis são retornados aqui, apenas aqueles que são detectados como inviáveis durante o pré-processamento.

OptimizeToursResponse

Resposta após a solução de um problema de otimização de percursos, contendo as rotas seguidas por cada veículo, as remessas que foram puladas e o custo geral da solução.

Campos
routes[]

ShipmentRoute

Rotas calculadas para cada veículo. A rota i corresponde ao veículo i no modelo.

request_label

string

Cópia do OptimizeToursRequest.label, se um rótulo tiver sido especificado na solicitação.

skipped_shipments[]

SkippedShipment

A lista de todos os envios pulados.

validation_errors[]

OptimizeToursValidationError

Lista de todos os erros de validação que conseguimos detectar de forma independente. Consulte a explicação "VÁRIOS ERROS" para a mensagem OptimizeToursValidationError. Em vez de erros, isso vai incluir avisos no caso de solving_mode ser DEFAULT_SOLVE.

metrics

Metrics

Métricas de duração, distância e uso para esta solução.

Métricas

Métricas gerais, agregadas em todas as rotas.

Campos
aggregated_route_metrics

AggregatedMetrics

Agregada nas rotas. Cada métrica é a soma (ou o valor máximo, para cargas) de todos os campos ShipmentRoute.metrics com o mesmo nome.

skipped_mandatory_shipment_count

int32

Número de envios obrigatórios pulados.

used_vehicle_count

int32

Número de veículos usados. Observação: se uma rota de veículo estiver vazia e Vehicle.used_if_route_is_empty for verdadeiro, o veículo será considerado usado.

earliest_vehicle_start_time

Timestamp

O horário de início mais cedo de um veículo usado, calculado como o mínimo de todos os veículos usados de ShipmentRoute.vehicle_start_time.

latest_vehicle_end_time

Timestamp

A hora de término mais recente de um veículo usado, calculada como o máximo de todos os veículos usados de ShipmentRoute.vehicle_end_time.

costs

map<string, double>

Custo da solução, detalhado por campos de solicitação relacionados a custos. As chaves são caminhos proto, relativos à entrada OptimizeToursRequest, por exemplo, "model.shipments.pickups.cost", e os valores são o custo total gerado pelo campo de custo correspondente, agregado em toda a solução. Em outras palavras, costs["model.shipments.pickups.cost"] é a soma de todos os custos de retirada da solução. Todos os custos definidos no modelo são informados em detalhes aqui, exceto os custos relacionados a TransitionAttributes, que são informados de forma agregada a partir de 01/2022.

total_cost

double

Custo total da solução. A soma de todos os valores no mapa de custos.

OptimizeToursValidationError

Descreve um erro ou aviso encontrado ao validar um OptimizeToursRequest.

Campos
code

int32

Um erro de validação é definido pelo par (code, display_name), que está sempre presente.

Os campos a seguir fornecem mais contexto sobre o erro.

VÁRIOS ERROS: quando há vários erros, o processo de validação tenta gerar vários deles. Assim como um compilador, esse é um processo imperfeito. Alguns erros de validação são "fatais", ou seja, eles interrompem todo o processo de validação. Esse é o caso de erros display_name="UNSPECIFIED", entre outros. Alguns erros podem fazer com que o processo de validação ignore outros erros.

ESTABILIDADE: code e display_name precisam ser muito estáveis. No entanto, novos códigos e nomes de exibição podem aparecer ao longo do tempo, o que pode fazer com que uma solicitação (inválida) gere um par diferente (code, display_name) porque o novo erro ocultou o antigo. Por exemplo, consulte "VÁRIOS ERROS".

display_name

string

O nome de exibição do erro.

fields[]

FieldReference

Um contexto de erro pode envolver 0, 1 (na maioria das vezes) ou mais campos. Por exemplo, a primeira coleta do veículo 4 e da remessa 2 pode ser feita da seguinte maneira:

fields { name: "vehicles" index: 4}
fields { name: "shipments" index: 2 sub_field {name: "pickups" index: 0} }

No entanto, a cardinalidade de fields não deve mudar para um determinado código de erro.

error_message

string

String legível que descreve o erro. Há um mapeamento de um para um entre code e error_message (quando o código não é "UNSPECIFIED").

ESTABILIDADE: não é estável: a mensagem de erro associada a um determinado code pode mudar (e esperamos que seja para esclarecer) com o tempo. Use display_name e code.

offending_values

string

Pode conter os valores dos campos. Essa opção nem sempre está disponível. Não confie nele e use apenas para depuração manual de modelos.

FieldReference

Especifica um contexto para o erro de validação. Um FieldReference sempre se refere a um determinado campo neste arquivo e segue a mesma estrutura hierárquica. Por exemplo, podemos especificar o elemento 2 de start_time_windows do veículo 5 usando:

name: "vehicles" index: 5 sub_field { name: "end_time_windows" index: 2 }

No entanto, omitimos entidades de nível superior, como OptimizeToursRequest ou ShipmentModel, para não lotar a mensagem.

Campos
name

string

Nome do campo, por exemplo, "veículos".

sub_field

FieldReference

Subcampo anidado recursivamente, se necessário.

Campo de união index_or_key.

index_or_key pode ser apenas de um dos tipos a seguir:

index

int32

Índice do campo se ele for repetido.

key

string

Chave se o campo for um mapa.

OutputConfig

Especifique um destino para os resultados de [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours].

Campos
data_format

DataFormat

Obrigatório. O formato dos dados de saída.

Campo de união destination. Obrigatório. destination pode ser apenas de um dos tipos a seguir:
gcs_destination

GcsDestination

O local do Google Cloud Storage em que a saída será gravada.

RouteModifiers

Encapsula um conjunto de condições opcionais a serem atendidas ao calcular rotas de veículos. Isso é semelhante a RouteModifiers na API Preferred Routes da Plataforma Google Maps. Consulte: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.

Campos
avoid_tolls

bool

Especifica se é necessário evitar vias com pedágio sempre que possível. A preferência será dada às rotas que não contêm vias com pedágio. Aplica-se apenas a modos de transporte motorizados.

avoid_highways

bool

Especifica se é necessário evitar rodovias, quando for razoável. A preferência será dada a rotas que não contêm rodovias. Aplica-se apenas a meios de transporte motorizados.

avoid_ferries

bool

Especifica se é necessário evitar balsas. A preferência será dada às rotas que não incluem viagens de balsa. Aplica-se apenas a modos de transporte motorizados.

avoid_indoor

bool

Opcional. Especifica se é necessário evitar a navegação em ambientes internos quando for razoável. A preferência será dada às rotas que não contêm navegação interna. Aplica-se apenas ao modo de viagem WALKING.

Envio

O envio de um único item, de uma das coletas para uma das entregas. Para que a remessa seja considerada concluída, um veículo único precisa visitar um dos locais de retirada (e diminuir a capacidade de reserva), depois visitar um dos locais de entrega mais tarde (e, portanto, aumentar novamente a capacidade de reserva).

Campos
display_name

string

O nome de exibição do envio definido pelo usuário. Ele pode ter até 63 caracteres e pode usar caracteres UTF-8.

pickups[]

VisitRequest

Conjunto de alternativas de retirada associadas ao envio. Se não for especificado, o veículo só precisa visitar um local correspondente às entregas.

deliveries[]

VisitRequest

Conjunto de alternativas de entrega associadas ao envio. Se não for especificado, o veículo só precisa visitar um local correspondente às coletas.

load_demands

map<string, Load>

Carregar as demandas do envio (por exemplo, peso, volume, número de paletes etc.). As chaves no mapa precisam ser identificadores que descrevem o tipo da carga correspondente, de preferência incluindo também as unidades. Por exemplo: "weight_kg", "volume_gallons", "pallet_count" etc. Se uma determinada chave não aparecer no mapa, a carga correspondente será considerada nula.

allowed_vehicle_indices[]

int32

Conjunto de veículos que podem realizar o envio. Se estiver vazio, todos os veículos poderão realizar a ação. Os veículos são informados pelo índice na lista vehicles do ShipmentModel.

costs_per_vehicle[]

double

Especifica o custo incorrido quando o envio é entregue por cada veículo. Se especificado, ele precisa ter:

  • o mesmo número de elementos que costs_per_vehicle_indices. costs_per_vehicle[i] corresponde ao veículo costs_per_vehicle_indices[i] do modelo.
  • o mesmo número de elementos que há veículos no modelo. O elemento i corresponde ao veículo #i do modelo.

Esses custos precisam estar na mesma unidade que penalty_cost e não podem ser negativos. Deixe esse campo em branco se não houver custos.

costs_per_vehicle_indices[]

int32

Índices dos veículos a que costs_per_vehicle se aplica. Se não estiver vazio, precisará ter o mesmo número de elementos que costs_per_vehicle. Um índice de veículo não pode ser especificado mais de uma vez. Se um veículo for excluído de costs_per_vehicle_indices, o custo dele será zero.

pickup_to_delivery_absolute_detour_limit

Duration

Especifica o tempo de desvio absoluto máximo em comparação com o caminho mais curto da coleta até a entrega. Se especificado, precisa ser não negativo, e o envio precisa conter pelo menos uma coleta e uma entrega.

Por exemplo, vamos supor que t seja o tempo mais curto para ir da alternativa de retirada selecionada diretamente para a alternativa de entrega selecionada. Em seguida, a configuração pickup_to_delivery_absolute_detour_limit impõe:

start_time(delivery) - start_time(pickup) <=
t + pickup_to_delivery_absolute_detour_limit

Se os limites relativos e absolutos forem especificados no mesmo envio, o mais restritivo será usado para cada par de retirada/entrega possível. Desde outubro de 2017, os desvios são aceitos apenas quando a duração da viagem não depende de veículos.

pickup_to_delivery_time_limit

Duration

Especifica a duração máxima do início da coleta até o início da entrega de um envio. Se especificado, precisa ser não negativo, e o envio precisa conter pelo menos uma coleta e uma entrega. Isso não depende das alternativas selecionadas para retirada e entrega nem da velocidade do veículo. Isso pode ser especificado junto com as restrições de desvio máximo: a solução vai respeitar as duas especificações.

shipment_type

string

String não vazia que especifica um "type" para essa remessa. Esse recurso pode ser usado para definir incompatibilidades ou requisitos entre shipment_types (consulte shipment_type_incompatibilities e shipment_type_requirements em ShipmentModel).

Difere de visit_types, que é especificado para uma única visita: todas as retiradas/entregas pertencentes ao mesmo envio compartilham o mesmo shipment_type.

label

string

Especifica um rótulo para essa remessa. Esse rótulo é informado na resposta no shipment_label do ShipmentRoute.Visit correspondente.

ignore

bool

Se verdadeiro, pule essa remessa, mas não aplique uma penalty_cost.

Ignorar um envio resulta em um erro de validação quando há shipment_type_requirements no modelo.

É permitido ignorar um envio realizado em injected_first_solution_routes ou injected_solution_constraint. O solucionador remove as visitas de retirada/entrega relacionadas da rota em execução. precedence_rules que fazem referência a remessas ignoradas também serão ignoradas.

penalty_cost

double

Se o envio não for concluído, essa penalidade será adicionada ao custo geral das rotas. Um envio é considerado concluído se uma das alternativas de retirada e entrega for visitada. O custo pode ser expresso na mesma unidade usada para todos os outros campos relacionados a custos no modelo e precisa ser positivo.

IMPORTANTE: se essa penalidade não for especificada, ela será considerada infinita, ou seja, o envio precisa ser concluído.

pickup_to_delivery_relative_detour_limit

double

Especifica o tempo de desvio relativo máximo em comparação com o caminho mais curto da coleta à entrega. Se especificado, precisa ser não negativo, e o envio precisa conter pelo menos uma coleta e uma entrega.

Por exemplo, vamos supor que t seja o tempo mais curto para ir da alternativa de retirada selecionada diretamente para a alternativa de entrega selecionada. Em seguida, a configuração pickup_to_delivery_relative_detour_limit impõe:

start_time(delivery) - start_time(pickup) <=
std::ceil(t * (1.0 + pickup_to_delivery_relative_detour_limit))

Se os limites relativos e absolutos forem especificados no mesmo envio, o mais restritivo será usado para cada par de retirada/entrega possível. Desde outubro de 2017, os desvios são aceitos apenas quando a duração da viagem não depende de veículos.

Carregar

Ao realizar uma visita, um valor predefinido pode ser adicionado à carga do veículo se for uma coleta ou subtraído se for uma entrega. Essa mensagem define esse valor. Consulte load_demands.

Campos
amount

int64

A quantidade de carga do veículo que realiza a visita correspondente vai variar. Como é um número inteiro, os usuários devem escolher uma unidade adequada para evitar a perda de precisão. Precisa ser ≥ 0.

VisitRequest

Solicitação de uma visita que pode ser feita por um veículo: ele tem uma geolocalização (ou duas, consulte abaixo), horários de abertura e fechamento representados por janelas de tempo e um tempo de duração do serviço (tempo gasto pelo veículo depois que ele chega para retirar ou entregar mercadorias).

Campos
arrival_location

LatLng

A geolocalização em que o veículo chega ao realizar essa VisitRequest. Se o modelo de envio tiver matrizes de duração e distância, arrival_location não poderá ser especificado.

arrival_waypoint

Waypoint

O ponto de passagem em que o veículo chega ao realizar essa VisitRequest. Se o modelo de envio tiver matrizes de duração e distância, arrival_waypoint não poderá ser especificado.

departure_location

LatLng

O geolocalização de onde o veículo sai após concluir essa VisitRequest. Pode ser omitido se for igual a arrival_location. Se o modelo de envio tiver matrizes de duração e distância, departure_location não poderá ser especificado.

departure_waypoint

Waypoint

O ponto de passagem em que o veículo sai depois de concluir essa VisitRequest. Pode ser omitido se for igual a arrival_waypoint. Se o modelo de envio tiver matrizes de duração e distância, departure_waypoint não poderá ser especificado.

tags[]

string

Especifica as tags anexadas à solicitação de visita. Strings vazias ou duplicadas não são permitidas.

time_windows[]

TimeWindow

Janelas de tempo que restringem o horário de chegada em uma visita. Um veículo pode partir fora da janela de horário de chegada, ou seja, o horário de chegada + a duração não precisam estar dentro de uma janela de tempo. Isso pode resultar em tempo de espera se o veículo chegar antes de TimeWindow.start_time.

A ausência de TimeWindow significa que o veículo pode realizar essa visita a qualquer momento.

As janelas de tempo precisam ser distintas, ou seja, nenhuma janela de tempo pode se sobrepor ou ser adjacente a outra, e elas precisam estar em ordem crescente.

cost_per_hour_after_soft_end_time e soft_end_time só podem ser definidos se houver uma única janela de tempo.

duration

Duration

Duração da visita, ou seja, o tempo gasto pelo veículo entre a chegada e a partida (para ser adicionado ao tempo de espera possível. Consulte time_windows).

cost

double

Custo para atender a solicitação de visita em uma rota de veículo. Isso pode ser usado para pagar custos diferentes para cada retirada ou entrega alternativa de um envio. Esse custo precisa estar na mesma unidade que Shipment.penalty_cost e não pode ser negativo.

load_demands

map<string, Load>

Carregar as demandas dessa solicitação de visita. É igual ao campo Shipment.load_demands, mas se aplica apenas a esse VisitRequest em vez de todo o Shipment. As demandas listadas aqui são adicionadas às demandas listadas em Shipment.load_demands.

visit_types[]

string

Especifica os tipos de visita. Isso pode ser usado para alocar mais tempo necessário para que um veículo conclua essa visita (consulte Vehicle.extra_visit_duration_for_visit_type).

Um tipo só pode aparecer uma vez.

label

string

Especifica um rótulo para este VisitRequest. Esse rótulo é informado na resposta como visit_label no ShipmentRoute.Visit correspondente.

ShipmentModel

Um modelo de envio contém um conjunto de envios que precisam ser realizados por um conjunto de veículos, minimizando o custo geral, que é a soma de:

  • o custo do roteamento dos veículos (soma do custo por tempo total, custo por tempo de viagem e custo fixo em todos os veículos).
  • as penalidades por não entrega.
  • o custo da duração global dos envios
Campos
shipments[]

Shipment

Conjunto de remessas que precisam ser realizadas no modelo.

vehicles[]

Vehicle

Conjunto de veículos que podem ser usados para realizar visitas.

global_start_time

Timestamp

Horário de início e término global do modelo: nenhum horário fora desse intervalo pode ser considerado válido.

O período do modelo precisa ser inferior a um ano, ou seja, o global_end_time e o global_start_time precisam estar a 31536000 segundos um do outro.

Ao usar campos cost_per_*hour, defina essa janela como um intervalo menor para aumentar a performance. Por exemplo, se você modelar um único dia, defina os limites de tempo globais para esse dia. Se não for definido, o valor padrão será 00:00:00 UTC, 1º de janeiro de 1970 (ou seja, segundos: 0, nanos: 0).

global_end_time

Timestamp

Se não for definido, o padrão será 00:00:00 UTC, 1o de janeiro de 1971 (ou seja, segundos: 31536000, nanos: 0).

global_duration_cost_per_hour

double

A "duração global" do plano geral é a diferença entre o horário de início e o horário de término de todos os veículos. Os usuários podem atribuir um custo por hora a essa quantidade para tentar otimizar a conclusão mais rápida do trabalho, por exemplo. Esse custo precisa estar na mesma unidade que Shipment.penalty_cost.

duration_distance_matrices[]

DurationDistanceMatrix

Especifica as matrizes de duração e distância usadas no modelo. Se esse campo estiver vazio, o Google Maps ou as distâncias geodésicas serão usados, dependendo do valor do campo use_geodesic_distances. Se não estiver vazio, use_geodesic_distances não poderá ser verdadeiro, e nem duration_distance_matrix_src_tags nem duration_distance_matrix_dst_tags poderão estar vazios.

Exemplos de uso:

  • Há dois locais: locA e locB.
  • Um veículo que começa o trajeto em locA e termina em locA.
  • 1 solicitação de retirada em locB.
model {
  vehicles { start_tags: "locA"  end_tags: "locA" }
  shipments { pickups { tags: "locB" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_dst_tags: "locA"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • Há três locais: locA, locB e locC.
  • Um veículo que inicia a rota em locA e termina em locB, usando a matriz "rápida".
  • Um veículo que começa a rota em locB e termina em locB, usando a matriz "lento".
  • 1 veículo que começa a rota em locB e termina em locB, usando a matriz "rápido".
  • 1 solicitação de visita de retirada em locC.
model {
  vehicles { start_tags: "locA" end_tags: "locB" start_tags: "fast" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "slow" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "fast" }
  shipments { pickups { tags: "locC" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_src_tags: "locC"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrix_dst_tags: "locC"
  duration_distance_matrices {
    vehicle_start_tag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  duration_distance_matrices {
    vehicle_start_tag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
duration_distance_matrix_src_tags[]

string

Tags que definem as origens das matrizes de duração e distância. duration_distance_matrices(i).rows(j) define durações e distâncias de visitas com a tag duration_distance_matrix_src_tags(j) para outras visitas na matriz i.

As tags correspondem a VisitRequest.tags ou Vehicle.start_tags. Um VisitRequest ou Vehicle precisa corresponder exatamente a uma tag neste campo. As tags de origem, destino e matriz de um Vehicle podem ser as mesmas. Da mesma forma, as tags de origem e destino de um VisitRequest podem ser iguais. Todas as tags precisam ser diferentes e não podem ser strings vazias. Se esse campo não estiver vazio, duration_distance_matrices também não poderá estar.

duration_distance_matrix_dst_tags[]

string

Tags que definem os destinos das matrizes de duração e distância; duration_distance_matrices(i).rows(j).durations(k) (resp. duration_distance_matrices(i).rows(j).meters(k)) define a duração (ou a distância) da viagem de visitas com a tag duration_distance_matrix_src_tags(j) para visitas com a tag duration_distance_matrix_dst_tags(k) na matriz i.

As tags correspondem a VisitRequest.tags ou Vehicle.start_tags. Um VisitRequest ou Vehicle precisa corresponder exatamente a uma tag neste campo. As tags de origem, destino e matriz de um Vehicle podem ser as mesmas. Da mesma forma, as tags de origem e destino de um VisitRequest podem ser iguais. Todas as tags precisam ser diferentes e não podem ser strings vazias. Se esse campo não estiver vazio, duration_distance_matrices também não poderá estar.

transition_attributes[]

TransitionAttributes

Atributos de transição adicionados ao modelo.

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

Conjuntos de shipment_types incompatíveis (consulte ShipmentTypeIncompatibility).

shipment_type_requirements[]

ShipmentTypeRequirement

Conjuntos de requisitos de shipment_type (consulte ShipmentTypeRequirement).

precedence_rules[]

PrecedenceRule

Conjunto de regras de precedência que precisam ser aplicadas no modelo.

max_active_vehicles

int32

Limita o número máximo de veículos ativos. Um veículo está ativo se a rota dele realiza pelo menos um envio. Isso pode ser usado para limitar o número de rotas no caso de haver menos motoristas do que veículos e a frota de veículos ser heterogênea. A otimização vai selecionar o melhor subconjunto de veículos a ser usado. Precisa ser estritamente positivo.

DurationDistanceMatrix

Especifica uma matriz de duração e distância dos locais de início e término da visita e do veículo.

Campos
rows[]

Row

Especifica as linhas da matriz de duração e distância. Ele precisa ter tantos elementos quanto ShipmentModel.duration_distance_matrix_src_tags.

vehicle_start_tag

string

Tag que define a quais veículos essa matriz de duração e distância se aplica. Se estiver vazio, isso se aplica a todos os veículos, e só pode haver uma matriz.

Cada início de veículo precisa corresponder a exatamente uma matriz, ou seja, exatamente um dos campos start_tags precisa corresponder ao vehicle_start_tag de uma matriz (e apenas dessa matriz).

Todas as matrizes precisam ter um vehicle_start_tag diferente.

Linha

Especifica uma linha da matriz de duração e distância.

Campos
durations[]

Duration

Valores de duração para uma linha específica. Ele precisa ter tantos elementos quanto ShipmentModel.duration_distance_matrix_dst_tags.

meters[]

double

Valores de distância para uma linha específica. Se nenhum custo ou restrição se referir a distâncias no modelo, esse campo pode ficar em branco. Caso contrário, ele precisa ter tantos elementos quanto durations.

PrecedenceRule

Uma regra de precedência entre dois eventos (cada evento é a retirada ou a entrega de um envio): o "segundo" evento precisa começar pelo menos offset_duration depois do "primeiro".

Várias precedências podem se referir aos mesmos eventos (ou relacionados), por exemplo, "A retirada de B acontece após a entrega de A" e "A retirada de C acontece após a retirada de B".

Além disso, as precedências só são aplicadas quando os dois envios são realizados e são ignoradas de outra forma.

Campos
first_is_delivery

bool

Indica se o evento "primeiro" é uma entrega.

second_is_delivery

bool

Indica se o "segundo" evento é uma entrega.

offset_duration

Duration

O deslocamento entre o "primeiro" e o "segundo" evento. Ele pode ser negativo.

first_index

int32

Índice de envio do evento "primeiro". É necessário especificar este campo.

second_index

int32

Índice de envio do "segundo" evento. É necessário especificar este campo.

ShipmentRoute

A rota de um veículo pode ser decomposta, ao longo do eixo do tempo, desta forma (assumimos que há n visitas):

  |            |            |          |       |  T[2], |        |      |
  | Transition |  Visit #0  |          |       |  V[2], |        |      |
  |     #0     |    aka     |   T[1]   |  V[1] |  ...   | V[n-1] | T[n] |
  |  aka T[0]  |    V[0]    |          |       | V[n-2],|        |      |
  |            |            |          |       | T[n-1] |        |      |
  ^            ^            ^          ^       ^        ^        ^      ^
vehicle    V[0].start   V[0].end     V[1].   V[1].    V[n].    V[n]. vehicle
 start     (arrival)   (departure)   start   end      start    end     end

Observe que há uma diferença entre:

  • "Eventos pontuais", como o início e o fim do veículo e o início e o fim de cada visita (ou seja, a chegada e a partida). Eles acontecem em um determinado segundo.
  • "intervalos de tempo", como as visitas em si e a transição entre elas. Embora os intervalos de tempo às vezes tenham duração zero, ou seja, começam e terminam no mesmo segundo, eles geralmente têm uma duração positiva.

Invariantes:

  • Se houver n visitas, haverá n+1 transições.
  • Uma visita é sempre cercada por uma transição anterior (mesmo índice) e uma transição posterior (índice + 1).
  • A partida do veículo é sempre seguida pela transição #0.
  • O fim do veículo é sempre precedido pela transição #n.

Veja o que acontece durante uma Transition e uma Visit:

---+-------------------------------------+-----------------------------+-->
   |           TRANSITION[i]             |           VISIT[i]          |
   |                                     |                             |
   |  * TRAVEL: the vehicle moves from   |      PERFORM the visit:     |
   |    VISIT[i-1].departure_location to |                             |
   |    VISIT[i].arrival_location, which |  * Spend some time:         |
   |    takes a given travel duration    |    the "visit duration".    |
   |    and distance                     |                             |
   |                                     |  * Load or unload           |
   |  * BREAKS: the driver may have      |    some quantities from the |
   |    breaks (e.g. lunch break).       |    vehicle: the "demand".   |
   |                                     |                             |
   |  * WAIT: the driver/vehicle does    |                             |
   |    nothing. This can happen for     |                             |
   |    many reasons, for example when   |                             |
   |    the vehicle reaches the next     |                             |
   |    event's destination before the   |                             |
   |    start of its time window         |                             |
   |                                     |                             |
   |  * DELAY: *right before* the next   |                             |
   |    arrival. E.g. the vehicle and/or |                             |
   |    driver spends time unloading.    |                             |
   |                                     |                             |
---+-------------------------------------+-----------------------------+-->
   ^                                     ^                             ^
V[i-1].end                           V[i].start                    V[i].end

Por fim, confira como TRAVEL, BREAKS, DELAY e WAIT podem ser organizados durante uma transição.

  • Elas não se sobrepõem.
  • O DELAY é único e precisa ser um período contíguo de tempo antes da próxima visita (ou término do veículo). Portanto, basta saber a duração do atraso para saber o início e o fim.
  • Os intervalos são períodos de tempo contíguos e não sobrepostos. A resposta especifica o horário de início e a duração de cada intervalo.
  • TRAVEL e WAIT são "preemptáveis": eles podem ser interrompidos várias vezes durante essa transição. Os clientes podem presumir que a viagem vai acontecer "assim que possível" e que o tempo restante será preenchido com "espera".

Um exemplo (complexo):

                               TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
  ||     |       |           |       |           |         |         ||
  ||  T  |   B   |     T     |       |     B     |         |    D    ||
  ||  r  |   r   |     r     |   W   |     r     |    W    |    e    ||
  ||  a  |   e   |     a     |   a   |     e     |    a    |    l    ||
  ||  v  |   a   |     v     |   i   |     a     |    i    |    a    ||
  ||  e  |   k   |     e     |   t   |     k     |    t    |    y    ||
  ||  l  |       |     l     |       |           |         |         ||
  ||     |       |           |       |           |         |         ||
--++-----------------------------------------------------------------++-->
Campos
vehicle_index

int32

Veículo que executa a rota, identificado pelo índice na origem ShipmentModel.

vehicle_label

string

Rótulo do veículo que executa essa rota, igual a ShipmentModel.vehicles(vehicle_index).label, se especificado.

vehicle_start_time

Timestamp

Hora em que o veículo inicia o trajeto.

vehicle_end_time

Timestamp

Hora em que o veículo termina o trajeto.

visits[]

Visit

Sequência ordenada de visitas que representa uma rota. visits[i] é a i-ésima visita na rota. Se esse campo estiver vazio, o veículo será considerado como não utilizado.

transitions[]

Transition

Lista ordenada de transições para a rota.

has_traffic_infeasibilities

bool

Quando OptimizeToursRequest.consider_road_traffic é definido como verdadeiro, esse campo indica que as inconsistências nos horários da rota são previstas usando estimativas de duração da viagem com base no trânsito. Pode não haver tempo suficiente para concluir as viagens ajustadas ao tráfego, os atrasos e os intervalos entre as visitas, antes da primeira visita ou depois da última visita, e ainda atender aos períodos de visita e do veículo. Por exemplo,

  start_time(previous_visit) + duration(previous_visit) +
  travel_duration(previous_visit, next_visit) > start_time(next_visit)

A chegada em next_visit provavelmente vai acontecer mais tarde do que a janela de tempo atual devido ao aumento da estimativa de tempo de viagem travel_duration(previous_visit, next_visit) devido ao trânsito. Além disso, um intervalo pode ser forçado a se sobrepor a uma visita devido a um aumento nas estimativas de tempo de deslocamento e restrições de intervalo de tempo de visita ou intervalo.

route_polyline

EncodedPolyline

A representação codificada da polilinha do trajeto. Esse campo só será preenchido se OptimizeToursRequest.populate_polylines estiver definido como verdadeiro.

breaks[]

Break

Pausas programadas para o veículo que faz essa rota. A sequência breaks representa intervalos de tempo, cada um começando no start_time correspondente e durando duration segundos.

metrics

AggregatedMetrics

Métricas de duração, distância e carga para essa rota. Os campos de AggregatedMetrics são somados em todos os ShipmentRoute.transitions ou ShipmentRoute.visits, dependendo do contexto.

route_costs

map<string, double>

Custo da rota, detalhado por campos de solicitação relacionados a custos. As chaves são caminhos proto, em relação à entrada OptimizeToursRequests, por exemplo, "model.shipments.pickups.cost", e os valores são o custo total gerado pelo campo de custo correspondente, agregado em todo o trajeto. Em outras palavras, costs["model.shipments.pickups.cost"] é a soma de todos os custos de retirada no trajeto. Todos os custos definidos no modelo são informados em detalhes aqui, exceto os custos relacionados a TransitionAttributes, que são informados de forma agregada a partir de 01/2022.

route_total_cost

double

Custo total da rota. A soma de todos os custos no mapa de custos.

Intervalo

Dados que representam a execução de uma pausa.

Campos
start_time

Timestamp

Horário de início de um intervalo.

duration

Duration

Duração de uma pausa.

EncodedPolyline

A representação codificada de uma polilinha. Saiba mais sobre a codificação de polilinhas aqui: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.

Campos
points

string

String que representa os pontos codificados da polilinha.

Transição

Transição entre dois eventos na rota. Consulte a descrição de ShipmentRoute.

Se o veículo não tiver start_location e/ou end_location, as métricas de viagem correspondentes serão 0.

Campos
travel_duration

Duration

Duração da viagem durante essa transição.

travel_distance_meters

double

Distância percorrida durante a transição.

traffic_info_unavailable

bool

Quando o tráfego é solicitado por OptimizeToursRequest.consider_road_traffic e as informações de tráfego não podem ser recuperadas para um Transition, esse booleano é definido como verdadeiro. Isso pode ser temporário (problema raro nos servidores de trânsito em tempo real) ou permanente (nenhum dado para esse local).

delay_duration

Duration

Soma das durações de atraso aplicadas a essa transição. Se houver, o atraso começa exatamente delay_duration segundos antes do próximo evento (visita ou fim do veículo). Consulte os TransitionAttributes.delay.

break_duration

Duration

Soma da duração das pausas ocorridas durante essa transição, se houver. Os detalhes sobre a hora de início e a duração de cada intervalo são armazenados em ShipmentRoute.breaks.

wait_duration

Duration

Tempo gasto esperando durante essa transição. A duração da espera corresponde ao tempo de inatividade e não inclui o tempo de intervalo. Além disso, esse tempo de espera pode ser dividido em vários intervalos não contíguos.

total_duration

Duration

Duração total da transição, fornecida para conveniência. É igual a:

  • próxima visita start_time (ou vehicle_end_time se for a última transição) start_time da transição;
  • Se ShipmentRoute.has_traffic_infeasibilities for falso, o seguinte também será verdadeiro: "total_duration = travel_duration + delay_duration
  • break_duration + wait_duration`.
start_time

Timestamp

Horário de início desta transição.

route_polyline

EncodedPolyline

A representação codificada da polilinha do trajeto seguido durante a transição. Esse campo só será preenchido se populate_transition_polylines estiver definido como verdadeiro.

route_token

string

Apenas saída. Um token opaco que pode ser transmitido ao SDK Navigation para reconstruir a rota durante a navegação e, em caso de redirecionamento, respeitar a intenção original quando a rota foi criada. Tratar esse token como um blob opaco. Não compare o valor entre as solicitações, porque ele pode mudar mesmo que o serviço retorne a mesma rota. Esse campo só será preenchido se populate_transition_polylines estiver definido como verdadeiro.

vehicle_loads

map<string, VehicleLoad>

Cargas de veículos durante essa transição, para cada tipo que aparece na Vehicle.load_limits do veículo ou que tem Shipment.load_demands diferente de zero em algum envio realizado nessa rota.

As cargas durante a primeira transição são as cargas iniciais da rota do veículo. Depois, após cada visita, o load_demands da visita é adicionado ou subtraído para receber as cargas da próxima transição, dependendo se a visita foi uma retirada ou uma entrega.

VehicleLoad

Informa a carga real do veículo em algum ponto do trajeto para um determinado tipo (consulte Transition.vehicle_loads).

Campos
amount

int64

A quantidade de carga no veículo para o tipo especificado. A unidade de carga geralmente é indicada pelo tipo. Consulte Transition.vehicle_loads.

Acesse

Uma visita realizada durante uma rota. Essa visita corresponde à retirada ou entrega de um Shipment.

Campos
shipment_index

int32

Índice do campo shipments na ShipmentModel de origem.

is_pickup

bool

Se verdadeiro, a visita corresponde à retirada de um Shipment. Caso contrário, ele corresponde a uma entrega.

visit_request_index

int32

Índice de VisitRequest no campo de retirada ou entrega do Shipment (consulte is_pickup).

start_time

Timestamp

Horário em que a visita começa. O veículo pode chegar antes disso ao local da visita. Os horários são consistentes com o ShipmentModel.

load_demands

map<string, Load>

Demanda total de carga de visitas como a soma do envio e da solicitação de visita load_demands. Os valores são negativos se a visita for uma entrega. As demandas são informadas para os mesmos tipos do Transition.loads (consulte este campo).

detour

Duration

Tempo de desvio extra devido aos envios visitados no trajeto antes da visita e ao possível tempo de espera induzido pelas janelas de tempo. Se a visita for uma entrega, o desvio será calculado a partir da visita de retirada correspondente e será igual a:

start_time(delivery) - start_time(pickup)
- (duration(pickup) + travel duration from the pickup location
to the delivery location).

Caso contrário, ele é calculado com base no start_location do veículo e é igual a:

start_time - vehicle_start_time - travel duration from
the vehicle's `start_location` to the visit.
shipment_label

string

Cópia do Shipment.label correspondente, se especificado no Shipment.

visit_label

string

Cópia do VisitRequest.label correspondente, se especificado no VisitRequest.

ShipmentTypeIncompatibility

Especifica incompatibilidades entre os envios, dependendo do shipment_type. A exibição de remessas incompatíveis no mesmo trajeto é restrita com base no modo de incompatibilidade.

Campos
types[]

string

Lista de tipos incompatíveis. Dois envios com shipment_types diferentes entre os listados são "incompatíveis".

incompatibility_mode

IncompatibilityMode

Modo aplicado à incompatibilidade.

IncompatibilityMode

Modos que definem como a aparência de remessas incompatíveis é restrita na mesma rota.

Enums
INCOMPATIBILITY_MODE_UNSPECIFIED Modo de incompatibilidade não especificado. Esse valor nunca pode ser usado.
NOT_PERFORMED_BY_SAME_VEHICLE Nesse modo, dois envios com tipos incompatíveis nunca podem compartilhar o mesmo veículo.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

Para dois envios com tipos incompatíveis com o modo de incompatibilidade NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY:

  • Se as duas entregas forem apenas de retirada (sem entregas) ou apenas de entrega (sem retiradas), elas não poderão compartilhar o mesmo veículo.
  • Se um dos envios tiver uma entrega e o outro uma retirada, os dois envios poderão compartilhar o mesmo veículo se o primeiro for entregue antes que o segundo seja retirado.

ShipmentTypeRequirement

Especifica os requisitos entre os envios com base no shipment_type. Os detalhes do requisito são definidos pelo modo de requisito.

Campos
required_shipment_type_alternatives[]

string

Lista de tipos de envio alternativos exigidos pelo dependent_shipment_types.

dependent_shipment_types[]

string

Todos os envios com um tipo no campo dependent_shipment_types exigem que pelo menos um envio do tipo required_shipment_type_alternatives seja visitado no mesmo trajeto.

OBSERVAÇÃO: não são permitidas cadeias de requisitos em que um shipment_type depende de si mesmo.

requirement_mode

RequirementMode

Modo aplicado ao requisito.

RequirementMode

Modos que definem a aparência de remessas dependentes em um trajeto.

Enums
REQUIREMENT_MODE_UNSPECIFIED Modo de requisito não especificado. Esse valor nunca pode ser usado.
PERFORMED_BY_SAME_VEHICLE Nesse modo, todos os envios "dependentes" precisam compartilhar o mesmo veículo de pelo menos um dos envios "obrigatórios".
IN_SAME_VEHICLE_AT_PICKUP_TIME

Com o modo IN_SAME_VEHICLE_AT_PICKUP_TIME, todos os envios "dependentes" precisam ter pelo menos um envio "obrigatório" no veículo no momento da coleta.

Portanto, uma retirada de envio "dependente" precisa ter:

  • Um envio "obrigatório" somente para entrega entregue na rota após
  • Um envio "obrigatório" foi coletado na rota antes dele, e se o envio "obrigatório" tiver uma entrega, ela precisará ser realizada após a coleta do envio "dependente".
IN_SAME_VEHICLE_AT_DELIVERY_TIME Igual antes, exceto que os envios "dependentes" precisam ter um envio "obrigatório" no veículo no momento da entrega.

SkippedShipment

Especifica os detalhes dos envios não realizados em uma solução. Para casos triviais e/ou se conseguirmos identificar a causa da omissão, vamos informar o motivo aqui.

Campos
index

int32

O índice corresponde ao índice do envio na ShipmentModel de origem.

label

string

Cópia do Shipment.label correspondente, se especificado no Shipment.

reasons[]

Reason

Uma lista de motivos que explicam por que o envio foi ignorado. Consulte o comentário acima de Reason. Se não for possível entender por que um envio foi ignorado, os motivos não serão definidos.

Motivo

Se pudermos explicar por que o envio foi pulado, os motivos serão listados aqui. Se o motivo não for o mesmo para todos os veículos, reason terá mais de um elemento. Um envio pulado não pode ter motivos duplicados, ou seja, quando todos os campos são iguais, exceto example_vehicle_index. Exemplo:

reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 1
  example_exceeded_capacity_type: "Apples"
}
reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 3
  example_exceeded_capacity_type: "Pears"
}
reasons {
  code: CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT
  example_vehicle_index: 1
}

A remessa pulada é incompatível com todos os veículos. Os motivos podem ser diferentes para todos os veículos, mas a capacidade de "Maçãs" de pelo menos um veículo seria excedida (incluindo o veículo 1), a capacidade de "Peras" de pelo menos um veículo seria excedida (incluindo o veículo 3) e o limite de distância de pelo menos um veículo seria excedido (incluindo o veículo 1).

Campos
code

Code

Consulte os comentários do código.

example_exceeded_capacity_type

string

Se o código do motivo for DEMAND_EXCEEDS_VEHICLE_CAPACITY, documenta um tipo de capacidade que foi excedido.

example_vehicle_index

int32

Se o motivo estiver relacionado a uma incompatibilidade entre o envio e o veículo, esse campo vai mostrar o índice de um veículo relevante.

Código

Código que identifica o tipo de motivo. A ordem aqui não tem sentido. Em particular, não há indicação de que um determinado motivo vai aparecer antes de outro na solução, se ambos se aplicarem.

Enums
CODE_UNSPECIFIED Isso nunca deve ser usado.
NO_VEHICLE Não há nenhum veículo no modelo, o que torna todos os envios inviáveis.
DEMAND_EXCEEDS_VEHICLE_CAPACITY A demanda do envio excede a capacidade de um veículo para alguns tipos de capacidade, um deles é example_exceeded_capacity_type.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT

A distância mínima necessária para realizar esse envio, ou seja, de start_location do veículo até os locais de retirada e/ou entrega do envio e até o local final do veículo, excede o route_distance_limit do veículo.

Para essa computação, usamos as distâncias geodésicas.

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT

O tempo mínimo necessário para realizar esse envio, incluindo o tempo de viagem, de espera e de serviço, excede o route_duration_limit do veículo.

Observação: o tempo de viagem é calculado no melhor cenário, ou seja, como distância geodésica x 36 m/s (aproximadamente 130 km/hora).

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT Igual ao exemplo acima, mas comparamos apenas o tempo mínimo de viagem e o travel_duration_limit do veículo.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS O veículo não pode realizar esse envio no melhor cenário (consulte CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT para o cálculo de tempo) se ele começar no horário de início mais cedo: o tempo total faria o veículo terminar depois do horário de término mais recente.
VEHICLE_NOT_ALLOWED O campo allowed_vehicle_indices da remessa não está vazio e o veículo não pertence a ela.

TimeWindow

As janelas de tempo restringem o horário de um evento, como o horário de chegada em uma visita ou o início e o término de um veículo.

Os limites rígidos da janela de tempo, start_time e end_time, aplicam o horário mais cedo e mais tarde do evento, de modo que start_time <= event_time <= end_time. O limite inferior da janela de tempo flexível, soft_start_time, expressa uma preferência para que o evento ocorra em ou após soft_start_time, incorrendo em um custo proporcional ao tempo antes de soft_start_time. O limite superior da janela de tempo flexível, soft_end_time, expressa uma preferência para que o evento ocorra em ou antes de soft_end_time, incorrendo em um custo proporcional ao tempo após soft_end_time. start_time, end_time, soft_start_time e soft_end_time precisam estar dentro dos limites de tempo globais (consulte ShipmentModel.global_start_time e ShipmentModel.global_end_time) e respeitar:

  0 <= `start_time` <= `end_time` and
  0 <= `start_time` <= `soft_start_time` and
  0 <= `soft_end_time` <= `end_time`.
Campos
start_time

Timestamp

O horário de início da janela de tempo rígido. Se não for especificado, será definido como ShipmentModel.global_start_time.

end_time

Timestamp

Horário de término da janela de tempo rígido. Se não for especificado, será definido como ShipmentModel.global_end_time.

soft_start_time

Timestamp

O horário de início flexível do período.

soft_end_time

Timestamp

O horário de término flexível da janela.

cost_per_hour_before_soft_start_time

double

Um custo por hora adicionado a outros custos no modelo se o evento ocorrer antes de soft_start_time, calculado como:

   max(0, soft_start_time - t.seconds)
                          * cost_per_hour_before_soft_start_time / 3600,
t being the time of the event.

Esse custo precisa ser positivo, e o campo só pode ser definido se soft_start_time tiver sido definido.

cost_per_hour_after_soft_end_time

double

Um custo por hora adicionado a outros custos no modelo se o evento ocorrer após soft_end_time, calculado como:

   max(0, t.seconds - soft_end_time.seconds)
                    * cost_per_hour_after_soft_end_time / 3600,
t being the time of the event.

Esse custo precisa ser positivo, e o campo só pode ser definido se soft_end_time tiver sido definido.

TransitionAttributes

Especifica os atributos das transições entre duas visitas consecutivas em um trajeto. Várias TransitionAttributes podem ser aplicadas à mesma transição. Nesse caso, todos os custos extras são somados e a restrição ou o limite mais rigoroso é aplicado, seguindo a semântica "E" natural.

Campos
src_tag

string

Tags que definem o conjunto de transições (src->dst) a que esses atributos se aplicam.

Uma visita de origem ou início do veículo corresponde se o VisitRequest.tags ou Vehicle.start_tags contiver src_tag ou não contiver excluded_src_tag (dependendo de qual dos dois campos não estiver vazio).

excluded_src_tag

string

Consulte src_tag. Exatamente um dos src_tag e excluded_src_tag precisa não estar vazio.

dst_tag

string

Uma visita ao destino ou o fim do veículo corresponde se VisitRequest.tags ou Vehicle.end_tags contêm dst_tag ou não contêm excluded_dst_tag (dependendo de qual dos dois campos não está vazio).

excluded_dst_tag

string

Consulte dst_tag. Exatamente um dos dst_tag e excluded_dst_tag precisa não estar vazio.

cost

double

Especifica um custo para realizar essa transição. Esse valor está na mesma unidade que todos os outros custos no modelo e não pode ser negativo. Ele é aplicado sobre todos os outros custos existentes.

cost_per_kilometer

double

Especifica um custo por quilômetro aplicado à distância percorrida ao realizar essa transição. Ele é a soma de todos os Vehicle.cost_per_kilometer especificados nos veículos.

distance_limit

DistanceLimit

Especifica um limite na distância percorrida ao realizar essa transição.

A partir de junho de 2021, apenas os limites flexíveis são aceitos.

delay

Duration

Especifica um atraso incorrido ao realizar essa transição.

Esse atraso sempre ocorre após a conclusão da visita de origem e antes do início da visita de destino.

Veículo

Modela um veículo em um problema de envio. A solução de um problema de envio vai criar uma rota que começa em start_location e termina em end_location para esse veículo. Um trajeto é uma sequência de visitas (consulte ShipmentRoute).

Campos
display_name

string

O nome de exibição do veículo definido pelo usuário. Ele pode ter até 63 caracteres e pode usar caracteres UTF-8.

travel_mode

TravelMode

O modo de viagem, que afeta as vias que podem ser usadas pelo veículo e a velocidade dele. Consulte também travel_duration_multiple.

route_modifiers

RouteModifiers

Um conjunto de condições a serem atendidas que afetam a forma como as rotas são calculadas para o veículo.

start_location

LatLng

Local geográfico em que o veículo começa antes de pegar os envios. Se não for especificado, o veículo vai começar na primeira coleta. Se o modelo de envio tiver matrizes de duração e distância, start_location não poderá ser especificado.

start_waypoint

Waypoint

Ponto de passagem que representa um local geográfico em que o veículo começa antes de pegar os envios. Se nem start_waypoint nem start_location forem especificados, o veículo vai começar na primeira coleta. Se o modelo de envio tiver matrizes de duração e distância, start_waypoint não poderá ser especificado.

end_location

LatLng

Localização geográfica onde o veículo termina depois de concluir a última VisitRequest. Se não for especificado, o ShipmentRoute do veículo será encerrado imediatamente após a conclusão da última VisitRequest. Se o modelo de envio tiver matrizes de duração e distância, end_location não poderá ser especificado.

end_waypoint

Waypoint

Ponto de passagem que representa um local geográfico onde o veículo termina depois de concluir o último VisitRequest. Se nem end_waypoint nem end_location forem especificados, o ShipmentRoute do veículo será encerrado imediatamente quando ele concluir o último VisitRequest. Se o modelo de envio tiver matrizes de duração e distância, end_waypoint não poderá ser especificado.

start_tags[]

string

Especifica as tags anexadas ao início do trajeto do veículo.

Strings vazias ou duplicadas não são permitidas.

end_tags[]

string

Especifica as tags anexadas ao fim do trajeto do veículo.

Strings vazias ou duplicadas não são permitidas.

start_time_windows[]

TimeWindow

Janelas de tempo em que o veículo pode sair do local de partida. Eles precisam estar dentro dos limites de tempo globais (consulte os campos ShipmentModel.global_*). Se não for especificado, não haverá limitação além desses limites globais.

As janelas de tempo pertencentes ao mesmo campo repetido precisam ser distintas, ou seja, nenhuma janela de tempo pode se sobrepor ou ser adjacente a outra, e elas precisam estar em ordem cronológica.

cost_per_hour_after_soft_end_time e soft_end_time só podem ser definidos se houver uma única janela de tempo.

end_time_windows[]

TimeWindow

Janelas de tempo em que o veículo pode chegar ao local final. Eles precisam estar dentro dos limites de tempo globais (consulte os campos ShipmentModel.global_*). Se não for especificado, não haverá limitação além desses limites globais.

As janelas de tempo pertencentes ao mesmo campo repetido precisam ser distintas, ou seja, nenhuma janela de tempo pode se sobrepor ou ser adjacente a outra, e elas precisam estar em ordem cronológica.

cost_per_hour_after_soft_end_time e soft_end_time só podem ser definidos se houver uma única janela de tempo.

unloading_policy

UnloadingPolicy

Política de descarregamento aplicada ao veículo.

load_limits

map<string, LoadLimit>

Capacidades do veículo (peso, volume, número de paletes, por exemplo). As chaves no mapa são os identificadores do tipo de carga, consistentes com as chaves do campo Shipment.load_demands. Se uma determinada chave estiver ausente nesse mapa, a capacidade correspondente será considerada ilimitada.

cost_per_hour

double

Custos do veículo: todos os custos são somados e precisam estar na mesma unidade que Shipment.penalty_cost.

Custo por hora da rota do veículo. Esse custo é aplicado ao tempo total gasto no trajeto e inclui o tempo de viagem, de espera e de visita. O uso de cost_per_hour em vez de apenas cost_per_traveled_hour pode resultar em mais latência.

cost_per_traveled_hour

double

Custo por hora de percurso do trajeto do veículo. Esse custo é aplicado apenas ao tempo de viagem do trajeto (ou seja, o que é informado em ShipmentRoute.transitions) e exclui o tempo de espera e de visita.

cost_per_kilometer

double

Custo por quilômetro da rota do veículo. Esse custo é aplicado à distância informada no ShipmentRoute.transitions e não se aplica a nenhuma distância percorrida implicitamente do arrival_location para o departure_location de um único VisitRequest.

fixed_cost

double

Custo fixo aplicado se o veículo for usado para processar um envio.

used_if_route_is_empty

bool

Este campo só se aplica a veículos quando a rota não atende a nenhum envio. Ele indica se o veículo deve ser considerado usado ou não nesse caso.

Se verdadeiro, o veículo vai da origem ao destino, mesmo que não atenda a nenhum envio, e os custos de tempo e distância resultantes da viagem de origem a destino são levados em consideração.

Caso contrário, o veículo não vai se deslocar do local de início ao de destino, e nenhum break_rule ou atraso (de TransitionAttributes) será programado para ele. Nesse caso, o ShipmentRoute do veículo não contém nenhuma informação, exceto o índice e o rótulo do veículo.

route_duration_limit

DurationLimit

Limite aplicado à duração total da rota do veículo. Em um determinado OptimizeToursResponse, a duração da rota de um veículo é a diferença entre o vehicle_end_time e o vehicle_start_time.

travel_duration_limit

DurationLimit

Limite aplicado à duração da viagem da rota do veículo. Em um determinado OptimizeToursResponse, a duração do trajeto é a soma de todos os transitions.travel_duration.

route_distance_limit

DistanceLimit

Limite aplicado à distância total da rota do veículo. Em um determinado OptimizeToursResponse, a distância da rota é a soma de todos os transitions.travel_distance_meters.

extra_visit_duration_for_visit_type

map<string, Duration>

Especifica um mapa de strings de visit_types para durações. A duração é o tempo além do VisitRequest.duration que será gasto nas visitas com o visit_types especificado. Essa duração de visita extra aumenta o custo se cost_per_hour for especificado. As chaves (por exemplo, visit_types) não podem ser strings vazias.

Se uma solicitação de visita tiver vários tipos, uma duração será adicionada para cada tipo no mapa.

break_rule

BreakRule

Descreve a programação de pausas a ser aplicada a esse veículo. Se estiver vazio, nenhuma pausa será programada para esse veículo.

label

string

Especifica um rótulo para este veículo. Esse rótulo é informado na resposta como o vehicle_label do ShipmentRoute correspondente.

ignore

bool

Se for verdadeiro, used_if_route_is_empty precisa ser falso, e esse veículo vai permanecer sem uso.

Se um envio for realizado por um veículo ignorado em injected_first_solution_routes, ele será ignorado na primeira solução, mas poderá ser realizado na resposta.

Se um envio for realizado por um veículo ignorado em injected_solution_constraint e qualquer coleta/entrega relacionada for obrigada a permanecer no veículo (ou seja, não for relaxada para o nível RELAX_ALL_AFTER_THRESHOLD), ela será ignorada na resposta. Se um envio tiver um campo allowed_vehicle_indices não vazio e todos os veículos permitidos forem ignorados, ele será ignorado na resposta.

travel_duration_multiple

double

Especifica um fator multiplicador que pode ser usado para aumentar ou diminuir os tempos de viagem desse veículo. Por exemplo, definir esse valor como 2,0 significa que o veículo é mais lento e tem tempos de viagem duas vezes maiores do que os veículos padrão. Esse valor não afeta a duração das visitas. Isso afeta o custo se cost_per_hour ou cost_per_traveled_hour forem especificados. Precisa estar no intervalo [0,001, 1.000,0]. Se não for definido, o veículo será padrão e esse múltiplo será considerado 1, 0.

ATENÇÃO: os tempos de viagem serão arredondados para o segundo mais próximo depois que esse múltiplo for aplicado, mas antes de realizar qualquer operação numérica. Portanto, um múltiplo pequeno pode resultar em perda de precisão.

Consulte também extra_visit_duration_for_visit_type abaixo.

DurationLimit

Um limite que define a duração máxima do trajeto de um veículo. Ele pode ser hardware ou software.

Quando um campo de limite flexível é definido, o limite máximo flexível e o custo associado precisam ser definidos juntos.

Campos
max_duration

Duration

Um limite rígido que restringe a duração a, no máximo, max_duration.

soft_max_duration

Duration

Um limite flexível que não aplica um limite máximo de duração, mas que, quando violado, faz com que a rota incorra em um custo. Esse custo é somado a outros custos definidos no modelo, com a mesma unidade.

Se definido, soft_max_duration precisa ser não negativo. Se max_duration também estiver definido, soft_max_duration precisará ser menor que max_duration.

quadratic_soft_max_duration

Duration

Um limite flexível não aplica um limite máximo de duração, mas, quando violado, faz com que a rota incorra em um custo, quadrático na duração. Esse custo é somado a outros custos definidos no modelo, com a mesma unidade.

Se definido, quadratic_soft_max_duration precisa ser não negativo. Se max_duration também for definido, quadratic_soft_max_duration precisará ser menor que max_duration, e a diferença não poderá ser maior que um dia:

max_duration - quadratic_soft_max_duration <= 86400 seconds

cost_per_hour_after_soft_max

double

Custo por hora incorrido se o limite de soft_max_duration for violado. O custo adicional será 0 se a duração estiver abaixo do limite. Caso contrário, o custo vai depender da duração da seguinte forma:

  cost_per_hour_after_soft_max * (duration - soft_max_duration)

O custo não pode ser negativo.

cost_per_square_hour_after_quadratic_soft_max

double

Custo por hora quadrada incorrido se o limite de quadratic_soft_max_duration for violado.

O custo adicional será 0 se a duração estiver abaixo do limite. Caso contrário, o custo vai depender da duração da seguinte forma:

  cost_per_square_hour_after_quadratic_soft_max *
  (duration - quadratic_soft_max_duration)^2

O custo não pode ser negativo.

LoadLimit

Define um limite de carga aplicável a um veículo, por exemplo, "este caminhão só pode transportar até 3.500 kg". Consulte load_limits.

Campos
soft_max_load

int64

Um limite flexível da carga. Consulte cost_per_unit_above_soft_max.

cost_per_unit_above_soft_max

double

Se a carga exceder soft_max_load ao longo da rota do veículo, a seguinte penalidade de custo será aplicada (apenas uma vez por veículo): (carga - soft_max_load) * cost_per_unit_above_soft_max. Todos os custos são somados e precisam estar na mesma unidade que Shipment.penalty_cost.

start_load_interval

Interval

O intervalo de carga aceitável do veículo no início do trajeto.

end_load_interval

Interval

O intervalo de carga aceitável do veículo no fim da rota.

max_load

int64

A quantidade máxima aceitável de carga.

Intervalo

Intervalo de valores de carga aceitáveis.

Campos
min

int64

Uma carga mínima aceitável. Precisa ser ≥ 0. Se ambos forem especificados, min precisa ser ≤ max.

max

int64

Uma carga máxima aceitável. Precisa ser ≥ 0. Se não for especificado, a carga máxima não será restringida por essa mensagem. Se ambos forem especificados, min precisa ser ≤ max.

TravelMode

Meios de transporte que podem ser usados por veículos.

Eles precisam ser um subconjunto dos modos de transporte da API Preferred Routes da Plataforma Google Maps. Consulte: https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode.

Enums
TRAVEL_MODE_UNSPECIFIED Meio de transporte não especificado, equivalente a DRIVING.
DRIVING Meio de transporte correspondente às rotas de carro (carro, ...).
WALKING Meio de transporte correspondente às rotas a pé.

UnloadingPolicy

Política sobre como um veículo pode ser descarregado. Aplica-se apenas a remessas com retirada e entrega.

Outros envios podem ocorrer em qualquer lugar da rota, independente de unloading_policy.

Enums
UNLOADING_POLICY_UNSPECIFIED Política de descarregamento não especificada. As entregas precisam ocorrer após as respectivas coletas.
LAST_IN_FIRST_OUT As entregas precisam ocorrer na ordem inversa das retiradas
FIRST_IN_FIRST_OUT As entregas precisam ocorrer na mesma ordem das retiradas

Ponto de referência

Encapsula um ponto de passagem. Os pontos de passagem marcam os locais de chegada e partida de Solicitações de visita e os locais de início e término dos veículos.

Campos
side_of_road

bool

Opcional. Indica que o local desse waypoint tem preferência para que o veículo pare em um lado específico da via. Quando você define esse valor, a rota passa pelo local para que o veículo possa parar no lado da estrada em que o local está localizado a partir do centro da via. Essa opção não funciona para o modo de deslocamento "A pé".

Campo de união location_type. Diferentes maneiras de representar um local. location_type pode ser apenas de um dos tipos a seguir:
location

Location

Um ponto especificado usando coordenadas geográficas, incluindo um título opcional.

place_id

string

O ID do lugar do ponto de interesse associado ao ponto de passagem.