Package google.maps.routeoptimization.v1

Índice

RouteOptimization

Um serviço para otimizar passeios em veículos.

Validade de certos tipos de campos:

  • google.protobuf.Timestamp
    • Os horários estão no formato Unix: segundos desde 1970-01-01T00:00:00+00:00.
    • os segundos devem estar em [0, 253402300799], ou seja, em [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • nanos precisam ser desfeitos ou definidos como 0.
  • google.protobuf.Duration
    • os segundos devem estar em [0, 253402300799], ou seja, em [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • O valor de nanos precisa ser redefinido ou definido como 0.
  • google.type.LatLng
    • a latitude deve estar em [-90.0, 90.0].
    • e a longitude deve estar em [-180,0, 180,0].
    • pelo menos uma das latitudes e longitudes deve ser diferente de zero.
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

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

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

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

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

Se o campo done da LRO for verdadeiro, todas as solicitações foram processadas. Os resultados de todas as solicitações processadas com sucesso vão estar disponíveis no GCS. As solicitações com falha não terão os resultados disponíveis no GCS. 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 uma OptimizeToursRequest que contém uma ShipmentModel e retorna uma OptimizeToursResponse que contém ShipmentRoutes, que são um conjunto de rotas a serem realizadas por veículos, minimizando o custo geral.

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

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

Escopos de autorização

Requer o seguinte escopo OAuth:

  • https://www.googleapis.com/auth/cloud-platform
Permissões do IAM

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

  • routeoptimization.locations.use

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

AggregatedMetrics

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

Campos
performed_shipment_count

int32

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

travel_duration

Duration

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

wait_duration

Duration

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

delay_duration

Duration

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

break_duration

Duration

Duração total do intervalo de um trajeto 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 uma rota ou solução.

max_loads

map<string, VehicleLoad>

Carga máxima alcançada em todo o trajeto (solução resp.) para cada uma das quantidades nesse trajeto (solução resp.), calculada como a máxima sobre todas as Transition.vehicle_loads (resp. ShipmentRoute.metrics.max_loads.

BatchOptimizeToursMetadata

Esse tipo não tem campos.

Metadados da operação para chamadas BatchOptimizeToursRequest.

BatchOptimizeToursRequest

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

Campos
parent

string

Obrigatório. Segmente o projeto e o local para fazer uma chamada.

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

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

model_configs[]

AsyncModelConfig

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

AsyncModelConfig

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

Campos
display_name

string

Opcional. Nome de modelo definido pelo usuário. Pode ser utilizado como alias pelos usuários para acompanhar modelos.

input_config

InputConfig

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

output_config

OutputConfig

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

BatchOptimizeToursResponse

Esse tipo não tem campos.

Resposta a um BatchOptimizeToursRequest. É retornado na operação de longa duração após a conclusão da operação.

BreakRule

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

  • durante o percurso entre duas visitas (que inclui o tempo logo antes ou logo depois de uma visita, mas não no meio de uma visita). Nesse caso, o tempo em trânsito correspondente entre as visitas é estendido.
  • ou antes de ligar o veículo (não é possível ligar no meio de um intervalo). Nesse caso, isso não afeta o horário de início do veículo.
  • ou depois do fim do veículo (idto, com o horário de término do veículo).
Campos
break_requests[]

BreakRequest

Sequência de intervalos. Consulte a mensagem BreakRequest.

frequency_constraints[]

FrequencyConstraint

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

BreakRequest

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

Campos
earliest_start_time

Timestamp

Obrigatório. Limite inferior (inclusive) no início do intervalo.

latest_start_time

Timestamp

Obrigatório. Limite superior (inclusive) 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, como "É preciso fazer um intervalo de pelo menos 1 hora a cada 12 horas". Supondo que isso possa ser interpretado como "Em qualquer janela de tempo deslizante de 12h, deve haver pelo menos um intervalo de pelo menos uma hora", esse exemplo seria convertido no 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 respeitarão todas essas restrições, além das janelas de tempo e durações mínimas já especificadas no BreakRequest.

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

  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 esta restrição. Não negativo. Veja a descrição de FrequencyConstraint.

max_inter_break_duration

Duration

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

DataFormat

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

Enums
DATA_FORMAT_UNSPECIFIED Valor inválido. O formato não pode ser UNSPECIFIED.
JSON JavaScript Object Notation.
PROTO_TEXT Formato de texto dos 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. Pode ser dura ou mole.

Se um limite flexível for definido, tanto soft_max_meters quanto 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 a ser no máximo max_meters. O limite não pode ser negativo.

soft_max_meters

int64

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

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

cost_per_kilometer_below_soft_max

double

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

  min(distance_meters, soft_max_meters) / 1000.0 *
  cost_per_kilometer_below_soft_max.

Este custo não é suportado 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.

Campos
routes[]

ShipmentRoute

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

skipped_shipments[]

SkippedShipment

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

constraint_relaxations[]

ConstraintRelaxation

Para zero ou mais grupos de veículos, especifica quando e quanto relaxar as restrições. Se este campo estiver vazio, todos os trajetos de veículos não vazios serão totalmente restritos.

ConstraintRelaxation

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

Campos
relaxations[]

Relaxation

Todos os relaxamentos de restrição de visitas que serão aplicados às visitas nos trajetos com veículos em vehicle_indices.

vehicle_indices[]

int32

Especifica os índices do veículo aos quais a restrição de visita relaxations se aplica. Se estiver vazio, será considerado o padrão, e a relaxations será aplicada a todos os veículos não especificados em outra 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 com 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 (confira 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 visita nova poderá ser inserida ou adicionada a esses trajetos. Além disso, o horário de início e término de um veículo em routes é totalmente restrito, a menos que o veículo esteja vazio (ou seja, não tenha visitas e used_if_route_is_empty definido como falso no modelo).

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

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

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

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

Para aplicar um nível de relaxamento se uma visita atender a threshold_visit_count OU a threshold_time, adicione dois relaxations com o mesmo level: um com apenas threshold_visit_count definido e outro com apenas threshold_time definido. Se uma visita atender às condições de vários relaxations, o nível mais descontraído será aplicado. Como resultado, do início do veículo às visitas do trajeto até o final do veículo, o nível de relaxamento fica 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 ao trajeto que não atendem às condições limite de qualquer relaxations são totalmente restritos, e nenhuma visita pode ser inserida nessas sequências. Além disso, se a partida ou o fim de um veículo não satisfizer as condições de qualquer relaxamento, o tempo será fixado, a menos que o veículo esteja vazio.

Campos
level

Level

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

threshold_time

Timestamp

É a hora em que a level de relaxamento pode ser aplicada ou depois dela.

threshold_visit_count

int32

É o número de visitas durante ou depois das quais o relaxamento level pode ser aplicado. Se a threshold_visit_count for 0 (ou deixada sem definição), o level poderá ser aplicado diretamente na inicialização do veículo.

Se for route.visits_size() + 1, o level só poderá ser aplicado à extremidade do veículo. Se for um valor superior a route.visits_size() + 1, o level não será aplicado a esse trajeto.

Nível

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

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

Enums
LEVEL_UNSPECIFIED

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

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

RELAX_VISIT_TIMES_AFTER_THRESHOLD Os horários de início e de término da visita serão flexibilizados, mas cada visita permanece vinculada ao mesmo veículo e a sequência da visita deve ser observada: nenhuma visita pode ser inserida entre elas ou antes delas.
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD Igual a RELAX_VISIT_TIMES_AFTER_THRESHOLD, mas a sequência de visitas também é flexível: as visitas só podem ser realizadas por esse veículo, mas podem se tornar menos realizadas.
RELAX_ALL_AFTER_THRESHOLD Igual a RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD, mas o veículo é relaxado: as visitas são totalmente sem custo financeiro dentro do tempo limite ou depois dele e podem ter um desempenho inferior.

InputConfig

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

Campos
data_format

DataFormat

Obrigatório. O formato de 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 cabeçalho opcional).

Campos
lat_lng

LatLng

As coordenadas geográficas do waypoint.

heading

int32

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

OptimizeToursRequest

Solicitação a ser dada 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 ligação.

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

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

timeout

Duration

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

Para solicitações assíncronas, o servidor vai gerar uma solução (se possível) antes do tempo limite expirar.

model

ShipmentModel

Modelo de envio para resolver.

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

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

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

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

  • Para todos os trajetos, vehicle_index precisa estar dentro do intervalo e não ser duplicado.
  • para todas as visitas, shipment_index e visit_request_index precisam estar dentro do intervalo.
  • uma remessa só pode ser referenciada em uma rota.
  • a retirada de uma remessa para retirada-entrega deve ser realizada antes da entrega.
  • não é possível realizar mais do que uma alternativa de retirada ou entrega de um envio.
  • em todos os trajetos, os tempos estão aumentando (por exemplo, vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time).
  • uma remessa só pode ser realizada em um veículo permitido. Um veículo é permitido se Shipment.allowed_vehicle_indices estiver vazio ou se o vehicle_index estiver incluído em Shipment.allowed_vehicle_indices.

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

injected_solution_constraint

InjectedSolutionConstraint

Limitar o algoritmo de otimização para encontrar uma solução final semelhante a uma anterior. Por exemplo, isso pode ser usado para congelar partes de rotas que já foram concluídas ou que estão a serem concluídas, mas não devem 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 vazios, os trajetos informados serão atualizados sem modificar a sequência subjacente de visitas ou tempos de viagem: apenas outros detalhes serão atualizados. Isso não resolve o modelo.

Desde 11/2020, ele preenche apenas as polilinhas de trajetos não vazios e exige que populate_polylines seja verdadeiro.

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

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

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

interpret_injected_solutions_using_labels

bool

Se verdadeiro:

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

Se verdadeiro, os rótulos nas seguintes categorias 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 com as visitas dele. Se um shipment_label na solução injetada não corresponder a um envio de solicitação, a visita correspondente será removida da solução. Se um SkippedShipment.label na solução injetada não corresponder a um envio de solicitação, o SkippedShipment será removido da solução.

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

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

consider_road_traffic

bool

Considere a estimativa de tráfego no cálculo dos campos ShipmentRoute, Transition.travel_duration, Visit.start_time e vehicle_end_time. na definição do campo ShipmentRoute.has_traffic_infeasibilities e no cálculo do campo OptimizeToursResponse.total_cost.

populate_polylines

bool

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

populate_transition_polylines

bool

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

allow_large_deadline_despite_interruption_risk

bool

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

use_geodesic_distances

bool

Se 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 for verdadeiro, esse campo precisa ser definido e define a velocidade aplicada para calcular os tempos de viagem. O valor precisa ser de pelo menos 1 metro/segundo.

max_validation_errors

int32

Corta o número de erros de validação retornados. Esses erros normalmente são anexados a um payload de erro INVALID_MCC como um detalhe do 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, trocando a latência pela qualidade da solução. O prazo de solicitação global é aplicado em todos os modos.

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

SolvingMode

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

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

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

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

OptimizeToursResponse

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

Campos
routes[]

ShipmentRoute

Trajetos calculados para cada veículo. a i-ésima rota corresponde ao i-ésimo veículo no modelo.

request_label

string

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

skipped_shipments[]

SkippedShipment

A lista de todos os envios pulados.

validation_errors[]

OptimizeToursValidationError

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

metrics

Metrics

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

Métricas

Métricas gerais agregadas em todos os trajetos.

Campos
aggregated_route_metrics

AggregatedMetrics

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

skipped_mandatory_shipment_count

int32

Número de envios obrigatórios pulados.

used_vehicle_count

int32

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

earliest_vehicle_start_time

Timestamp

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

latest_vehicle_end_time

Timestamp

O horário de término mais recente de um veículo usado, calculado como o máximo de ShipmentRoute.vehicle_end_time de todos os veículos usados.

costs

map<string, double>

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

total_cost

double

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

OptimizeToursValidationError

Descreve um erro ou aviso encontrado ao validar um OptimizeToursRequest.

Campos
code

int32

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

Outros campos (abaixo) 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 interrompem todo o processo de validação. Esse é o caso de erros display_name="UNSPECIFIED", entre outros. Alguns podem fazer com que o processo de validação ignore outros erros.

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

REFERÊNCIA: uma lista de todos os pares (código, nome):

  • UNSPECIFIED = 0;
  • VALIDATION_TIMEOUT_ERROR = 10; Não foi possível concluir a validação dentro do prazo.
  • REQUEST_OPTIONS_ERROR = 12;

    • REQUEST_OPTIONS_INVALID_SOLVING_MODE = 1201;
    • REQUEST_OPTIONS_INVALID_MAX_VALIDATION_ERRORS = 1203;
    • REQUEST_OPTIONS_INVALID_GEODESIC_METERS_PER_SECOND = 1204;
    • REQUEST_OPTIONS_GEODESIC_METERS_PER_SECOND_TOO_Pequeno = 1205;
    • REQUEST_OPTIONS_MISSING_GEODESIC_METERS_PER_SECOND = 1206;
    • REQUEST_OPTIONS_POPULATE_PATHFINDER_TRIPS_AND_GEODESIC_DISTANCE = 1207;
    • REQUEST_OPTIONS_COST_MODEL_OPTIONS_AND_GEODESIC_DISTANCE = 1208;
    • REQUEST_OPTIONS_TRAVEL_MODE_INCOMPATIBLE_WITH_TRAFFIC = 1211;
    • REQUEST_OPTIONS_MULTIPLE_TRAFFIC_FLAVORS = 1212;
    • REQUEST_OPTIONS_INVALID_TRAFFIC_FLAVOR = 1213;
    • REQUEST_OPTIONS_TRAFFIC_enabled_WITHOUT_GLOBAL_START_TIME = 1214;
    • REQUEST_OPTIONS_TRAFFIC_ENABLED_WITH_PRECEDENCES = 1215;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_MODE_INVALID = 1216;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_enabled_WITHOUT_TRAFFIC = 1217;
  • INJECTED_SOLUTION_ERROR = 20;
    • INJECTED_SOLUTION_MISSING_LABEL = 2000;
    • INJECTED_SOLUTION_DUPLICATE_LABEL = 2001;
    • INJECTED_SOLUTION_AMBIGUOUS_INDEX = 2002;
    • INJECTED_SOLUTION_INFEASIBLE_AFTER_GETTING_TRAVEL_TIMES = 2003;
    • INJECTED_SOLUTION_TransitionION_INCONSISTENT_WITH_ACTUAL_TRAVEL = 2004;
    • INJECTED_SOLUTION_CONCURRENT_SOLUTION_TYPES = 2005;
    • INJECTED_SOLUTION_MORE_than_ONE_PER_TYPE = 2006;
    • INJECTED_SOLUTION_REFRESH_WITHOUT_POPULATE = 2008;
    • INJECTED_SOLUTION_CONSTRAINED_ROUTE_PORTION_INFEASIBLE = 2010;
  • SHIPMENT_MODEL_ERROR = 22;
    • SHIPMENT_MODEL_TOO_LARGE = 2.200;
    • SHIPMENT_MODEL_TOO_MANY_CAPACITY_TYPES = 2.201;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_NEGATIVE_OR_NAN = 2202;
    • SHIPMENT_MODEL_GLOBAL_END_TIME_TOO_LARGE_OR_NAN = 2203;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_AFTER_GLOBAL_END_TIME = 2204;
    • SHIPMENT_MODEL_GLOBAL_DURATION_TOO_LONG = 2.205;
    • SHIPMENT_MODEL_MAX_ACTIVE_VEHICLES_NOT_POSITIVE = 2206;
    • SHIPMENT_MODEL_DURATION_MATRIX_TOO_LARGE = 2.207
  • INDEX_ERROR = 24;
  • TAG_ERROR = 26;
  • TIME_WINDOW_ERROR = 28;
    • TIME_WINDOW_INVALID_START_TIME = 2800;
    • TIME_WINDOW_INVALID_END_TIME = 2801;
    • TIME_WINDOW_INVALID_SOFT_START_TIME = 2802;
    • TIME_WINDOW_INVALID_SOFT_END_TIME = 2803;
    • TIME_WINDOW_OUTSIDE_GLOBAL_TIME_WINDOW = 2.804;
    • TIME_WINDOW_START_TIME_AFTER_END_TIME = 2.805;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_ANTES_SOFT_START_TIME = 2.806;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_AFTER_SOFT_END_TIME = 2.807;
    • TIME_WINDOW_COST_ANTES_SOFT_START_TIME_WITHOUT_SOFT_START_TIME = 2.808;
    • TIME_WINDOW_COST_AFTER_SOFT_END_TIME_WITHOUT_SOFT_END_TIME = 2.809;
    • TIME_WINDOW_SOFT_START_TIME_WITHOUT_COST_ANTES_SOFT_START_TIME = 2.810;
    • TIME_WINDOW_SOFT_END_TIME_WITHOUT_COST_AFTER_SOFT_END_TIME = 2811;
    • TIME_WINDOW_OVERLAPPING_ADJACENT_OR_EARLIER_than_PREVIOUS = 2812;
    • TIME_WINDOW_START_TIME_AFTER_SOFT_START_TIME = 2.813;
    • TIME_WINDOW_SOFT_START_TIME_OUTSIDE_GLOBAL_TIME_WINDOW = 2819;
    • TIME_WINDOW_SOFT_END_TIME_OUTSIDE_GLOBAL_TIME_WINDOW = 2.820;
    • TIME_WINDOW_SOFT_END_TIME_AFTER_END_TIME = 2.816;
    • TIME_WINDOW_COST_ANTES_SOFT_START_TIME_SET_AND_MULTIPLE_WINDOWS = 2.817;
    • TIME_WINDOW_COST_AFTER_SOFT_END_TIME_SET_AND_MULTIPLE_WINDOWS = 2818;
    • TRANSITION_ATTRIBUTES_ERROR = 30;
    • TRANSIÇÃO_ATTRIBUTES_INVALID_COST = 3000;
    • TRANSIÇÃO_ATTRIBUTES_INVALID_COST_PER_KILOMETER = 3001;
    • TRANSIÇÃO_ATTRIBUTES_DUPLICATE_TAG_PAIR = 3002;
    • TRANSIÇÃO_ATTRIBUTES_DISTANCE_LIMIT_MAX_METERS_UNSUPPORTED = 3003;
    • TRANSIÇÃO_ATTRIBUTES_UNSPECIFIED_SOURCE_TAGS = 3004;
    • TRANSIÇÃO_ATTRIBUTES_CONFLICTING_SOURCE_TAGS_FIELDS = 3005;
    • TRANSIÇÃO_ATTRIBUTES_UNSPECIFIED_DESTINATION_TAGS = 3006;
    • TRANSIÇÃO_ATTRIBUTES_CONFLICTING_DESTINATION_TAGS_FIELDS = 3007;
    • TRANSIÇÃO_ATTRIBUTES_DELAY_DURATION_NEGATIVE_OR_NAN = 3008;
    • TRANSIÇÃO_ATTRIBUTES_DELAY_DURATION_EXCEEDS_GLOBAL_DURATION = 3009;
  • AMOUNT_ERROR = 31;
    • AMOUNT_NEGATIVE_VALUE = 3.100;
  • LOAD_LIMIT_ERROR = 33;
    • LOAD_LIMIT_INVALID_COST_ABOVE_SOFT_MAX = 3303;
    • LOAD_LIMIT_SOFT_MAX_WITHOUT_COST_ABOVE_SOFT_MAX = 3304;
    • LOAD_LIMIT_COST_ABOVE_SOFT_MAX_WITHOUT_SOFT_MAX = 3305;
    • LOAD_LIMIT_NEGATIVE_SOFT_MAX = 3306;
    • LOAD_LIMIT_MIXED_DEMAND_TYPE = 3307;
    • LOAD_LIMIT_MAX_LOAD_NEGATIVE_VALUE = 3308;
    • LOAD_LIMIT_SOFT_MAX_ABOVE_MAX = 3309;
  • INTERVAL_ERROR = 34;
    • INTERVAL_MIN_EXCEEDS_MAX = 3401;
    • INTERVAL_NEGATIVE_MIN = 3402;
    • INTERVAL_NEGATIVE_MAX = 3403;
    • INTERVAL_MIN_EXCEEDS_CAPACITY = 3404;
    • INTERVAL_MAX_EXCEEDS_CAPACITY = 3405;
  • DISTANCE_LIMIT_ERROR = 36;
    • DISTANCE_LIMIT_INVALID_COST_AFTER_SOFT_MAX = 3.601;
    • DISTANCE_LIMIT_SOFT_MAX_WITHOUT_COST_AFTER_SOFT_MAX = 3602;
    • DISTANCE_LIMIT_COST_AFTER_SOFT_MAX_WITHOUT_SOFT_MAX = 3.603;
    • DISTANCE_LIMIT_NEGATIVE_MAX = 3.604;
    • DISTANCE_LIMIT_NEGATIVE_SOFT_MAX = 3.605;
    • DISTANCE_LIMIT_SOFT_MAX_LARGER_QUE_MAX = 3.606;
  • DURATION_LIMIT_ERROR = 38;
    • DURATION_LIMIT_MAX_DURATION_NEGATIVE_OR_NAN = 3800;
    • DURATION_LIMIT_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3.801
    • DURATION_LIMIT_INVALID_COST_PER_HOUR_AFTER_SOFT_MAX = 3.802
    • DURATION_LIMIT_SOFT_MAX_WITHOUT_COST_AFTER_SOFT_MAX = 3.803;
    • DURATION_LIMIT_COST_AFTER_SOFT_MAX_WITHOUT_SOFT_MAX = 3.804;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3805;
    • DURATION_LIMIT_INVALID_COST_AFTER_QUADRATIC_SOFT_MAX = 3.806
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_COST_PER_SQUARE_HOUR = 3807;
    • DURATION_LIMIT_COST_PER_SQUARE_HOUR_WITHOUT_QUADRATIC_SOFT_MAX = 3808;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_MAX = 3.809
    • DURATION_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3810;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_LARGER_QUE_MAX = 3811
    • DURATION_LIMIT_DIFF_BETWEEN_MAX_AND_QUADRATIC_SOFT_MAX_TOO_LARGE = 3812;
    • DURATION_LIMIT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3813;
    • DURATION_LIMIT_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3814;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3.815
  • SHIPMENT_ERROR = 40;
    • SHIPMENT_PD_LIMIT_WITHOUT_PICKUP_AND_DELIVERY = 4014;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_NEGATIVE_OR_NAN = 4.000;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4001;
    • SHIPMENT_PD_RELATIVE_DETOUR_LIMIT_INVALID = 4015;
    • SHIPMENT_PD_DETOUR_LIMIT_AND_EXTRA_VISIT_DURATION = 4016;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_NEGATIVE_OR_NAN = 4002;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4003;
    • SHIPMENT_EMPTY_SHIPMENT_TYPE = 4004;
    • SHIPMENT_NO_PICKUP_NO_DELIVERY = 4005;
    • SHIPMENT_INVALID_PENALTY_COST = 4006;
    • SHIPMENT_ALLOWED_VEHICLE_INDEX_OUT_OF_BOUNDS = 4007;
    • SHIPMENT_DUPLICATE_ALLOWED_VEHICLE_INDEX = 4008;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITHOUT_INDEX = 4009;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITH_INDEX = 4010;
    • SHIPMENT_INVALID_COST_FOR_VEHICLE = 4011;
    • SHIPMENT_COST_FOR_VEHICLE_INDEX_OUT_OF_BOUNDS = 4012;
    • SHIPMENT_DUPLICATE_COST_FOR_VEHICLE_INDEX = 4013;
  • VEHICLE_ERROR = 42;
    • VEHICLE_EMPTY_REQUIRED_OPERATOR_TYPE = 4200;
    • VEHICLE_DUPLICATE_REQUIRED_OPERATOR_TYPE = 4201;
    • VEHICLE_NO_OPERATOR_WITH_REQUIRED_OPERATOR_TYPE = 4202;
    • VEHICLE_EMPTY_START_TAG = 4203;
    • VEHICLE_DUPLICATE_START_TAG = 4204;
    • VEHICLE_EMPTY_END_TAG = 4205;
    • VEHICLE_DUPLICATE_END_TAG = 4206;
    • VEHICLE_EXTRA_VISIT_DURATION_NEGATIVE_OR_NAN = 4207;
    • VEHICLE_EXTRA_VISIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4208;
    • VEHICLE_EXTRA_VISIT_DURATION_EMPTY_KEY = 4209;
    • VEHICLE_FIRST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4210;
    • VEHICLE_FIRST_SHIPMENT_IGNORED = 4211;
    • VEHICLE_FIRST_SHIPMENT_NOT_BOUND = 4212;
    • VEHICLE_LAST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4213;
    • VEHICLE_LAST_SHIPMENT_IGNORED = 4214;
    • VEHICLE_LAST_SHIPMENT_NOT_BOUND = 4215;
    • VEHICLE_IGNORED_WITH_used_IF_ROUTE_IS_EMPTY = 4216;
    • VEHICLE_INVALID_COST_PER_KILOMETER = 4217;
    • VEHICLE_INVALID_COST_PER_HOUR = 4218;
    • VEHICLE_INVALID_COST_PER_TRAVELED_HOUR = 4219;
    • VEHICLE_INVALID_FIXED_COST = 4220;
    • VEHICLE_INVALID_TRAVEL_DURATION_MULTIPLE = 4221;
    • VEHICLE_TRAVEL_DURATION_MULTIPLE_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4223;
    • VEHICLE_MATRIX_INDEX_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4224;
    • VEHICLE_minimum_DURATION_LONGER_than_DURATION_LIMIT = 4222
  • VISIT_REQUEST_ERROR = 44;
    • VISIT_REQUEST_EMPTY_TAG = 4400;
    • VISIT_REQUEST_DUPLICATE_TAG = 4401;
    • VISIT_REQUEST_DURATION_NEGATIVE_OR_NAN = 4404;
    • VISIT_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4405;
  • PRECEDENCE_ERROR = 46;
    • PRECEDENCE_RULE_MISSING_FIRST_INDEX = 4600;
    • PRECEDENCE_RULE_MISSING_SECOND_INDEX = 4601;
    • PRECEDENCE_RULE_FIRST_INDEX_OUT_OF_BOUNDS = 4602;
    • PRECEDENCE_RULE_SECOND_INDEX_OUT_OF_BOUNDS = 4603;
    • PRECEDENCE_RULE_DUPLICATE_INDEX = 4604;
    • PRECEDENCE_RULE_INEXISTENT_FIRST_VISIT_REQUEST = 4605;
    • PRECEDENCE_RULE_INEXISTENT_SECOND_VISIT_REQUEST = 4606;
  • BREAK_ERROR = 48;
    • BREAK_RULE_EMPTY = 4800;
    • BREAK_REQUEST_UNSPECIFIED_DURATION = 4801;
    • BREAK_REQUEST_UNSPECIFIED_EARLIEST_START_TIME = 4802;
    • BREAK_REQUEST_UNSPECIFIED_LATEST_START_TIME = 4803;
    • BREAK_REQUEST_DURATION_NEGATIVE_OR_NAN = 4804; = 4804;
    • BREAK_REQUEST_LATEST_START_TIME_ANTES_EARLIEST_START_TIME = 4805;
    • BREAK_REQUEST_EARLIEST_START_TIME_ANTES_GLOBAL_START_TIME = 4806;
    • BREAK_REQUEST_LATEST_END_TIME_AFTER_GLOBAL_END_TIME = 4807;
    • BREAK_REQUEST_NON_SCHEDULABLE = 4808;
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_NEGATIVE_OR_NAN = 4809;
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_NEGATIVE_OR_NAN = 4810;
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4811;
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4812;
    • BREAK_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4813;
    • BREAK_FREQUENCY_MISSING_MAX_INTER_BREAK_DURATION = 4.814;
    • BREAK_FREQUENCY_MISSING_MIN_BREAK_DURATION = 4.815;
  • SHIPMENT_TYPE_INCOMPATIBILITY_ERROR = 50;
    • SHIPMENT_TYPE_INCOMPATIBILITY_EMPTY_TYPE = 5001;
    • SHIPMENT_TYPE_INCOMPATIBILITY_LESS_THAN_TWO_TYPES = 5002;
    • SHIPMENT_TYPE_INCOMPATIBILITY_DUPLICATE_TYPE = 5003;
    • SHIPMENT_TYPE_INCOMPATIBILITY_INVALID_INCOMPATIBILITY_MODE = 5004;
    • SHIPMENT_TYPE_INCOMPATIBILITY_TOO_MANY_INCOMPATIBILITIES = 5005;
  • SHIPMENT_TYPE_REQUIREMENT_ERROR = 52;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE = 52.001;
    • SHIPMENT_TYPE_REQUIREMENT_NO_DEPENDENT_TYPE = 52002;
    • SHIPMENT_TYPE_REQUIREMENT_INVALID_REQUIREMENT_MODE = 52003;
    • SHIPMENT_TYPE_REQUIREMENT_TOO_MANY_REQUIREMENTS = 52004;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_REQUIRED_TYPE = 52005;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_REQUIRED_TYPE = 52006;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE_FOUND = 52007;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_DEPENDENT_TYPE = 52008;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_DEPENDENT_TYPE = 52009;
    • SHIPMENT_TYPE_REQUIREMENT_SELF_DEPENDENT_TYPE = 52010;
    • SHIPMENT_TYPE_REQUIREMENT_GRAPH_HAS_CYCLES = 52011;
  • VEHICLE_OPERATOR_ERROR = 54;
    • VEHICLE_OPERATOR_EMPTY_TYPE = 5400;
    • VEHICLE_OPERATOR_MULTIPLE_START_TIME_WINDOWS = 5401;
    • VEHICLE_OPERATOR_SOFT_START_TIME_WINDOW = 5402;
    • VEHICLE_OPERATOR_MULTIPLE_END_TIME_WINDOWS = 5403;
    • VEHICLE_OPERATOR_SOFT_END_TIME_WINDOW = 5404;
  • DURATION_SECONDS_MATRIX_ERROR = 56;
    • DURATION_SECONDS_MATRIX_DURATION_NEGATIVE_OR_NAN = 5.600
    • DURATION_SECONDS_MATRIX_DURATION_EXCEEDS_GLOBAL_DURATION = 5.601
  • WARNING = 9;
    • WARNING_INJECTED_FIRST_SOLUTION = 90;
      • WARNING_INJECTED_FIRST_SOLUTION_INFEASIBLE_SHIPMENTS_REMOVED = 9000;
      • WARNING_INJECTED_FIRST_SOLUTION_INFEASIBLE_AFTER_GETTING_TRAVEL_TIMES = 9001;
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, consultar o veículo 4 e a primeira retirada da remessa 2 pode ser feito da seguinte maneira:

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

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

error_message

string

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

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

offending_values

string

Pode conter os valores dos campos. Essa opção nem sempre está disponível. Você não deve confiar nele e usá-lo apenas para depuração manual do modelo.

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 2 de start_time_windows do veículo 5 usando:

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

No entanto, omitimos entidades de nível superior, como OptimizeToursRequest ou ShipmentModel, para evitar sobrecarregar a mensagem.

Campos
name

string

Nome do campo, por exemplo, "vehicles".

sub_field

FieldReference

Subcampo anidado recursivamente, se necessário.

Campo de união index_or_key.

index_or_key pode ser apenas de um dos tipos a seguir:

index

int32

Índice do campo se ele for repetido.

key

string

Chave se o campo for um mapa.

OutputConfig

Especifique um destino para os resultados de [BatchOptimizeTours][google.maps.routeoptimization.v1.Route OptimizationService.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 a serem atendidas ao calcular trajetos 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 é necessário evitar vias com pedágio onde for razoável. Será dada preferência aos trajetos que não contenham vias com pedágio. Aplicável apenas aos meios de transporte motorizados.

avoid_highways

bool

Especifica se é necessário evitar rodovias quando for razoável. A preferência será dada às rotas que não contêm rodovias. Aplicável apenas aos meios de transporte motorizados.

avoid_ferries

bool

Especifica se balsas devem ser evitadas quando for razoável. A preferência será dada a rotas que não incluem viagens de balsa. Aplicável apenas aos meios de transporte motorizados.

avoid_indoor

bool

Opcional. Especifica se é necessário evitar a navegação em ambientes fechados, quando razoável. Será dada preferência para trajetos 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 coletas para uma das entregas. Para que o frete seja considerado realizado, um veículo único precisa visitar um dos locais de coleta (e diminuir a capacidade extra de acordo com isso) e, depois, visitar um dos locais de entrega (aumentar a capacidade extra de acordo com isso).

Campos
display_name

string

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

pickups[]

VisitRequest

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

deliveries[]

VisitRequest

Conjunto de alternativas de entrega associadas à remessa. Se não for especificado, o veículo só vai precisar visitar um local correspondente às retiradas.

load_demands

map<string, Load>

Carregar as demandas do envio (por exemplo, peso, volume, número de paletes etc.). As chaves no mapa devem ser identificadores que descrevem o tipo da carga correspondente, idealmente 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 pode realizar este envio. Se estiver vazio, todos os veículos poderão realizar essa ação. Os veículos são informados pelo índice na lista vehicles do ShipmentModel.

costs_per_vehicle[]

double

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

  • o mesmo número de elementos que costs_per_vehicle_indices. costs_per_vehicle[i] corresponde ao veículo costs_per_vehicle_indices[i] do modelo.
  • o número de elementos e de veículos do 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 este campo em branco se esses custos não existirem.

costs_per_vehicle_indices[]

int32

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

pickup_to_delivery_absolute_detour_limit

Duration

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

Por exemplo, permita t ser o menor tempo necessário para ir da opção de retirada selecionada diretamente para a opção de entrega selecionada. Em seguida, definir 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 restrito será usado para cada par de retirada/entrega possível. Desde outubro de 2017, os desvios são aceitos apenas quando a duração da viagem não depende de veículos.

pickup_to_delivery_time_limit

Duration

Especifica a duração máxima entre o início da retirada e o início da entrega de uma remessa. Se especificado, o valor não pode ser 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 ao lado de restrições de desvio máximo: a solução respeitará as duas especificações.

shipment_type

string

String não vazia que especifica um "tipo" para esse envio. 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 retiradas/entregas referentes à mesma remessa compartilham o mesmo shipment_type.

label

string

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

ignore

bool

Se verdadeiro, ignore esse envio, mas não aplique um penalty_cost.

Ignorar uma remessa vai resultar em um erro de validação quando houver 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 em questão. Os precedence_rules que fazem referência a fretes ignorados também serão ignorados.

penalty_cost

double

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

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

pickup_to_delivery_relative_detour_limit

double

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

Por exemplo, vamos supor que t seja o tempo mais curto para ir da alternativa de retirada selecionada diretamente para a alternativa de entrega selecionada. Em seguida, definir 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 restrito será usado para cada par de retirada/entrega possível. Desde 2017/10, os desvios só são permitidos quando a duração da viagem não depende de veículos.

Carregar

Ao realizar uma visita, um valor predefinido pode ser adicionado à carga do veículo, no caso de retirada, ou subtraído, no caso de uma entrega. Essa mensagem define esse valor. Consulte load_demands.

Campos
amount

int64

O valor pelo qual a carga do veículo realizando a visita correspondente varia. Como é um número inteiro, os usuários são aconselhados a escolher uma unidade adequada para evitar a perda de precisão. Precisa ser ≥ 0.

VisitRequest

Solicitação de visita que pode ser feita por um veículo: ela tem uma localização geográfica (ou duas, consulte abaixo), horários de abertura e fechamento representados por janelas de horário e um tempo de duração do serviço (o tempo gasto pelo veículo depois que ele chega à coleta ou entrega de mercadorias).

Campos
arrival_location

LatLng

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

arrival_waypoint

Waypoint

O waypoint onde o veículo chega ao realizar esta VisitRequest. Se o modelo de envio tiver matrizes de duração e distância, arrival_waypoint não poderá ser especificado.

departure_location

LatLng

A localização geográfica de onde o veículo sai 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 precisará ser especificado.

departure_waypoint

Waypoint

O waypoint de partida do veículo depois de concluir esta 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 precisará ser especificado.

tags[]

string

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

time_windows[]

TimeWindow

Janelas de tempo que restringem o horário de chegada em uma visita. Um veículo pode sair da janela de horário de chegada, ou seja, o horário de chegada + duração não precisam estar dentro de uma janela de horário. Isso poderá 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, não podem se sobrepor ou ficar adjacentes a outra e precisam estar em ordem crescente.

cost_per_hour_after_soft_end_time e soft_end_time só poderão 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 um trajeto de veículo. Isso pode ser usado para pagar custos diferentes para cada retirada ou entrega alternativa de um envio. Esse custo precisa estar na mesma unidade que Shipment.penalty_cost e não pode ser negativo.

load_demands

map<string, Load>

Carregue as demandas desta solicitação de visita. Ele é parecido com o campo Shipment.load_demands, mas se aplica apenas a esse VisitRequest, e não a todo o Shipment. As demandas listadas aqui são adicionadas àquelas listadas em Shipment.load_demands.

visit_types[]

string

Especifica os tipos de visita. Pode ser usado para alocar o tempo necessário para que um veículo conclua a visita (consulte Vehicle.extra_visit_duration_for_visit_type).

Cada tipo só pode aparecer uma vez.

label

string

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

ShipmentModel

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

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

Shipment

Conjunto de remessas que devem ser executadas no modelo.

vehicles[]

Vehicle

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

global_start_time

Timestamp

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

O período do modelo precisa ser inferior a um ano, ou seja, global_end_time e global_start_time precisam ter no máximo 31536.000 segundos um do outro.

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

global_end_time

Timestamp

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

global_duration_cost_per_hour

double

A "duração global" do plano geral é a diferença entre o horário de início efetivo mais próximo e o horário de término efetivo mais recente de todos os veículos. Os usuários podem atribuir um custo por hora a essa quantidade para tentar otimizar para a conclusão da tarefa mais cedo, 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 este 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:

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

string

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

As tags correspondem a VisitRequest.tags ou Vehicle.start_tags. Um determinado VisitRequest ou Vehicle precisa corresponder a exatamente uma tag neste campo. As tags de origem, destino e matriz de um Vehicle podem ser as mesmas. Da mesma forma, as tags de origem e destino de um VisitRequest podem ser iguais. Todas as tags precisam ser diferentes e não podem ser strings vazias. Se este campo não estiver vazio, duration_distance_matrices não poderá ficar 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. à distância) da viagem entre as visitas com a tag duration_distance_matrix_src_tags(j) e as 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 a exatamente uma tag neste campo. As tags de origem, destino e matriz de uma Vehicle podem ser iguais. Da mesma forma, as tags de origem e destino de uma VisitRequest podem ser as mesmas. Todas as tags precisam ser diferentes e não podem ser strings vazias. Se este campo não estiver vazio, duration_distance_matrices não poderá ficar vazio.

transition_attributes[]

TransitionAttributes

Atributos de transição adicionados ao modelo.

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

Conjuntos de bundle_types incompatíveis (consulte ShipmentTypeIncompatibility).

shipment_type_requirements[]

ShipmentTypeRequirement

Conjuntos de requisitos de shipment_type (consulte ShipmentTypeRequirement).

precedence_rules[]

PrecedenceRule

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

max_active_vehicles

int32

Restringe o número máximo de veículos ativos. Um veículo estará ativo se sua rota realizar pelo menos uma remessa. Isso pode ser usado para limitar o número de rotas no caso em que 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 uso. Precisa ser estritamente positivo.

DurationDistanceMatrix

Especifica uma matriz de duração e distância dos locais de partida e de partida dos veículos para visitar e dos locais finais dos veículos.

Campos
rows[]

Row

Especifica as linhas da matriz de duração e distância. Ele precisa ter a mesma quantidade 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 matriz.

Cada partida de veículo precisa corresponder exatamente a 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

os valores de duração de uma linha específica. Ele precisa ter a mesma quantidade de elementos que ShipmentModel.duration_distance_matrix_dst_tags.

meters[]

double

Valores de distância de uma linha específica. Se nenhum custo ou restrição se referir a distâncias no modelo, este campo pode ser deixado em branco. Caso contrário, precisa ter a mesma quantidade de elementos que durations.

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 do "primeiro" foi iniciado.

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 os dois envios são realizados e são ignorados.

Campos
first_is_delivery

bool

Indica se a "primeira" é uma entrega.

second_is_delivery

bool

Indica se o "segundo" é uma entrega.

offset_duration

Duration

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

first_index

int32

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

second_index

int32

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

ShipmentRoute

O trajeto de um veículo pode ser decomposto ao longo do eixo de tempo, desta forma (consideramos 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 início e fim do veículo e o início e o término de cada visita (também conhecido como chegada e partida). Eles acontecem em um determinado segundo.
  • "intervalos de tempo", como as próprias visitas e a transição entre as visitas. Embora os intervalos de tempo às vezes possam ter duração zero, ou seja, começam e terminam no mesmo segundo, eles geralmente têm uma duração positiva.

Invariantes:

  • Se houver n visitas, haverá n+1 transições.
  • Uma visita é sempre cercada por uma transição anterior a ela (mesmo índice) e uma transição depois dela (índice + 1).
  • O início do veículo é sempre seguido pela transição 0.
  • O fim do veículo é sempre precedido pela transição #n.

Aumentando o zoom, confira o que acontece durante uma Transition e uma Visit:

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

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

  • Elas não se sobrepõem.
  • O DELAY é único e precisa ser um período contíguo de tempo antes da próxima visita (ou término do veículo). Portanto, basta saber a duração do atraso para saber o início e o fim.
  • Os intervalos são períodos de tempo contíguos e não sobrepostos. A resposta especifica o horário de início e a duração de cada intervalo.
  • VIAGEM e ESPERA são "preemptíveis": podem ser interrompidas várias vezes durante essa transição. Os clientes podem supor que a viagem acontece "assim que possível" e "esperar" 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 executa a rota, identificado pelo índice na origem ShipmentModel.

vehicle_label

string

Rótulo do veículo que realiza esse trajeto, 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 representa uma rota. visits[i] é a i-ésima visita na rota. Se este campo estiver vazio, o veículo será considerado não utilizado.

transitions[]

Transition

Lista ordenada de transições para a rota.

has_traffic_infeasibilities

bool

Quando OptimizeToursRequest.consider_road_traffic é definido como verdadeiro, esse campo indica que as inconsistências nos horários da rota são previstas usando estimativas de duração da viagem com base no trânsito. Talvez não haja tempo suficiente para concluir viagens ajustadas para o trânsito, atrasos e intervalos entre as visitas, antes da primeira ou depois da última visita e, ao mesmo tempo, atender às janelas de tempo da 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 do tempo de viagem de travel_duration(previous_visit, next_visit) devido ao trânsito. Além disso, um intervalo pode ser forçado a se sobrepor a uma visita devido a um aumento nas estimativas de tempo de deslocamento e restrições de intervalo de tempo de visita ou intervalo.

route_polyline

EncodedPolyline

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

breaks[]

Break

Intervalos programados para o veículo que executa este 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 essa rota. Os campos de AggregatedMetrics são somados em todos os ShipmentRoute.transitions ou ShipmentRoute.visits, dependendo do contexto.

route_costs

map<string, double>

Custo da rota, detalhado por campos de solicitação relacionados a custos. As chaves são caminhos proto, 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 todo o trajeto. Em outras palavras, custos["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, com exceção dos custos relacionados a TransitionAttributes que só foram informados de maneira agregada a partir de 2022/01.

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 uma pausa.

Campos
start_time

Timestamp

Início do intervalo.

duration

Duration

Duração de uma pausa.

EncodedPolyline

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

Campos
points

string

String que representa pontos codificados da polilinha.

Transição

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

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

Campos
travel_duration

Duration

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

travel_distance_meters

double

Distância percorrida durante a transição.

traffic_info_unavailable

bool

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

delay_duration

Duration

Soma das durações de atraso aplicadas a essa transição. Se for o caso, o atraso vai começar exatamente delay_duration segundos antes do próximo evento (fim da visita ou 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 no ShipmentRoute.breaks.

wait_duration

Duration

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

total_duration

Duration

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

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

Timestamp

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

route_polyline

EncodedPolyline

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

vehicle_loads

map<string, VehicleLoad>

Carregamentos de veículos durante essa transição, para cada tipo que aparece no Vehicle.load_limits do veículo ou que têm Shipment.load_demands diferente de zero em algum frete realizado nesse trajeto.

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

VehicleLoad

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

Campos
amount

int64

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

Acesse

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

Campos
shipment_index

int32

Índice do campo shipments na ShipmentModel de origem.

is_pickup

bool

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

visit_request_index

int32

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

start_time

Timestamp

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

load_demands

map<string, Load>

Demanda de carregamento total de visitas como a soma do envio 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 do Transition.loads (consulte este campo).

detour

Duration

Tempo de desvio extra devido aos envios visitados na rota antes da visita e ao possível tempo de espera induzido pelos períodos de tempo. Se a visita for uma entrega, o desvio será calculado a partir da visita de embarque 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 a partir do veículo start_location 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.

ShipmentTypeIncompatibility

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

Campos
types[]

string

Lista de tipos incompatíveis. 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 são restritas no mesmo trajeto.

Enums
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

Para duas remessas com tipos incompatíveis com o modo de incompatibilidade NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY:

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

ShipmentTypeRequirement

Especifica os requisitos entre as remessas com base em remessa_type. Os detalhes do requisito são definidos pelo modo de requisito.

Campos
required_shipment_type_alternatives[]

string

Lista de tipos de frete 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 do tipo required_shipment_type_alternatives seja visitada no mesmo trajeto.

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

requirement_mode

RequirementMode

Modo aplicado ao requisito.

RequirementMode

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

Enums
REQUIREMENT_MODE_UNSPECIFIED Modo de requisito não especificado. Esse valor nunca pode ser usado.
PERFORMED_BY_SAME_VEHICLE Neste modo, todos os "dependentes" remessas devem compartilhar o mesmo veículo que pelo menos um dos remessas.
IN_SAME_VEHICLE_AT_PICKUP_TIME

Com o modo IN_SAME_VEHICLE_AT_PICKUP_TIME, todos os "dependentes" os pedidos precisam ter pelo menos um item remessa no veículo no momento da retirada.

Uma condição A retirada de pedidos precisa ter:

  • Um campo "obrigatório" somente para entrega entrega entregue na rota depois ou
  • Um campo "obrigatório" retirada do produto no caminho e se os requisitos tem uma entrega, esta entrega deve ser realizada após a entrega retirada da remessa.
IN_SAME_VEHICLE_AT_DELIVERY_TIME Igual antes, exceto que os envios "dependentes" precisam ter um envio "obrigatório" no veículo no momento da entrega.

SkippedShipment

Especifica os detalhes dos envios não realizados em uma solução. Em casos triviais e/ou se pudermos identificar o motivo da ação de ignorar, vamos informar o motivo aqui.

Campos
index

int32

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

label

string

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

reasons[]

Reason

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

Motivo

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

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

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

Campos
code

Code

Consulte os comentários do código.

example_exceeded_capacity_type

string

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

example_vehicle_index

int32

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

Código

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

Enums
CODE_UNSPECIFIED Isso nunca deve ser usado.
NO_VEHICLE Nenhum veículo no modelo torna todos os envios inviáveis.
DEMAND_EXCEEDS_VEHICLE_CAPACITY A demanda da remessa excede a capacidade do veículo para alguns tipos de capacidade, uma delas é example_exceeded_capacity_type.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT

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

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

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT

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

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

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT Igual ao item acima, mas comparamos apenas o tempo mínimo de viagem e o travel_duration_limit do veículo.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS O veículo não poderá realizar esse envio no melhor cenário (consulte CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT para computação de tempo) se ele começar no horário de início mais cedo: o tempo total fará com que o veículo termine após o horário de término mais recente.
VEHICLE_NOT_ALLOWED O campo allowed_vehicle_indices do frete não está vazio e o veículo não pertence a ele.

TimeWindow

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

Os limites rígidos da janela de tempo, start_time e end_time, aplicam o horário mais cedo e mais tarde do evento, de modo que start_time <= event_time <= end_time. O limite inferior da janela de tempo flexível, soft_start_time, expressa uma preferência pela ocorrência do evento em soft_start_time ou depois, incorrendo em um custo proporcional ao tempo antes de soft_start_time o evento ocorrer. 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 ao incorrer em um custo proporcional ao tempo após soft_end_time ocorrer. 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 devem 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 de hardware. Se não for especificado, ele será definido como ShipmentModel.global_start_time.

end_time

Timestamp

O horário de término da janela de tempo de hardware. 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 da janela de tempo.

soft_end_time

Timestamp

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

cost_per_hour_before_soft_start_time

double

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

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

Esse custo deve 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árias TransitionAttributes podem ser aplicadas à mesma transição. Nesse caso, todos os custos extras são somados e a restrição ou o limite mais rigoroso é aplicado, seguindo a semântica natural "E".

Campos
src_tag

string

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

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

excluded_src_tag

string

Consulte src_tag. Exatamente um de src_tag e excluded_src_tag não pode estar em branco.

dst_tag

string

Uma visita ao destino ou final do veículo corresponde se a VisitRequest.tags ou 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 de dst_tag e excluded_dst_tag não pode estar em branco.

cost

double

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

cost_per_kilometer

double

Especifica um custo por quilômetro aplicado à distância percorrida durante essa transição. A soma de todos os valores Vehicle.cost_per_kilometer especificados nos veículos é maior.

distance_limit

DistanceLimit

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

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

delay

Duration

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

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

Veículo

Modela um veículo em um problema de envio. Resolver um problema de frete criará um trajeto entre start_location e end_location para este veículo. Um trajeto é uma sequência de visitas (consulte ShipmentRoute).

Campos
display_name

string

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

travel_mode

TravelMode

O meio de transporte que afeta as vias utilizáveis pelo veículo e a velocidade dele. Consulte também travel_duration_multiple.

route_modifiers

RouteModifiers

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

start_location

LatLng

Localização geográfica em que o veículo inicia antes de retirar qualquer remessa. Se não for especificado, o veículo será iniciado na primeira retirada. Se o modelo de envio tiver matrizes de duração e distância, start_location não precisará ser especificado.

start_waypoint

Waypoint

Waypoint que representa uma localização geográfica em que o veículo começa antes de retirar qualquer remessa. Se start_waypoint e start_location não forem especificados, o veículo será iniciado no primeiro embarque. Se o modelo de envio tiver matrizes de duração e distância, start_waypoint não precisará ser especificado.

end_location

LatLng

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

end_waypoint

Waypoint

Waypoint que representa uma localização geográfica em que o veículo termina depois de concluir o último VisitRequest. Se end_waypoint e end_location não forem especificados, o ShipmentRoute do veículo vai terminar imediatamente quando ele completar o último VisitRequest. Se o modelo de envio tiver matrizes de duração e distância, end_waypoint não precisará ser especificado.

start_tags[]

string

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

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

end_tags[]

string

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

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

start_time_windows[]

TimeWindow

Janelas de tempo em que o veículo pode partir do local de início. Elas 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 do mesmo campo repetido precisam estar separadas, ou seja, não podem se sobrepor nem estar adjacentes a outra, e precisam estar em ordem cronológica.

cost_per_hour_after_soft_end_time e soft_end_time só poderão 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 de destino. Elas 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 do mesmo campo repetido precisam estar separadas, ou seja, não podem se sobrepor nem estar adjacentes a outra, e precisam estar em ordem cronológica.

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

unloading_policy

UnloadingPolicy

Política de descarregamento aplicada ao veículo.

load_limits

map<string, LoadLimit>

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

cost_per_hour

double

Custos do veículo: todos os custos 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 pelo trajeto e inclui os tempos de viagem, de espera e de visita. Usar cost_per_hour em vez de apenas cost_per_traveled_hour pode resultar em latência extra.

cost_per_traveled_hour

double

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

cost_per_kilometer

double

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

fixed_cost

double

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

used_if_route_is_empty

bool

Este campo só é válido para veículos quando o trajeto deles não inclui envios. Ele indica se o veículo deve ser considerado usado ou não nesse caso.

Se verdadeiro, o veículo vai do início ao local de destino, mesmo que não atenda nenhuma remessa, e os custos de tempo e distância resultantes desse início --> final da viagem são consideradas.

Caso contrário, ele não vai do ponto inicial até o local final, e não há break_rule nem 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 um determinado OptimizeToursResponse, a duração do trajeto de um veículo é a diferença entre o vehicle_end_time e o vehicle_start_time dele.

travel_duration_limit

DurationLimit

Limite aplicado à duração da viagem no 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 uma determinada OptimizeToursResponse, a distância do trajeto é a soma de todas as transitions.travel_distance_meters dela.

extra_visit_duration_for_visit_type

map<string, Duration>

Especifica um mapa das strings visit_types para durações. A duração é um tempo além de VisitRequest.duration que será coletado em visitas com a visit_types especificada. Essa duração adicional da visita adiciona custo se cost_per_hour for especificado. As chaves (ou seja, visit_types) não podem ser strings vazias.

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

break_rule

BreakRule

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

label

string

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

ignore

bool

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

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

Se uma remessa for realizada por um veículo ignorado em injected_solution_constraint e qualquer coleta/entrega relacionada for restrita a permanecer no veículo (ou seja, não 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 como 2.0 significa que o veículo é mais lento e tem tempos de viagem que são o dobro do de veículos padrão. Esse múltiplo não afeta a duração das visitas. Ela vai afetar o custo se cost_per_hour ou cost_per_traveled_hour forem 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 após a aplicação desse múltiplo, mas antes de realizar qualquer operação numérica. Portanto, um pequeno múltiplo 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. Pode ser dura ou mole.

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

Campos
max_duration

Duration

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

soft_max_duration

Duration

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

Se definido, soft_max_duration não pode ser 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áximo, mas que, quando violado, faz com que a rota incorra em um custo quadrático na duração. Esse custo é somado a outros custos definidos no modelo com a mesma unidade.

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

max_duration - quadratic_soft_max_duration <= 86400 seconds

cost_per_hour_after_soft_max

double

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

  cost_per_hour_after_soft_max * (duration - soft_max_duration)

O custo não pode ser negativo.

cost_per_square_hour_after_quadratic_soft_max

double

Custo por hora quadrada incorrida 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 dependerá da duração da seguinte forma:

  cost_per_square_hour_after_quadratic_soft_max *
  (duration - quadratic_soft_max_duration)^2

O custo não pode ser negativo.

LoadLimit

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

Campos
soft_max_load

int64

Um limite flexível de 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 deste veículo, a seguinte penalidade de custo será aplicada (apenas uma vez por veículo): (carga - soft_max_load) * cost_per_unit_above_soft_max. Todos os custos são somados e precisam estar na mesma unidade que Shipment.penalty_cost.

start_load_interval

Interval

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

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.

Intervalo

Intervalo de valores de carga aceitáveis.

Campos
min

int64

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

max

int64

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

TravelMode

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

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

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

UnloadingPolicy

Política sobre como um veículo pode ser descarregado. Aplicável apenas a fretes com retirada e entrega.

Outros envios são sem custo financeiro em qualquer lugar do trajeto, independentemente da unloading_policy.

Enums
UNLOADING_POLICY_UNSPECIFIED Política de descarregamento não especificada; as entregas precisam ocorrer somente após as retiradas correspondentes.
LAST_IN_FIRST_OUT As entregas precisam ser feitas em ordem inversa à das retiradas
FIRST_IN_FIRST_OUT As entregas precisam ser feitas no mesmo pedido das retiradas

Ponto de referência

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

Campos
side_of_road

bool

Opcional. Indica que o local deste waypoint deve ter uma preferência quanto à parada do veículo 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 estrada para o qual o local está direcionado do centro da estrada. Esta opção não funciona para "WALKING" meio de transporte.

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 por meio de coordenadas geográficas, incluindo um cabeçalho opcional.

place_id

string

O ID de lugar do PDI associado ao waypoint.