Package google.maps.routeoptimization.v1

Índice

RouteOptimization

Um serviço para otimizar as viagens 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].
    • nanos precisa ser desativado 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].
    • nanos precisa ser desativado ou definido como 0.
  • google.type.LatLng
    • A latitude precisa estar entre [-90,0, 90,0].
    • A longitude precisa estar entre [-180,0, 180,0].
    • pelo menos um dos valores de latitude e longitude precisa ser diferente de zero.
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

Otimiza os trajetos de veículos para uma ou mais mensagens OptimizeToursRequest em lote.

Este método é uma operação de longa duração (LRO, na sigla em inglês). 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 da 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. Todas as solicitações processadas com sucesso terão os resultados 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 da 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 um OptimizeToursRequest que contém um ShipmentModel e retorna um 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 em Shipments que precisam ser realizadas e Vehicles que podem ser usadas para transportar as Shipments. Os ShipmentRoutes atribuem Shipments a Vehicles. Mais especificamente, eles atribuem uma série de Visits a cada veículo, em que um Visit corresponde a um VisitRequest, que é uma retirada ou entrega para um Shipment.

O objetivo é fornecer uma atribuição de ShipmentRoutes para 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.

OptimizeToursLongRunning

rpc OptimizeToursLongRunning(OptimizeToursRequest) returns (Operation)

Essa é uma variante do método OptimizeTours projetada para otimizações com valores de tempo limite grandes. Ele é preferível ao método 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.

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.

OptimizeToursUri

rpc OptimizeToursUri(OptimizeToursUriRequest) returns (Operation)

Essa é uma variante do método OptimizeToursLongRunning projetada para otimizações com valores de tempo limite grandes e tamanhos de entrada/saída grandes.

O cliente especifica o URI do OptimizeToursRequest armazenado no Google Cloud Storage, e o servidor grava o OptimizeToursResponse em um URI do Google Cloud Storage especificado pelo cliente.

Esse método é preferível ao OptimizeTours para otimizações que levam mais de alguns minutos e tamanhos de entrada/saída maiores que 8 MB, embora também possa ser usado para otimizações mais curtas e menores.

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 é OptimizeToursUriMetadata. O tipo de campo response será OptimizeToursUriResponse, se for bem-sucedido.

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.

AggregatedMetrics

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

Campos
performed_shipment_count

int32

Número de remessas realizadas. Um par de retirada e entrega conta apenas uma vez.

travel_duration

Duration

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

wait_duration

Duration

Duração total da espera de um trajeto ou uma solução.

delay_duration

Duration

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

break_duration

Duration

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

visit_duration

Duration

Duração total da visita para um trajeto ou uma 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 viagem de um trajeto ou uma solução.

max_loads

map<string, VehicleLoad>

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

performed_mandatory_shipment_count

int32

Número de remessas obrigatórias realizadas.

Experimental: o comportamento ou a existência desse campo pode mudar no futuro.

performed_shipment_penalty_cost_sum

double

A soma de Shipment.penalty_cost das remessas realizadas.

Experimental: o comportamento ou a existência desse campo pode mudar no futuro.

BatchOptimizeToursMetadata

Esse tipo não tem campos.

Metadados de operação para chamadas BatchOptimizeToursRequest.

BatchOptimizeToursRequest

Solicitação para otimizar tours em lote como uma operação assíncrona. Cada arquivo de entrada precisa conter um OptimizeToursRequest, e cada arquivo de saída vai conter 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. Projeto e 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.

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. Nome do modelo definido pelo usuário, que pode ser usado como alias para acompanhar os modelos.

input_config

InputConfig

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

output_config

OutputConfig

Obrigatório. As informações de localização de saída desejada.

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 da operação.

BreakRule

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

  • durante o deslocamento entre duas visitas (incluindo o tempo imediatamente antes ou depois de uma visita, mas não no meio dela), o que estende o tempo em trânsito correspondente entre as visitas;
  • ou antes do início do veículo (o veículo não pode iniciar no meio de um intervalo). Nesse caso, o horário de 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ários FrequencyConstraint podem ser aplicados. Todos precisam ser atendidos pelos BreakRequests deste BreakRule. Consulte FrequencyConstraint.

BreakRequest

A sequência de intervalos (ou seja, o número e a ordem deles) 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. As janelas 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 (inclusivo) no início do intervalo.

latest_start_time

Timestamp

Obrigatório. Limite superior (inclusivo) no início do intervalo.

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, aplicando uma frequência mínima de intervalo, como "É preciso haver um intervalo de pelo menos 1 hora a cada 12 horas". Supondo que isso possa ser interpretado como "Em qualquer período de 12 horas, é preciso haver pelo menos um intervalo 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 das durações mínimas já especificadas no BreakRequest.

Um FrequencyConstraint pode, na prática, ser aplicado a intervalos não consecutivos. Por exemplo, a programação a seguir segue o exemplo "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. Veja a descrição de FrequencyConstraint.

max_inter_break_duration

Duration

Obrigatório. Duração máxima permitida de qualquer intervalo de tempo na rota 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.

Tipos enumerados
DATA_FORMAT_UNSPECIFIED Valor inválido. O formato não pode ser UNSPECIFIED.
JSON JavaScript Object Notation.
PROTO_TEXT Formato de texto de buffers de protocolo. Consulte https://protobuf.dev/reference/protobuf/textformat-spec/

DistanceLimit

Um limite que define uma distância máxima que pode ser percorrida. Ele pode ser rígido ou flexível.

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

Campos
max_meters

int64

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

soft_max_meters

int64

Um limite flexível que não impõe um limite máximo de distância, mas que, 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 percorrido, 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 estiver acima do limite de soft_max_meters. O custo adicional será 0 se a distância estiver abaixo do limite. Caso contrário, a fórmula usada para calcular o custo será 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 restritas e como elas precisam ser restritas.

Campos
routes[]

ShipmentRoute

Rotas da solução a serem injetadas. Algumas rotas podem ser omitidas da solução original. As rotas e as remessas ignoradas precisam atender às premissas básicas de validade listadas para injected_first_solution_routes.

skipped_shipments[]

SkippedShipment

Remessas ignoradas da solução a serem injetadas. 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 as restrições devem ser flexibilizadas. 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 nas visitas serão flexibilizadas e em qual nível. As remessas listadas no campo skipped_shipment são restritas para serem ignoradas, ou seja, não podem ser realizadas.

Campos
relaxations[]

Relaxation

Todas as flexibilizações de restrição de visita que serão aplicadas às visitas em rotas com veículos em vehicle_indices.

vehicle_indices[]

int32

Especifica os índices de veículos aos quais a restrição de visita relaxations se aplica. Se estiver vazio, será considerado o padrão, e as relaxations serão aplicadas a todos os veículos que não forem especificados em outras constraint_relaxations. Pode haver no máximo um padrão, ou seja, no máximo um campo de relaxamento de restrição pode ficar vazio vehicle_indices. 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, os horários de início e término de um veículo em routes são totalmente restritos, 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 da restrição aplicado a uma visita #j que satisfaz:

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

Da mesma forma, o início do veículo é flexibilizado para relaxations(i).level se ele atender a:

  • vehicle_start_time >= relaxations(i).threshold_time E
  • relaxations(i).threshold_visit_count == 0 e o fim do veículo é relaxado para relaxations(i).level se satisfizer:
  • vehicle_end_time >= relaxations(i).threshold_time E
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

Para aplicar um nível de flexibilização se uma visita atender a threshold_visit_count OU threshold_time, adicione dois relaxations com o mesmo level: um com apenas threshold_visit_count definido e o outro com apenas threshold_time definido. 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 do trajeto para o fim do veículo, o nível de relaxamento se torna mais relaxado, ou seja, o nível de relaxamento não diminui à medida que o trajeto 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 horário será fixo, a menos que o veículo esteja vazio.

Campos
level

Level

O nível de relaxamento da 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 horário em que ou após o qual a flexibilização level pode ser aplicada.

threshold_visit_count

int32

O número de visitas em que a flexibilização level pode ser aplicada ou após as quais ela pode ser aplicada. Se threshold_visit_count for 0 (ou não definido), o level poderá ser aplicado diretamente no início do veículo.

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

Nível

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

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

Tipos enumerados
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 da visita e de início/término do veículo serão flexibilizados, mas cada visita vai permanecer vinculada ao mesmo veículo, e a sequência de visitas precisa ser respeitada: nenhuma visita pode ser inserida entre elas ou antes delas.
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD O mesmo que RELAX_VISIT_TIMES_AFTER_THRESHOLD, mas a sequência de visitas também é flexibilizada: 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 é flexibilizado: as visitas são totalmente livres 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. 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 waypoint.

heading

int32

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

OptimizeToursLongRunningMetadata

Esse tipo não tem campos.

Metadados de operação para chamadas OptimizeToursLongRunning.

OptimizeToursRequest

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

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

timeout

Duration

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

ShipmentModel

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

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, vehicle_index precisa estar no intervalo e não pode ser duplicado.
  • Para todas as visitas, shipment_index e visit_request_index 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, 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 será permitido se Shipment.allowed_vehicle_indices estiver vazio ou se o vehicle_index 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.

injected_solution_constraint

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.

refresh_details_routes[]

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 populate_polylines seja verdadeiro.

Os campos route_polyline dos trajetos transmitidos podem ser inconsistentes com o trajeto transitions.

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

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.

interpret_injected_solutions_using_labels

bool

Se for 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 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 vehicle_label 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 shipment_label 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.

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 nas ShipmentRoutes de resposta.

populate_transition_polylines

bool

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

allow_large_deadline_despite_interruption_risk

bool

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.

use_geodesic_distances

bool

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

label

string

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

geodesic_meters_per_second

double

Quando use_geodesic_distances é 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

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

SearchMode

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

Tipos enumerados
SEARCH_MODE_UNSPECIFIED Modo de pesquisa não especificado, equivalente a RETURN_FAST.
RETURN_FAST Interromper a pesquisa depois de encontrar a primeira boa solução.
CONSUME_ALL_AVAILABLE_TIME Gastar todo o tempo disponível para buscar soluções melhores.

SolvingMode

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

Tipos enumerados
DEFAULT_SOLVE Resolva o modelo. Os avisos podem ser emitidos em [OptimizeToursResponse.validation_errors][google.cloud.optimization.v1.OptimizeToursResponse.validation_errors].
VALIDATE_ONLY Apenas valida o modelo sem resolvê-lo: preenche o máximo possível de OptimizeToursResponse.validation_errors.
DETECT_SOME_INFEASIBLE_SHIPMENTS

Preenche apenas 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 todas as remessas inviáveis são retornadas aqui, mas apenas aquelas detectadas como inviáveis durante o pré-processamento.

TRANSFORM_AND_RETURN_REQUEST

Esse modo só funciona se ShipmentModel.objectives não estiver vazio. A solicitação não foi resolvida. Ele é apenas validado e preenchido com os custos correspondentes aos objetivos determinados. Consulte também a documentação de ShipmentModel.objectives. A solicitação resultante é retornada como OptimizeToursResponse.processed_request.

Experimental: consulte https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request para mais detalhes.

OptimizeToursResponse

Resposta após resolver um problema de otimização de trajeto que contém os trajetos seguidos por cada veículo, as remessas que foram ignoradas e o custo geral da solução.

Campos
routes[]

ShipmentRoute

Rotas calculadas para cada veículo. A i-ésima rota corresponde ao i-ésimo veículo no modelo.

request_label

string

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

skipped_shipments[]

SkippedShipment

A lista de todas as remessas ignoradas.

validation_errors[]

OptimizeToursValidationError

Lista de todos os erros de validação que conseguimos detectar de forma independente. Consulte a explicação "MULTIPLE ERRORS" para a mensagem OptimizeToursValidationError. Em vez de erros, isso vai incluir avisos se solving_mode for DEFAULT_SOLVE.

processed_request

OptimizeToursRequest

Em alguns casos, modificamos a solicitação recebida antes de resolvê-la, ou seja, adicionando custos. Se solving_mode == TRANSFORM_AND_RETURN_REQUEST, a solicitação modificada será retornada aqui.

Experimental: consulte https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request para mais detalhes.

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

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

skipped_mandatory_shipment_count

int32

Número de remessas obrigatórias ignoradas.

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

O horário de término mais recente para um veículo usado, calculado 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 ao custo. As chaves são caminhos de 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 na solução. Todos os custos definidos no modelo são informados em detalhes aqui, exceto os relacionados a TransitionAttributes, que são informados apenas de forma agregada a partir de janeiro de 2022.

total_cost

double

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

OptimizeToursUriMetadata

Esse tipo não tem campos.

Metadados de operação para chamadas OptimizeToursUri.

OptimizeToursUriRequest

Uma solicitação usada pelo método OptimizeToursUri.

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

input

Uri

Obrigatório. O URI do objeto do Cloud Storage que contém o OptimizeToursRequest.

output

Uri

Obrigatório. O URI do objeto do Cloud Storage que vai conter o OptimizeToursResponse.

OptimizeToursUriResponse

Uma resposta retornada pelo método OptimizeToursUri.

Campos
output

Uri

Opcional. O URI do objeto do Cloud Storage que contém o OptimizeToursResponse codificado como JSON ou textproto. Se o objeto foi codificado como JSON, a extensão do nome do objeto será .json. Se o objeto foi codificado como textproto, a extensão do nome do objeto será .txtpb.

O crc32_checksum do recurso pode ser usado para verificar se o conteúdo dele não foi modificado.

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 após esta seção 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 serão "fatais", o que significa que eles interrompem todo o processo de validação. Esse é o caso dos erros display_name="UNSPECIFIED", entre outros. Alguns erros podem fazer com que o processo de validação pule 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 determinada solicitação (inválida) gere um par (code, display_name) diferente 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, para se referir ao veículo nº 4 e à primeira coleta da remessa nº 2, faça o seguinte:

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 do erro.

error_message

string

String legível por humanos que descreve o erro. Há um mapeamento de 1:1 entre code e error_message (quando code != "UNSPECIFIED").

ESTABILIDADE: não estável. A mensagem de erro associada a um determinado code pode mudar (para esclarecer) ao longo do tempo. Use display_name e code.

offending_values

string

Pode conter os valores dos campos. Isso nem sempre está disponível. Não confie nele e use-o 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 nesse arquivo e segue a mesma estrutura hierárquica. Por exemplo, podemos especificar o elemento nº 2 de start_time_windows do veículo nº 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 evitar que a mensagem fique muito cheia.

Campos
name

string

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

sub_field

FieldReference

Subcampo aninhado 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 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 de 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 que precisam ser atendidas ao calcular rotas de veículos. Isso é semelhante a RouteModifiers na API Routes Preferred da Plataforma Google Maps. Consulte: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.

Campos
avoid_tolls

bool

Especifica se é preciso evitar vias com pedágio, quando possível. Será dada preferência a rotas que não contenham vias com pedágio. Aplica-se apenas a meios de transporte motorizados.

avoid_highways

bool

Especifica se é preciso evitar rodovias quando possível. A preferência será dada a rotas que não contenham rodovias. Aplica-se apenas a meios de transporte motorizados.

avoid_ferries

bool

Especifica se é preciso evitar balsas quando possível. Será dada preferência a rotas que não incluam viagens de balsa. Aplica-se apenas a meios de transporte motorizados.

avoid_indoor

bool

Opcional. Especifica se é preciso evitar a navegação em ambientes fechados quando possível. Será dada preferência a rotas que não contenham navegação interna. Aplicável apenas ao modo de viagem WALKING.

Envio

O envio de um único item, de uma das retiradas até uma das entregas. Para que a remessa seja considerada realizada, um veículo exclusivo precisa visitar um dos locais de retirada (e diminuir as capacidades de reserva de acordo) e, em seguida, visitar um dos locais de entrega (e, portanto, aumentar novamente as capacidades de reserva de acordo).

Campos
display_name

string

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

pickups[]

VisitRequest

Conjunto de alternativas de retirada associadas à remessa. Se não for especificado, o veículo só precisará 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ó precisará visitar um local correspondente às coletas.

load_demands

map<string, Load>

As demandas de carga da remessa (por exemplo, peso, volume, número de paletes etc.). As chaves no mapa precisam ser identificadores que descrevem o tipo de 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

O conjunto de veículos que podem realizar essa entrega. Se estiver vazio, todos os veículos poderão realizar a tarefa. Os veículos são fornecidos pelo índice na lista vehicles do ShipmentModel.

costs_per_vehicle[]

double

Especifica o custo incorrido quando essa remessa é 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á de veículos no modelo. O i-ésimo elemento 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 esses custos.

costs_per_vehicle_indices[]

int32

Índices dos veículos aos quais costs_per_vehicle se aplica. Se não estiver vazio, ele precisa 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 máximo absoluto de desvio em comparação com o caminho mais curto da retirada até a entrega. Se especificado, ele precisa ser não negativo, e a remessa precisa conter pelo menos uma retirada e uma entrega.

Por exemplo, considere t como o menor tempo necessário para ir da alternativa de retirada selecionada diretamente para a alternativa de entrega selecionada. Em seguida, a configuração de pickup_to_delivery_absolute_detour_limit aplica:

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

Se os limites relativos e absolutos forem especificados na mesma remessa, o limite mais restritivo será usado para cada par de retirada/entrega possível. Desde outubro de 2017, os desvios só são aceitos quando as durações de viagem não dependem de veículos.

pickup_to_delivery_time_limit

Duration

Especifica a duração máxima do início da retirada até o início da entrega de uma remessa. Se especificado, ele precisa ser não negativo, e a remessa precisa conter pelo menos uma retirada 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 "tipo" 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).

Diferente de visit_types, que é especificado para uma única visita: todas as coletas/entregas que pertencem à mesma remessa compartilham o mesmo shipment_type.

label

string

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

ignore

bool

Se for verdadeiro, pule esta remessa, mas não aplique um penalty_cost.

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

É permitido ignorar uma remessa realizada em injected_first_solution_routes ou injected_solution_constraint. O solucionador remove as visitas de retirada/entrega relacionadas da rota de realização. precedence_rules que se referem a remessas ignoradas também serão ignoradas.

penalty_cost

double

Se a remessa não for concluída, essa penalidade será adicionada ao custo geral das rotas. Uma remessa é considerada concluída 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 custo no modelo e precisa ser positivo.

IMPORTANTE: se essa penalidade não for especificada, ela será considerada infinita, ou seja, a remessa precisará ser concluída.

pickup_to_delivery_relative_detour_limit

double

Especifica o tempo máximo de desvio relativo em comparação com o trajeto mais curto da retirada até a entrega. Se especificado, ele precisa ser não negativo, e a remessa precisa conter pelo menos uma retirada e uma entrega.

Por exemplo, considere t como o menor tempo necessário para ir da alternativa de retirada selecionada diretamente para a alternativa de entrega selecionada. Em seguida, a configuração de pickup_to_delivery_relative_detour_limit aplica:

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 na mesma remessa, o limite mais restritivo será usado para cada par de retirada/entrega possível. Desde outubro de 2017, os desvios só são aceitos quando as durações de viagem não dependem de veículos.

Carregar

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

Campos
amount

int64

O valor pelo qual a carga do veículo que realiza a visita correspondente vai variar. Como é um número inteiro, recomendamos que os usuários escolham uma unidade adequada para evitar perda de precisão. Precisa ser ≥ 0.

VisitRequest

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

Campos
arrival_location

LatLng

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

arrival_waypoint

Waypoint

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

departure_location

LatLng

A localização geográfica de onde o veículo parte depois de concluir este VisitRequest. Pode ser omitido se for igual a arrival_location. Se o modelo de remessa tiver matrizes de distância de duração, departure_location não poderá ser especificado.

departure_waypoint

Waypoint

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

tags[]

string

Especifica as tags anexadas à solicitação de visita. Não é permitido usar strings vazias ou duplicadas.

time_windows[]

TimeWindow

Janelas de tempo que restringem o horário de chegada em uma visita. Um veículo pode sair 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 horário. 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 separadas, 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 (a ser adicionado ao possível tempo de espera; consulte time_windows).

cost

double

Custo para atender a essa 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 uma remessa. Esse custo precisa estar na mesma unidade que Shipment.penalty_cost e não pode ser negativo.

load_demands

map<string, Load>

Carregue as demandas dessa solicitação de visita. É igual ao campo Shipment.load_demands, mas se aplica apenas a este 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 o tempo extra necessário para um veículo concluir a 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.

avoid_u_turns

bool

Especifica se as conversões em U devem ser evitadas em trajetos de carro nesse local. A prevenção de retornos é feita da melhor forma possível, e não há garantia de que eles serão totalmente evitados. Este é um recurso experimental, e o comportamento está sujeito a mudanças.

Experimental: consulte https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request para mais detalhes.

ShipmentModel

Um modelo de remessa contém um conjunto de remessas que precisam ser realizadas por um conjunto de veículos, minimizando o custo geral, que é a soma de:

  • o custo de roteamento dos veículos (soma do custo por tempo total, custo por tempo de viagem e custo fixo de todos os veículos).
  • as penalidades por envio não realizado.
  • o custo da duração global das remessas
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.

objectives[]

Objective

O conjunto de objetivos para esse modelo, que vamos transformar em custos. Se não estiver vazio, o modelo de entrada não poderá ter custo. Para receber a solicitação modificada, use solving_mode = TRANSFORM_AND_RETURN_REQUEST. Nesse caso, a solicitação não será resolvida. Consulte a documentação correspondente.

Experimental: consulte https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request para mais detalhes.

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 menor que um ano, ou seja, o global_end_time e o global_start_time precisam estar dentro de 31.536. 000 segundos um do outro.

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

global_end_time

Timestamp

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

global_duration_cost_per_hour

double

A "duração global" do plano geral é a diferença entre o horário de início efetivo mais cedo e o horário de término efetivo mais tarde 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 job, 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 usadas, 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.
  • 1 veículo que começa o trajeto em locA e termina em locA.
  • 1 solicitação de visita de retirada no 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.
  • 1 veículo que inicia o trajeto em locA e termina em locB, usando a matriz "fast".
  • 1 veículo que começa o trajeto em locB e termina em locB, usando a matriz "slow".
  • 1 veículo que inicia o trajeto em locB e termina em locB, usando a matriz "fast".
  • 1 pedido de visita para retirada no 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 as durações e distâncias das 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 determinado 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 as mesmas. Todas as tags precisam ser diferentes e não podem ser strings vazias. Se esse campo não estiver vazio, duration_distance_matrices não poderá estar vazio.

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 (resp. 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 determinado 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 as mesmas. Todas as tags precisam ser diferentes e não podem ser strings vazias. Se esse campo não estiver vazio, duration_distance_matrices não poderá estar vazio.

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.

IMPORTANTE: o uso de regras de precedência limita o tamanho do problema que pode ser otimizado. As solicitações que usam regras de precedência com muitas remessas podem ser rejeitadas.

max_active_vehicles

int32

Restringe o número máximo de veículos ativos. Um veículo estará ativo se o trajeto dele realizar pelo menos uma entrega. Isso pode ser usado para limitar o número de trajetos quando há menos motoristas do que veículos e a frota de veículos é heterogênea. A otimização vai selecionar o melhor subconjunto de veículos para usar. Precisa ser estritamente positivo.

DurationDistanceMatrix

Especifica uma matriz de duração e distância dos locais de início da visita e do veículo até os locais de 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 o mesmo número de elementos que 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 única 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 somente 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 de uma determinada linha. Ele precisa ter o mesmo número de elementos que ShipmentModel.duration_distance_matrix_dst_tags.

meters[]

double

Valores de distância para uma determinada linha. Se nenhum custo ou restrição se referir a distâncias no modelo, esse campo poderá ser deixado em branco. Caso contrário, ele precisará ter tantos elementos quanto durations.

Objetivo

Os objetivos substituem completamente o modelo de custo e, portanto, são incompatíveis com os custos preexistentes. Cada objetivo é associado a um número de custos predefinidos, por exemplo, para veículos, remessas ou atributos de transição.

Experimental: consulte https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request para mais detalhes.

Campos
type

Type

O tipo do objetivo.

weight

double

Quanto esse objetivo deve contar em relação aos outros. Pode ser qualquer número não negativo. Os pesos não precisam somar 1. Os pesos padrão são 1,0.

Tipo

O tipo de objetivo que será mapeado para um conjunto de custos.

Tipos enumerados
DEFAULT Um conjunto padrão de custos será usado para garantir uma solução razoável. Observação: esse objetivo pode ser usado sozinho, mas também será sempre adicionado com peso 1,0, como referência, aos objetivos especificados pelo usuário, se ainda não estiver presente.
MIN_DISTANCE "MIN". Minimizar a distância total percorrida.
MIN_WORKING_TIME Minimizar o tempo total de trabalho, somado em todos os veículos.
MIN_TRAVEL_TIME Igual ao anterior, mas com foco apenas no tempo de viagem.
MIN_NUM_VEHICLES Minimizar o número de veículos usados.

PrecedenceRule

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

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ó se aplicam quando as duas remessas são realizadas e, caso contrário, são ignoradas.

Campos
first_is_delivery

bool

Indica se o "primeiro" evento é 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. Pode ser negativo.

first_index

int32

Índice de remessa do "primeiro" evento. Este campo precisa ser especificado.

second_index

int32

Índice de envio do "segundo" evento. Este campo precisa ser especificado.

ShipmentRoute

A rota de um veículo pode ser decomposta, ao longo do eixo do tempo, da seguinte maneira (considerando 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 fazemos 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 (também conhecidos como chegada e partida). Eles acontecem em um determinado segundo.
  • "intervalos de tempo", como as próprias visitas e a transição entre elas. Embora os intervalos de tempo às vezes possam ter duração zero, ou seja, começar e terminar 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 antes dela (mesmo índice) e uma transição depois dela (índice + 1).
  • A partida do veículo é sempre seguida pela transição #0.
  • O fim do veículo é sempre precedido pela transição #n.

Vamos analisar o que acontece durante um Transition e um 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, veja 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 imediatamente antes da próxima visita (ou do fim do veículo). Portanto, basta saber a duração do atraso para saber o horário de início e término.
  • Os BREAKS são períodos 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": podem ser interrompidos várias vezes durante essa transição. Os clientes podem presumir que a viagem acontece "o mais rápido possível" e que a "espera" preenche o tempo restante.

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 está fazendo o trajeto, identificado pelo índice na origem ShipmentModel.

vehicle_label

string

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

vehicle_start_time

Timestamp

Horário em que o veículo inicia o trajeto.

vehicle_end_time

Timestamp

Horário em que o veículo termina o trajeto.

visits[]

Visit

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

transitions[]

Transition

Lista ordenada de transições para o trajeto.

has_traffic_infeasibilities

bool

Quando OptimizeToursRequest.consider_road_traffic é definido como verdadeiro, esse campo indica que as inconsistências nos horários das rotas são previstas usando estimativas de duração de viagem com base no trânsito. Pode não haver tempo suficiente para concluir viagens, atrasos e pausas ajustados ao trânsito entre as visitas, antes da primeira visita ou depois da última, sem deixar de atender às janelas de tempo 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 depois da janela de tempo atual devido ao aumento da estimativa de tempo de viagem travel_duration(previous_visit, next_visit) por causa do trânsito. Além disso, uma pausa pode ser forçada a se sobrepor a uma visita devido a um aumento nas estimativas de tempo de viagem e às restrições de janela de tempo de visita ou pausa.

route_polyline

EncodedPolyline

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

breaks[]

Break

Intervalos programados para o veículo que está fazendo esse trajeto. 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 esse trajeto. Os campos de AggregatedMetrics são somados em todos os ShipmentRoute.transitions ou ShipmentRoute.visits, dependendo do contexto.

vehicle_fullness

VehicleFullness

Campo VehicleFullness para calcular a proximidade das métricas limitadas em relação aos respectivos limites do veículo. Os campos são proporções entre um campo de métrica limitado (por exemplo, AggregatedMetrics.travel_distance_meters) e o limite de veículo relacionado (por exemplo, Vehicle.route_distance_limit).

Experimental: o comportamento ou a existência desse campo pode mudar no futuro.

route_costs

map<string, double>

Custo do trajeto, detalhado por campos de solicitação relacionados ao custo. As chaves são caminhos de proto, relativos ao OptimizeToursRequest de entrada, 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 relacionados a TransitionAttributes, que são informados apenas de forma agregada a partir de janeiro de 2022.

route_total_cost

double

Custo total do trajeto. A soma de todos os custos no mapa de custos.

Intervalo

Dados que representam a execução de um intervalo.

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. Para mais informações sobre a codificação de polilinhas, acesse: 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 no trajeto. Consulte a descrição de ShipmentRoute.

Se o veículo não tiver um 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ânsito é solicitado via OptimizeToursRequest.consider_road_traffic e as informações de trânsito não podem ser recuperadas para um Transition, esse booleano é definido como verdadeiro. Isso pode ser temporário (um problema raro nos servidores de trânsito em tempo real) ou permanente (não há dados 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 dos intervalos que ocorrem durante essa transição, se houver. Os detalhes sobre o horário de início e a duração de cada intervalo são armazenados em ShipmentRoute.breaks.

wait_duration

Duration

Tempo de espera durante essa transição. A duração da espera corresponde ao tempo ocioso e não inclui o tempo de pausa. 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 facilitar. É igual a:

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

Timestamp

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

route_polyline

EncodedPolyline

A representação de polilinha codificada do trajeto seguido durante a transição. Este 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 o trajeto durante a navegação e, em caso de novo trajeto, respeitar a intenção original de quando o trajeto foi criado. Trate esse token como um blob opaco. Não compare o valor dele entre as solicitações, porque ele pode mudar mesmo que o serviço retorne exatamente o mesmo trajeto. Este campo só será preenchido se populate_transition_polylines estiver definido como verdadeiro.

vehicle_loads

map<string, VehicleLoad>

Cargas do veículo durante essa transição, para cada tipo que aparece no Vehicle.load_limits desse veículo ou que tem Shipment.load_demands diferente de zero em alguma entrega realizada nessa rota.

As cargas durante a primeira transição são as cargas iniciais do trajeto do veículo. Em seguida, após cada visita, as load_demands da visita são adicionadas ou subtraídas 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.

Acessar

Uma visita realizada durante um trajeto. Essa visita corresponde a uma retirada ou entrega de um Shipment.

Campos
shipment_index

int32

Índice do campo shipments na origem ShipmentModel.

is_pickup

bool

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

visit_request_index

int32

Índice de VisitRequest no campo de retirada ou entrega de 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 visita como a soma da remessa e da solicitação de visita load_demands. Os valores serão negativos se a visita for uma entrega. As demandas são informadas para os mesmos tipos que o Transition.loads (consulte esse campo).

detour

Duration

Tempo extra de desvio devido às remessas visitadas 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 com base na 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 será calculado com base no start_location do veículo e será 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.

visit_type

VisitType

Opcional. Especifica o tipo de visita. Substitui o campo Visit.is_pickup.

injected_solution_location_token

int32

Um token opaco que representa informações sobre um local de visita.

Esse campo pode ser preenchido nas visitas das rotas de resultado quando VisitRequest.avoid_u_turns foi definido como verdadeiro para essa visita ou se ShipmentModel.avoid_u_turns foi definido como verdadeiro na solicitação OptimizeToursRequest.

Experimental: consulte https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request para mais detalhes.

VisitType

Indica se a visita é uma retirada, uma entrega ou uma visita a um Stop. As visitas a uma parada são usadas apenas quando a otimização multimodal está ativada.

Tipos enumerados
VISIT_TYPE_UNSPECIFIED Tipo de visita não especificado.
PICKUP_SHIPMENT A visita corresponde à retirada de uma remessa.
DELIVER_SHIPMENT A visita corresponde a uma entrega de remessa.

ShipmentTypeIncompatibility

Especifica incompatibilidades entre remessas dependendo do shipment_type. A exibição de remessas incompatíveis na mesma rota é restrita com base no modo de incompatibilidade.

Campos
types[]

string

Lista de tipos incompatíveis. Duas remessas com shipment_types diferentes entre as listadas 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.

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

Nesse modo, duas remessas com tipos incompatíveis nunca podem estar no mesmo veículo ao mesmo tempo:

  • Eles só podem compartilhar o mesmo veículo se um for entregue antes de o outro ser retirado.
  • Quando as duas remessas são apenas de retirada (sem entregas) ou apenas de entrega (sem retiradas), elas não podem compartilhar o mesmo veículo.

ShipmentTypeRequirement

Especifica os requisitos entre as remessas 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

Todas as remessas com um tipo no campo dependent_shipment_types exigem que pelo menos uma remessa do tipo required_shipment_type_alternatives seja visitada na mesma rota.

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.

Tipos enumerados
REQUIREMENT_MODE_UNSPECIFIED Modo de requisito não especificado. Esse valor nunca pode ser usado.
PERFORMED_BY_SAME_VEHICLE Nesse modo, todas as remessas "dependentes" precisam compartilhar o mesmo veículo que pelo menos uma das remessas "obrigatórias".
IN_SAME_VEHICLE_AT_PICKUP_TIME

Com o modo IN_SAME_VEHICLE_AT_PICKUP_TIME, todas as remessas "dependentes" precisam ter pelo menos uma remessa "obrigatória" no veículo no momento da retirada.

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

  • Uma remessa "obrigatória" somente de entrega feita na rota depois ou
  • Uma remessa "obrigatória" coletada na rota antes dela e, se a remessa "obrigatória" tiver uma entrega, ela precisará ser realizada após a coleta da remessa "dependente".
IN_SAME_VEHICLE_AT_DELIVERY_TIME Igual ao anterior, exceto que as remessas "dependentes" precisam ter uma remessa "obrigatória" no veículo no momento da entrega.

SkippedShipment

Especifica detalhes de remessas não realizadas em uma solução. Para casos simples e/ou se pudermos identificar a causa da omissão, informamos o motivo aqui.

Campos
index

int32

O índice corresponde ao índice da remessa na origem ShipmentModel.

label

string

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

reasons[]

Reason

Uma lista de motivos que explicam por que a remessa foi ignorada. Veja o comentário acima Reason. Se não for possível entender por que uma remessa foi ignorada, os motivos não serão definidos.

penalty_cost

double

Esta é uma cópia do Shipment.penalty_cost, incluída aqui para facilitar a visualização da gravidade de um envio ignorado.

Experimental: o comportamento ou a existência desse campo pode mudar no futuro.

estimated_incompatible_vehicle_ratio

double

Proporção estimada de veículos que não podem realizar essa entrega por pelo menos um dos motivos abaixo. Observação: isso só é preenchido quando os motivos envolvem um veículo.

Experimental: o comportamento ou a existência desse campo pode mudar no futuro.

Motivo

Se pudermos explicar por que o envio foi ignorado, 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. Uma remessa ignorada não pode ter motivos duplicados, ou seja, em que 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 ignorada é incompatível com todos os veículos. Os motivos podem ser diferentes para todos os veículos, mas pelo menos um veículo excederia a capacidade de "Maçãs" (incluindo o veículo 1), pelo menos um veículo excederia a capacidade de "Peras" (incluindo o veículo 3) e pelo menos um veículo excederia o limite de distância (incluindo o veículo 1).

Campos
code

Code

Consulte os comentários do código.

example_vehicle_indices[]

int32

Igual a example_vehicle_index, mas fornecemos a lista de vários veículos identificados. Esta lista não é necessariamente completa. Isso só será preenchido se [fill_example_vehicle_indices_in_skipped_reasons][] for verdadeiro.

Experimental: o comportamento ou a existência desse campo pode mudar no futuro.

example_exceeded_capacity_type

string

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

example_vehicle_index

int32

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

Código

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

Tipos enumerados
CODE_UNSPECIFIED Isso nunca deve ser usado.
NO_VEHICLE Não há veículo no modelo, o que torna todas as remessas inviáveis.
DEMAND_EXCEEDS_VEHICLE_CAPACITY A demanda da remessa excede a capacidade de um veículo para alguns tipos de capacidade, um dos quais é example_exceeded_capacity_type.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT

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

Para esse cálculo, usamos as distâncias geodésicas.

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT

O tempo mínimo necessário para realizar essa remessa, 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/h).

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT Igual ao anterior, 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 essa remessa no melhor cenário (consulte CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT para o cálculo do tempo) se começar no horário de início mais cedo: o tempo total faria com que o veículo terminasse após o horário de término mais tarde.
VEHICLE_NOT_ALLOWED O campo allowed_vehicle_indices da remessa não está vazio, e este veículo não pertence a ela.
VEHICLE_IGNORED

O campo ignore do veículo é verdadeiro.

Experimental: o comportamento ou a existência desse campo pode mudar no futuro.

SHIPMENT_IGNORED

O campo ignore da remessa é verdadeiro.

Experimental: o comportamento ou a existência desse campo pode mudar no futuro.

SKIPPED_IN_INJECTED_SOLUTION_CONSTRAINT

A remessa é ignorada no injected_solution_constraint.

Experimental: o comportamento ou a existência desse campo pode mudar no futuro.

VEHICLE_ROUTE_IS_FULLY_SEQUENCE_CONSTRAINED

A flexibilização da rota do veículo especificada em injected_solution_constraint não permite a inserção de visitas.

Experimental: o comportamento ou a existência desse campo pode mudar no futuro.

ZERO_PENALTY_COST

A remessa tem um custo de penalidade zero. Embora isso possa ser útil como uma opção de modelagem avançada, também pode explicar por que uma remessa foi ignorada.

Experimental: o comportamento ou a existência desse campo pode mudar no futuro.

TimeWindow

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

Os limites rígidos de 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 do horário de início flexível em que o evento ocorre. O limite superior da janela de tempo flexível, soft_end_time, expressa uma preferência para que o evento ocorra até soft_end_time, incorrendo em um custo proporcional ao tempo que o evento ocorre 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ígida. Se não for especificado, ele será definido como ShipmentModel.global_start_time.

end_time

Timestamp

O horário de término do período rígido. Se não for especificado, ele 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 de tempo.

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 atributos de transições entre duas visitas consecutivas em um trajeto. Vários TransitionAttributes podem ser aplicados à 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 natural "AND").

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 de veículo corresponde se o VisitRequest.tags ou Vehicle.start_tags contém src_tag ou não contém excluded_src_tag (dependendo de qual desses dois campos não está vazio).

excluded_src_tag

string

Consulte src_tag. Exatamente um dos campos src_tag e excluded_src_tag precisa ser preenchido.

dst_tag

string

Uma visita de destino ou um fim de veículo corresponderá se, e somente se, o VisitRequest.tags ou o Vehicle.end_tags contiver dst_tag ou não contiver excluded_dst_tag (dependendo de qual desses dois campos não estiver vazio).

excluded_dst_tag

string

Consulte dst_tag. Exatamente um dos campos dst_tag e excluded_dst_tag precisa ser preenchido.

cost

double

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

cost_per_kilometer

double

Especifica um custo por quilômetro aplicado à distância percorrida durante a transição. Ele é adicionado a qualquer Vehicle.cost_per_kilometer especificado nos veículos.

distance_limit

DistanceLimit

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

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

delay

Duration

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

Esse atraso sempre ocorre depois de terminar a visita de origem e antes de iniciar a visita de destino.

URI

Um identificador de recurso universal que aponta para um recurso que pode ser lido e gravado pela API Route Optimization.

Campos
uri

string

O URI do recurso. Talvez o recurso ainda não exista.

O conteúdo do recurso é codificado como JSON ou textproto. Somente os recursos do Google Cloud Storage são compatíveis. Se o recurso estiver codificado como JSON, o nome dele precisará ter o sufixo .json. Se o recurso for codificado como textproto, o nome do recurso precisará ter o sufixo .txtpb. Por exemplo, um URI do Google Cloud Storage para um arquivo codificado em JSON pode ser assim: gs://bucket/path/input/object.json.

Veículo

Modelos de um veículo em um problema de envio. Resolver um problema de envio vai criar um trajeto que começa em start_location e termina em end_location para este 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 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 que afetam a forma como os trajetos são calculados para o veículo em questão.

start_location

LatLng

Localização geográfica em que o veículo começa antes de coletar as remessas. Se não for especificado, o veículo vai começar na primeira retirada. Se o modelo de remessa tiver matrizes de duração e distância, start_location não poderá ser especificado.

start_waypoint

Waypoint

Waypoint que representa uma localização geográfica em que o veículo começa antes de retirar as remessas. Se nem start_waypoint nem start_location forem especificados, o veículo vai começar na primeira retirada. Se o modelo de remessa tiver matrizes de duração e distância, start_waypoint não poderá ser especificado.

end_location

LatLng

Localização geográfica em que o veículo termina depois de concluir o último VisitRequest. Se não for especificado, o ShipmentRoute do veículo vai terminar imediatamente quando ele concluir o último VisitRequest. Se o modelo de remessa tiver matrizes de duração e distância, end_location não poderá ser especificado.

end_waypoint

Waypoint

Waypoint que representa uma localização geográfica 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 vai terminar imediatamente quando ele concluir o último VisitRequest. Se o modelo de remessa 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.

Não é permitido usar strings vazias ou duplicadas.

end_tags[]

string

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

Não é permitido usar strings vazias ou duplicadas.

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 de tempo globais.

As janelas de tempo que pertencem ao mesmo campo repetido precisam ser separadas, 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 de tempo globais.

As janelas de tempo que pertencem ao mesmo campo repetido precisam ser separadas, 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 descarga 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 desse 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 do trajeto do veículo. Esse custo é aplicado ao tempo total gasto na rota e inclui o tempo de viagem, de espera e de visita. Usar cost_per_hour em vez de apenas cost_per_traveled_hour pode resultar em latência adicional.

cost_per_traveled_hour

double

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

cost_per_kilometer

double

Custo por quilômetro do trajeto 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 até o departure_location de um único VisitRequest.

fixed_cost

double

Custo fixo aplicado se este veículo for usado para processar uma remessa.

used_if_route_is_empty

bool

Esse campo só se aplica a veículos quando o trajeto deles não atende a nenhuma remessa. Indica se o veículo deve ser considerado como usado ou não nesse caso.

Se for verdadeiro, o veículo vai do local de início ao local de término, mesmo que não atenda a nenhuma remessa, e os custos de tempo e distância resultantes da viagem de início --> término são considerados.

Caso contrário, ele não vai do local de início ao de término, e nenhum break_rule ou atraso (de TransitionAttributes) é programado para esse veículo. 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 do trajeto do veículo. Em uma determinada OptimizeToursResponse, a duração do trajeto de um veículo é a diferença entre vehicle_end_time e vehicle_start_time.

travel_duration_limit

DurationLimit

Limite aplicado à duração do trajeto 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 do trajeto do veículo. Em um determinado OptimizeToursResponse, a distância do trajeto é a soma de todos os transitions.travel_distance_meters.

extra_visit_duration_for_visit_type

map<string, Duration>

Especifica um mapa de strings visit_types para durações. A duração é o tempo além de VisitRequest.duration a ser considerado nas visitas com o visit_types especificado. Essa duração extra da visita adiciona custo se cost_per_hour for especificado. As chaves (ou seja, 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 este veículo. Se estiver vazio, nenhum intervalo será programado 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 precisará ser falso, e o veículo não será usado.

Se uma remessa for realizada por um veículo ignorado em injected_first_solution_routes, ela será ignorada na primeira solução, mas poderá ser realizada na resposta.

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

travel_duration_multiple

double

Especifica um fator multiplicativo 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 múltiplo não afeta a duração das visitas. Ele afeta o custo se cost_per_hour ou cost_per_traveled_hour estiverem especificados. Precisa estar no intervalo [0,001, 1000,0]. Se não for definido, o veículo será padrão, e esse múltiplo será considerado 1,0.

AVISO: 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 uma 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 rígido ou flexível.

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 para ser no máximo max_duration.

soft_max_duration

Duration

Um limite flexível que não impõe um limite de duração máxima, mas que, quando violado, faz com que o trajeto tenha um custo. Esse custo é adicionado 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 for definido, soft_max_duration precisará ser menor que max_duration.

quadratic_soft_max_duration

Duration

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

Se quadratic_soft_max_duration estiver definido, as seguintes condições precisarão ser atendidas:

  • Não pode ser negativo.
  • max_duration precisa ser definido.
  • quadratic_soft_max_duration precisa ser menor que max_duration.
  • A diferença não pode 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, conforme indicado abaixo:

  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, conforme indicado abaixo:

  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 que se aplica 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 do trajeto desse 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. Os limites flexíveis só podem ser definidos em tipos que se aplicam apenas a retiradas ou apenas a entregas em todo o modelo.

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 final do trajeto.

max_load

int64

A quantidade máxima aceitável de carga.

cost_per_kilometer

LoadCost

Custo de mover uma unidade de carga por um quilômetro para este veículo. Isso pode ser usado como um proxy para o consumo de combustível: se a carga for um peso (em Newtons), então carga*quilômetro terá a dimensão de uma energia.

Experimental: consulte https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request para mais detalhes.

cost_per_traveled_hour

LoadCost

Custo de viajar com uma unidade de carga durante uma hora para este veículo.

Experimental: consulte https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request para mais detalhes.

Intervalo

Intervalo de quantidades 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 especificada, a carga máxima não será restrita por esta mensagem. Se ambos forem especificados, min precisa ser ≤ max.

LoadCost

Custo de mover uma unidade de carga durante um Transition. Para uma determinada carga, o custo é a soma de duas partes:

  • min(load, load_threshold) * cost_per_unit_below_threshold
  • max(0, load - load_threshold) * cost_per_unit_above_threshold

Com esse custo, as soluções preferem entregar as demandas altas primeiro ou, de forma equivalente, retirar as demandas altas por último. Por exemplo, se um veículo tiver

load_limit {
  key: "weight"
  value {
    cost_per_kilometer {
      load_threshold: 15
      cost_per_unit_below_threshold: 2.0
      cost_per_unit_above_threshold: 10.0
    }
  }
}

e o trajeto é início,retirada,retirada,entrega,entrega,fim com as transições:

transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 20 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }

então o custo incorrido por esse LoadCost é (cost_below * load_below * quilômetros + cost_above * load_above * kms)

  • transição 0: 0,0
  • transição 1: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
  • transição 2: 2,0 * 15 * 1,0 + 10,0 * (20 - 15) * 1,0 = 80,0
  • transição 3: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
  • transição 4: 0,0

Portanto, o LoadCost sobre o trajeto é 120,0.

No entanto, se o trajeto for início,retirada,entrega,retirada,entrega,fim com transições:

transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }

o custo incorrido por esse LoadCost é

  • transição 0: 0,0
  • transição 1: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
  • transição 2: 0,0
  • transição 3: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
  • transição 4: 0,0

Aqui, o LoadCost no trajeto é 40,0.

LoadCost torna as soluções com transições pesadas mais caras.

Experimental: consulte https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request para mais detalhes.

Campos
load_threshold

int64

Quantidade de carga acima da qual o custo de movimentação de uma unidade de carga muda de cost_per_unit_below_threshold para cost_per_unit_above_threshold. Precisa ser >= 0.

cost_per_unit_below_threshold

double

Custo de mover uma unidade de carga, para cada unidade entre 0 e o limite. Precisa ser um valor finito e >= 0.

cost_per_unit_above_threshold

double

Custo de mover uma unidade de carga para cada unidade acima do limite. No caso especial de limite = 0, esse é um custo fixo por unidade. Precisa ser um valor finito e >= 0.

TravelMode

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

Eles precisam ser um subconjunto dos meios de transporte da API Routes da Plataforma Google Maps. Consulte: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteTravelMode

Observação: as rotas de WALKING estão na versão Beta e, às vezes, podem não ter calçadas ou caminhos claros para pedestres. Esse aviso precisa ser mostrado ao usuário em todos os trajetos a pé exibidos no seu app.

Tipos enumerados
TRAVEL_MODE_UNSPECIFIED Meio de transporte não especificado, equivalente a DRIVING.
DRIVING Modo de viagem correspondente às rotas de carro.
WALKING Meio de transporte correspondente a rotas a pé.

UnloadingPolicy

Política sobre como um veículo pode ser descarregado. Aplica-se apenas a remessas que têm uma retirada e uma entrega.

Outras remessas podem ocorrer em qualquer lugar do trajeto, independentemente de unloading_policy.

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

VehicleFullness

VehicleFullness é uma métrica que calcula o nível de ocupação de um veículo. Cada campo VehicleFullness está entre 0 e 1, calculado como a proporção entre um campo de métrica limitado (por exemplo, AggregatedMetrics.travel_distance_meters) e o limite do veículo relacionado (por exemplo, Vehicle.route_distance_limit), se houver. Caso contrário, a proporção de preenchimento não será definida. Se o limite for 0, o campo será definido como 1. Observação: quando uma rota está sujeita a inviabilidades de tráfego, algumas proporções de lotação bruta podem exceder 1,0. Por exemplo, o veículo pode exceder o limite de distância. Nesses casos, limitamos os valores de preenchimento em 1,0.

Campos
max_fullness

double

Máximo de todos os outros campos nesta mensagem.

distance

double

A proporção entre AggregatedMetrics.travel_distance_meters e Vehicle.route_distance_limit. Se Vehicle.route_distance_limit não estiver definido, esse campo não será definido.

travel_duration

double

A proporção entre [AggregatedMetrics.travel_duration_seconds][] e Vehicle.travel_duration_limit. Se Vehicle.travel_duration_limit não estiver definido, esse campo não será definido.

active_duration

double

A proporção entre [AggregatedMetrics.total_duration_seconds][] e Vehicle.route_duration_limit. Se Vehicle.route_duration_limit não estiver definido, esse campo não será definido.

max_load

double

A proporção máxima entre todos os tipos de [AggregatedMetrics.max_load][] e os respectivos Vehicle.load_limits. Se todos os campos Vehicle.load_limits não estiverem definidos, este campo também não estará.

active_span

double

A proporção (vehicle_end_time - vehicle_start_time) / (latest_vehicle_end_time - earliest_vehicle_start_time) para um determinado veículo. Se o denominador não estiver presente, ele usará (ShipmentModel.global_end_time - ShipmentModel.global_start_time).

Ponto de referência

Encapsula um waypoint. Os waypoints marcam os locais de chegada e partida de VisitRequests e os locais de início e término de Vehicles.

Campos
side_of_road

bool

Opcional. Indica que o local desse waypoint deve ter uma preferência para que o veículo pare em um lado específico da via. Quando você define esse valor, o trajeto passa pelo local para que o veículo possa parar no lado da via em que o local está, em relação ao centro da via. Essa opção não funciona para o modo de viagem "A PÉ".

vehicle_stopover

bool

Indica que o waypoint é um local de parada para veículos, com o objetivo de embarque ou desembarque. Essa opção funciona apenas para o modo de viagem "DRIVING" e quando "location_type" é "location".

Experimental: o comportamento ou a existência desse campo pode mudar no futuro.

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 rumo opcional.

place_id

string

O ID de lugar do PDIs associado ao ponto de referência.

Ao usar um ID de lugar para especificar o local de chegada ou partida de um VisitRequest, use um ID de lugar que seja específico o suficiente para determinar um local LatLng para navegação até o lugar. Por exemplo, um ID de lugar que representa um edifício é adequado, mas um que representa uma estrada não é recomendado.