- Representação JSON
- Envio
- VisitRequest
- LatLng
- Ponto de referência
- Local
- TimeWindow
- Veículo
- TravelMode
- RouteModifiers
- UnloadingPolicy
- LoadLimit
- Intervalo
- LoadCost
- DurationLimit
- DistanceLimit
- BreakRule
- BreakRequest
- FrequencyConstraint
- DurationDistanceMatrix
- Linha
- TransitionAttributes
- ShipmentTypeIncompatibility
- IncompatibilityMode
- ShipmentTypeRequirement
- RequirementMode
- PrecedenceRule
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 por não entrega.
- o custo da duração global dos fretes
Representação JSON |
---|
{ "shipments": [ { object ( |
Campos | |
---|---|
shipments[] |
Conjunto de remessas que devem ser executadas no modelo. |
vehicles[] |
Conjunto de veículos que podem ser usados para realizar visitas. |
globalStartTime |
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, o Ao usar campos Um carimbo de data/hora no formato RFC3339 UTC "Zulu", com resolução de nanossegundos e até nove dígitos fracionários. Exemplos: |
globalEndTime |
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). Um carimbo de data/hora no formato RFC3339 UTC "Zulu", com resolução de nanossegundos e até nove dígitos fracionários. Exemplos: |
globalDurationCostPerHour |
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 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 |
durationDistanceMatrices[] |
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 Exemplos de uso:
|
durationDistanceMatrixSrcTags[] |
Tags que definem as origens das matrizes de duração e distância. As tags correspondem a |
durationDistanceMatrixDstTags[] |
Tags que definem os destinos das matrizes de duração e distância; As tags correspondem a |
transitionAttributes[] |
Atributos de transição adicionados ao modelo. |
shipmentTypeIncompatibilities[] |
Conjuntos de shipment_types incompatíveis (consulte |
shipmentTypeRequirements[] |
Conjuntos de requisitos de |
precedenceRules[] |
Conjunto de regras de precedência que precisam ser aplicadas no modelo. |
maxActiveVehicles |
Limita o número máximo de veículos ativos. Um veículo está ativo se a rota dele realiza pelo menos um envio. Isso pode ser usado para limitar o número de rotas no caso de haver menos motoristas do que veículos e a frota de veículos ser heterogênea. A otimização vai selecionar o melhor subconjunto de veículos para uso. Precisa ser estritamente positivo. |
Envio
Envio de um único item, de uma das retiradas até uma das entregas. Para que a remessa seja considerada realizada, um veículo único precisa visitar um dos locais de coleta (e diminuir a capacidade extra de forma adequada), depois visitar um dos locais de entrega (e aumentar novamente as capacidades extras de acordo com isso).
Representação JSON |
---|
{ "displayName": string, "pickups": [ { object ( |
Campos | |
---|---|
displayName |
O nome de exibição do envio definido pelo usuário. Ele pode ter até 63 caracteres e usar caracteres UTF-8. |
pickups[] |
Conjunto de alternativas de retirada associadas ao envio. Se não for especificado, o veículo só precisa visitar um local correspondente às entregas. |
deliveries[] |
Conjunto de alternativas de entrega associadas à remessa. Se não for especificado, o veículo só precisa visitar um local correspondente às coletas. |
loadDemands |
Carregue 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. |
allowedVehicleIndices[] |
O conjunto de veículos que pode realizar este envio. Se estiver vazio, isso poderá ser feito por todos os veículos. Os veículos são informados pelo índice na lista |
costsPerVehicle[] |
Especifica o custo incorrido quando esta remessa for entregue por cada veículo. Se especificado, ele precisa ter:
Esses custos precisam estar na mesma unidade que |
costsPerVehicleIndices[] |
Índices dos veículos aos quais |
pickupToDeliveryAbsoluteDetourLimit |
Especifica o tempo de desvio absoluto máximo em comparação com o caminho mais curto da coleta à entrega. Se especificado, o valor não pode ser negativo e a remessa precisa conter pelo menos uma retirada e uma entrega. Por exemplo, permita que t seja o menor tempo necessário para ir da opção de retirada selecionada diretamente para a opção de entrega selecionada. Em seguida, definir
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. Duração em segundos com até nove dígitos fracionários, terminando em " |
pickupToDeliveryTimeLimit |
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 junto com as restrições de desvio máximo: a solução vai respeitar as duas especificações. Duração em segundos com até nove dígitos fracionários, terminando em " |
shipmentType |
String não vazia que especifica um "type" para essa remessa. Esse recurso pode ser usado para definir incompatibilidades ou requisitos entre Difere de |
label |
Especifica um rótulo para a remessa. Esse rótulo é informado na resposta no |
ignore |
Se verdadeiro, ignore esse envio, mas não aplique um Ignorar um envio resulta em um erro de validação quando há É permitido ignorar uma remessa realizada nos estados |
penaltyCost |
Se o envio não for concluído, essa penalidade será adicionada ao custo geral das rotas. Um envio é considerado concluído se uma das alternativas de retirada e entrega for visitada. O custo pode ser expresso na mesma unidade usada para todos os outros campos relacionados 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. |
pickupToDeliveryRelativeDetourLimit |
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, permita que t seja o menor tempo necessário para ir da opção de retirada selecionada diretamente para a opção de entrega selecionada. Em seguida, definir
Se os limites relativos e absolutos forem especificados no mesmo envio, o mais restritivo será usado para cada par de retirada/entrega possível. Desde 2017/10, os desvios só são permitidos quando a duração da viagem não depende de veículos. |
VisitRequest
Solicitação de uma visita que pode ser feita por um veículo: ele tem uma geolocalização (ou duas, consulte abaixo), horários de abertura e fechamento representados por janelas de tempo e um tempo de duração do serviço (tempo gasto pelo veículo depois que ele chega para retirar ou entregar mercadorias).
Representação JSON |
---|
{ "arrivalLocation": { object ( |
Campos | |
---|---|
arrivalLocation |
A geolocalização em que o veículo chega ao realizar essa |
arrivalWaypoint |
O waypoint onde o veículo chega ao realizar esta |
departureLocation |
O geolocalização de onde o veículo sai após concluir essa |
departureWaypoint |
O waypoint de partida do veículo depois de concluir esta |
tags[] |
Especifica as tags anexadas à solicitação de visita. Strings vazias ou duplicadas não são permitidas. |
timeWindows[] |
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 A ausência de 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.
|
duration |
Duração da visita, ou seja, o tempo gasto pelo veículo entre a chegada e a partida (para ser adicionado ao tempo de espera possível. Consulte Duração em segundos com até nove dígitos fracionários, terminando em " |
cost |
Custo para atender a esta solicitação de visita em um trajeto de veículo. Ele pode ser usado para pagar custos diferentes para cada retirada ou entrega alternativa de um produto. Esse custo precisa estar na mesma unidade que |
loadDemands |
Carregar as demandas dessa solicitação de visita. É igual ao campo |
visitTypes[] |
Especifica os tipos de visita. Pode ser usado para alocar o tempo necessário para que um veículo conclua a visita (consulte Cada tipo só pode aparecer uma vez. |
label |
Especifica um rótulo para este |
LatLng
Um objeto que representa um par de latitude/longitude. Ele é expresso como um par de valores duplos para representar graus de latitude e longitude. A menos que especificado de outra forma, esse objeto precisa seguir o padrão WGS84. Os valores precisam estar dentro de intervalos normalizados.
Representação JSON |
---|
{ "latitude": number, "longitude": number } |
Campos | |
---|---|
latitude |
A latitude em graus. Precisa estar no intervalo [-90,0, +90,0]. |
longitude |
A longitude em graus. Precisa estar no intervalo [-180,0, +180,0]. |
Ponto de referência
Encapsula um ponto de passagem. Os waypoints marcam os locais de chegada e partida de VisitRequests e os locais de início e término dos veículos.
Representação JSON |
---|
{ "sideOfRoad": boolean, // Union field |
Campos | |
---|---|
sideOfRoad |
Opcional. Indica que o local desse waypoint tem preferência para que o veículo pare em um lado específico da via. Quando você define esse valor, a rota passa pelo local para que o veículo possa parar no lado da estrada em que o local está localizado a partir do centro da via. Essa opção não funciona para o modo de deslocamento "A pé". |
Campo de união location_type . Diferentes maneiras de representar um local. location_type pode ser apenas de um dos tipos a seguir: |
|
location |
Um ponto especificado por meio de coordenadas geográficas, incluindo um cabeçalho opcional. |
placeId |
O ID de lugar do PDI associado ao waypoint. |
Local
Encapsula um local (um ponto geográfico e um título opcional).
Representação JSON |
---|
{
"latLng": {
object ( |
Campos | |
---|---|
latLng |
As coordenadas geográficas do waypoint. |
heading |
A orientação da bússola associada à direção do fluxo do tráfego. Este valor é usado para especificar o lado da estrada a ser usado para embarque e desembarque. Os valores de direção podem ser de 0 a 360, onde 0 especifica uma orientação para o norte, 90 especifica uma orientação de leste etc. |
TimeWindow
As janelas de tempo restringem o horário de um evento, como o horário de chegada em uma visita ou o início e o término de um veículo.
Os limites rígidos da janela de tempo, startTime
e endTime
, aplicam o horário mais cedo e mais tarde do evento, de modo que startTime <= event_time <=
endTime
. O limite inferior da janela de tempo flexível, softStartTime
, expressa uma preferência pela ocorrência do evento em softStartTime
ou depois, incorrendo em um custo proporcional ao tempo antes da softStartTime em que o evento ocorre. O limite superior da janela de tempo flexível, softEndTime
, expressa uma preferência para que o evento ocorra em ou antes de softEndTime
, incorrendo em um custo proporcional ao tempo após softEndTime
. startTime
, endTime
, softStartTime
e softEndTime
precisam estar dentro dos limites de tempo globais (consulte ShipmentModel.global_start_time
e ShipmentModel.global_end_time
) e devem respeitar:
0 <= `startTime` <= `endTime` and
0 <= `startTime` <= `softStartTime` and
0 <= `softEndTime` <= `endTime`.
Representação JSON |
---|
{ "startTime": string, "endTime": string, "softStartTime": string, "softEndTime": string, "costPerHourBeforeSoftStartTime": number, "costPerHourAfterSoftEndTime": number } |
Campos | |
---|---|
startTime |
O horário de início da janela de tempo de hardware. Se não for especificado, será definido como Um carimbo de data/hora no formato RFC3339 UTC "Zulu", com resolução de nanossegundos e até nove dígitos fracionários. Exemplos: |
endTime |
Horário de término da janela de tempo rígido. Se não for especificado, ele será definido como Um carimbo de data/hora no formato RFC3339 UTC "Zulu", com resolução de nanossegundos e até nove dígitos fracionários. Exemplos: |
softStartTime |
O horário de início flexível da janela de tempo. Um carimbo de data/hora no formato RFC3339 UTC "Zulu", com resolução de nanossegundos e até nove dígitos fracionários. Exemplos: |
softEndTime |
É o horário de término flexível da janela de tempo. Um carimbo de data/hora no formato RFC3339 UTC "Zulu", com resolução de nanossegundos e até nove dígitos fracionários. Exemplos: |
costPerHourBeforeSoftStartTime |
Um custo por hora adicionado a outros custos no modelo se o evento ocorrer antes do softStartTime, calculado como:
Esse custo deve ser positivo e o campo só pode ser definido se softStartTime tiver sido definido. |
costPerHourAfterSoftEndTime |
Um custo por hora adicionado a outros custos no modelo se o evento ocorrer após
Esse custo precisa ser positivo, e o campo só pode ser definido se |
Veículo
Modela um veículo em um problema de envio. A solução de um problema de envio vai criar uma rota que começa em startLocation
e termina em endLocation
para esse veículo. Um trajeto é uma sequência de visitas (consulte ShipmentRoute
).
Representação JSON |
---|
{ "displayName": string, "travelMode": enum ( |
Campos | |
---|---|
displayName |
Nome de exibição definido pelo usuário do veículo. Ele pode ter até 63 caracteres e pode usar caracteres UTF-8. |
travelMode |
O meio de transporte que afeta as vias utilizáveis pelo veículo e sua velocidade. Consulte também |
routeModifiers |
Um conjunto de condições a serem atendidas que afetam a forma como as rotas são calculadas para o veículo. |
startLocation |
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, |
startWaypoint |
Ponto de passagem que representa um local geográfico em que o veículo começa antes de pegar os envios. Se |
endLocation |
Localização geográfica onde o veículo termina depois de concluir a última |
endWaypoint |
Ponto de passagem que representa um local geográfico onde o veículo termina depois de concluir o último |
startTags[] |
Especifica tags anexadas ao início do trajeto do veículo. Strings vazias ou duplicadas não são permitidas. |
endTags[] |
Especifica tags anexadas ao final do trajeto do veículo. Strings vazias ou duplicadas não são permitidas. |
startTimeWindows[] |
Janelas de tempo em que o veículo pode sair do local de partida. Elas precisam estar dentro dos limites de tempo globais (consulte os campos As janelas de tempo pertencentes ao mesmo campo repetido precisam ser distintas, ou seja, nenhuma janela de tempo pode se sobrepor ou ser adjacente a outra, e elas precisam estar em ordem cronológica.
|
endTimeWindows[] |
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 As janelas de tempo pertencentes ao mesmo campo repetido precisam ser distintas, ou seja, nenhuma janela de tempo pode se sobrepor ou ser adjacente a outra, e elas precisam estar em ordem cronológica.
|
unloadingPolicy |
Política de descarregamento aplicada ao veículo. |
loadLimits |
Capacidades do veículo (peso, volume, número de paletes, por exemplo). As chaves no mapa são os identificadores do tipo de carregamento, consistentes com as chaves do campo |
costPerHour |
Custos do veículo: todos os custos somados e precisam estar na mesma unidade que Custo por hora da rota do veículo. Esse custo é aplicado ao tempo total do trajeto e inclui o tempo de viagem, de espera e de visita. Usar |
costPerTraveledHour |
Custo por hora percorrida do trajeto do veículo. Esse custo é aplicado somente ao tempo de viagem do trajeto (ou seja, informado em |
costPerKilometer |
Custo por quilômetro da rota do veículo. Esse custo é aplicado à distância informada no |
fixedCost |
Custo fixo aplicado se o veículo for usado para processar um envio. |
usedIfRouteIsEmpty |
Este campo só se aplica a veículos quando a rota não atende a nenhum envio. Ele indica se o veículo deve ser considerado usado ou não nesse caso. Se verdadeiro, o veículo vai da origem ao destino, mesmo que não atenda a nenhum envio, e os custos de tempo e distância resultantes da viagem de origem a destino são levados em consideração. Caso contrário, ele não vai do ponto inicial até o local final, e não há |
routeDurationLimit |
Limite aplicado à duração total da rota do veículo. Em um determinado |
travelDurationLimit |
Limite aplicado à duração da viagem no trajeto do veículo. Em um determinado |
routeDistanceLimit |
Limite aplicado à distância total da rota do veículo. Em um determinado |
extraVisitDurationForVisitType |
Especifica um mapa de strings de visitTypes para durações. A duração é um tempo além de Se uma solicitação de visita tiver vários tipos, uma duração será adicionada para cada tipo no mapa. |
breakRule |
Descreve a programação de intervalos a ser aplicada neste veículo. Se estiver vazio, nenhuma pausa será programada para esse veículo. |
label |
Especifica um rótulo para este veículo. Esse rótulo é informado na resposta como o |
ignore |
Se for verdadeiro, Se um envio for realizado por um veículo ignorado em Se um envio for realizado por um veículo ignorado em |
travelDurationMultiple |
Especifica um fator multiplicador que pode ser usado para aumentar ou diminuir o tempo de viagem desse veículo. Por exemplo, definir esse valor como 2,0 significa que o veículo é mais lento e tem tempos de viagem duas vezes maiores do que os veículos padrão. Esse múltiplo não afeta a duração das visitas. Isso afeta o custo se 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 |
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 viagem correspondente às rotas de carro (carro, ...). |
WALKING |
Modo de viagem correspondente às rotas a pé. |
RouteModifiers
Encapsula um conjunto de condições opcionais a serem atendidas ao calcular trajetos de veículos. Isso é semelhante a RouteModifiers
na API Preferred Routes da Plataforma Google Maps. Consulte: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.
Representação JSON |
---|
{ "avoidTolls": boolean, "avoidHighways": boolean, "avoidFerries": boolean, "avoidIndoor": boolean } |
Campos | |
---|---|
avoidTolls |
Especifica se é necessário evitar vias com pedágio sempre que possível. A preferência será dada às rotas que não contêm vias com pedágio. Aplica-se apenas a meios de transporte motorizados. |
avoidHighways |
Especifica se é necessário evitar rodovias quando for razoável. A preferência será dada a rotas que não contêm rodovias. Aplica-se apenas a modos de transporte motorizados. |
avoidFerries |
Especifica se balsas devem ser evitadas quando for razoável. Será dada preferência aos trajetos que não contenham balsas. Aplicável apenas aos meios de transporte motorizados. |
avoidIndoor |
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. Aplica-se apenas ao modo de viagem |
UnloadingPolicy
Política sobre como um veículo pode ser descarregado. Aplica-se apenas a remessas com retirada e entrega.
Outros envios são sem custo financeiro em qualquer lugar do trajeto, independentemente da unloadingPolicy
.
Enums | |
---|---|
UNLOADING_POLICY_UNSPECIFIED |
Política de descarregamento não especificada. As entregas só podem ser feitas 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 |
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 loadLimits
.
Representação JSON |
---|
{ "softMaxLoad": string, "costPerUnitAboveSoftMax": number, "startLoadInterval": { object ( |
Campos | |
---|---|
softMaxLoad |
Um limite flexível de carga. Consulte |
costPerUnitAboveSoftMax |
Se a carga exceder |
startLoadInterval |
O intervalo de carga aceitável do veículo no início da rota. |
endLoadInterval |
O intervalo de carga aceitável do veículo no final do trajeto. |
maxLoad |
A quantidade máxima aceitável de carga. |
costPerKilometer |
Custo de mover uma unidade de carga por um quilômetro para este veículo. Isso pode ser usado como um indicador do consumo de combustível: se a carga for um peso (em Newtons), carga*quilômetro terá a dimensão de uma energia. |
costPerTraveledHour |
Custo de viajar com uma unidade de carga durante uma hora para esse veículo. |
Intervalo
Intervalo de valores de carga aceitáveis.
Representação JSON |
---|
{ "min": string, "max": string } |
Campos | |
---|---|
min |
Uma carga mínima aceitável. Precisa ser ≥ 0. Se ambos forem especificados, |
max |
Uma carga máxima aceitável. Precisa ser ≥ 0. Se não for especificado, a carga máxima não será restringida por essa mensagem. Se ambos forem especificados, |
LoadCost
Custo de mover uma unidade de carga durante uma Transition
. Para uma determinada carga, o custo é a soma de duas partes:
- min(carregar,
loadThreshold
) *costPerUnitBelowThreshold
- max(0, load -
loadThreshold
) *costPerUnitAboveThreshold
Com esse custo, as soluções preferem atender primeiro as demandas altas ou, de forma equivalente, atender as demandas altas por último. Por exemplo, se um veículo tiver
load_limit {
key: "weight"
value {
costPerKilometer {
loadThreshold: 15
costPerUnitBelowThreshold: 2.0
costPerUnitAboveThreshold: 10.0
}
}
}
e a rota é início, retirada, retirada, entrega, entrega e término com transições:
transition { vehicle_load['weight'] { amount: 0 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 20 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
travelDistanceMeters: 1000.0 }
O custo incorrido por esse LoadCost
é (cost_below * load_below * quilômetros + cost_above * load_above * kms).
- transição 0: 0.0
- transição 1: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
- transição 2: 2,0 * 15 * 1,0 + 10,0 * (20 - 15) * 1,0 = 80,0
- transição 3: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
- transição 4: 0,0
Portanto, o LoadCost
no trajeto é 120,0.
No entanto, se a rota for início, retirada, entrega, retirada, entrega e término com transições:
transition { vehicle_load['weight'] { amount: 0 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
travelDistanceMeters: 1000.0 }
O custo incorrido por esse LoadCost
é
- transição 0: 0.0
- transição 1: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
- transição 2: 0,0
- transição 3: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
- transição 4: 0,0
Aqui, a LoadCost
no trajeto é 40.0.
LoadCost
torna as soluções com transições de carga pesada mais caras.
Representação JSON |
---|
{ "loadThreshold": string, "costPerUnitBelowThreshold": number, "costPerUnitAboveThreshold": number } |
Campos | |
---|---|
loadThreshold |
Quantidade de carga acima da qual o custo de mover uma unidade de carga muda de costPerUnitBelowThreshold para costPerUnitAboveThreshold. Precisa ser >= 0. |
costPerUnitBelowThreshold |
Custo de movimentação de uma unidade de carga, para cada unidade entre 0 e o limite. Precisa ser um valor finito e maior ou igual a 0. |
costPerUnitAboveThreshold |
Custo de mover uma unidade de carga para cada unidade acima do limite. No caso especial do limite = 0, esse é um custo fixo por unidade. Precisa ser um valor finito e maior ou igual a 0. |
DurationLimit
Um limite que define a duração máxima do trajeto de um veículo. Ele pode ser hardware ou software.
Quando um campo de limite flexível é definido, o limite máximo flexível e o custo associado precisam ser definidos juntos.
Representação JSON |
---|
{ "maxDuration": string, "softMaxDuration": string, "quadraticSoftMaxDuration": string, "costPerHourAfterSoftMax": number, "costPerSquareHourAfterQuadraticSoftMax": number } |
Campos | |
---|---|
maxDuration |
Um limite rígido que restringe a duração a, no máximo, maxDuration. Duração em segundos com até nove dígitos fracionários, terminando em " |
softMaxDuration |
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, Duração em segundos com até nove dígitos fracionários, terminando em " |
quadraticSoftMaxDuration |
Um limite flexível não impõe um limite máximo de duração, mas, quando violado, faz com que a rota incorra em um custo, quadraticamente na duração. Esse custo é somado a outros custos definidos no modelo, com a mesma unidade. Se definido,
Duração em segundos com até nove dígitos fracionários, terminando em " |
costPerHourAfterSoftMax |
Custo por hora incorrido se o limite de
O custo não pode ser negativo. |
costPerSquareHourAfterQuadraticSoftMax |
Custo por hora quadrada incorrida se o limite de O custo adicional será 0 se a duração estiver abaixo do limite. Caso contrário, o custo vai depender da duração da seguinte forma:
O custo não pode ser negativo. |
DistanceLimit
Um limite que define a distância máxima que pode ser percorrida. Pode ser dura ou mole.
Se um limite flexível for definido, softMaxMeters
e costPerKilometerAboveSoftMax
também precisarão ser definidos e não podem ser negativos.
Representação JSON |
---|
{ "maxMeters": string, "softMaxMeters": string, "costPerKilometerBelowSoftMax": number, "costPerKilometerAboveSoftMax": number } |
Campos | |
---|---|
maxMeters |
Um limite rígido que restringe a distância a no máximo maxMeters. O limite não pode ser negativo. |
softMaxMeters |
Quando um limite flexível não aplica um limite máximo de distância, mas é violado, o custo é somado a outros custos definidos no modelo com a mesma unidade. Se definido, softMaxMeters deve ser menor que maxMeters e não pode ser negativo. |
costPerKilometerBelowSoftMax |
Custo por quilômetro incorrido, aumentando até
Este custo não é suportado em |
costPerKilometerAboveSoftMax |
Custo por quilômetro incorrido se a distância estiver acima do limite de
O custo não pode ser negativo. |
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).
Representação JSON |
---|
{ "breakRequests": [ { object ( |
Campos | |
---|---|
breakRequests[] |
Sequência de intervalos. Consulte a mensagem |
frequencyConstraints[] |
Várias |
BreakRequest
A sequência de intervalos (ou seja, o número e a ordem) que se aplicam a cada veículo precisa ser conhecida com antecedência. Os BreakRequest
s repetidos definem essa sequência na ordem em que precisam ocorrer. Os intervalos de tempo (earliestStartTime
/ latestStartTime
) podem se sobrepor, mas precisam ser compatíveis com o pedido (isso é verificado).
Representação JSON |
---|
{ "earliestStartTime": string, "latestStartTime": string, "minDuration": string } |
Campos | |
---|---|
earliestStartTime |
Obrigatório. Limite inferior (inclusive) no início da pausa. Um carimbo de data/hora no formato RFC3339 UTC "Zulu", com resolução de nanossegundos e até nove dígitos fracionários. Exemplos: |
latestStartTime |
Obrigatório. Limite superior (inclusive) no início do intervalo. Um carimbo de data/hora no formato RFC3339 UTC "Zulu", com resolução de nanossegundos e até nove dígitos fracionários. Exemplos: |
minDuration |
Obrigatório. Duração mínima do intervalo. Precisa ser positivo. Duração em segundos com até nove dígitos fracionários, terminando em " |
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 12 horas, deve haver pelo menos uma pausa de pelo menos uma hora", esse exemplo seria traduzido para o seguinte FrequencyConstraint
:
{
minBreakDuration { seconds: 3600 } # 1 hour.
maxInterBreakDuration { seconds: 39600 } # 11 hours (12 - 1 = 11).
}
O tempo e a duração dos intervalos na solução vão respeitar todas essas restrições, além das janelas de tempo e durações mínimas já especificadas no BreakRequest
.
Na prática, um FrequencyConstraint
pode ser aplicado a intervalos não consecutivos. Por exemplo, a programação a seguir respeita o exemplo de "1h a cada 12h":
04:00 vehicle start
.. performing travel and visits ..
09:00 1 hour break
10:00 end of the break
.. performing travel and visits ..
12:00 20-min lunch break
12:20 end of the break
.. performing travel and visits ..
21:00 1 hour break
22:00 end of the break
.. performing travel and visits ..
23:59 vehicle end
Representação JSON |
---|
{ "minBreakDuration": string, "maxInterBreakDuration": string } |
Campos | |
---|---|
minBreakDuration |
Obrigatório. Duração mínima do intervalo para esta restrição. Não negativo. Veja a descrição de Duração em segundos com até nove dígitos fracionários, terminando em " |
maxInterBreakDuration |
Obrigatório. Intervalo máximo permitido de qualquer intervalo de tempo no trajeto que não inclua pelo menos parcialmente uma pausa de Duração em segundos com até nove dígitos fracionários, terminando em " |
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.
Representação JSON |
---|
{
"rows": [
{
object ( |
Campos | |
---|---|
rows[] |
Especifica as linhas da matriz de duração e distância. Ele precisa ter tantos elementos quanto |
vehicleStartTag |
Tag que define a quais veículos essa matriz de duração e distância se aplica. Se estiver vazio, isso se aplicará a todos os veículos e só poderá haver uma única matriz. Cada início de veículo precisa corresponder a exatamente uma matriz, ou seja, exatamente um dos campos Todas as matrizes precisam ter um |
Linha
Especifica uma linha da matriz de duração e distância.
Representação JSON |
---|
{ "durations": [ string ], "meters": [ number ] } |
Campos | |
---|---|
durations[] |
os valores de duração de uma linha específica. Ele precisa ter tantos elementos quanto Duração em segundos com até nove dígitos fracionários, terminando em " |
meters[] |
Valores de distância para uma linha específica. Se nenhum custo ou restrição se referir a distâncias no modelo, este valor pode ser deixado em branco. Caso contrário, precisa ter tantos elementos quanto |
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".
Representação JSON |
---|
{
"srcTag": string,
"excludedSrcTag": string,
"dstTag": string,
"excludedDstTag": string,
"cost": number,
"costPerKilometer": number,
"distanceLimit": {
object ( |
Campos | |
---|---|
srcTag |
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 |
excludedSrcTag |
Consulte |
dstTag |
Uma visita ao destino ou o fim do veículo corresponde se |
excludedDstTag |
Consulte |
cost |
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. |
costPerKilometer |
Especifica um custo por quilômetro aplicado à distância percorrida ao realizar essa transição. A soma de todos os valores |
distanceLimit |
Especifica um limite na distância percorrida ao realizar essa transição. A partir de 06/2021, apenas limites flexíveis serão compatíveis. |
delay |
Especifica um atraso incorrido ao realizar essa transição. Esse atraso ocorre sempre depois de terminar a visita de origem e antes de iniciar a visita de destino. Duração em segundos com até nove dígitos fracionários, terminando em " |
ShipmentTypeIncompatibility
Especifica incompatibilidades entre remessas, dependendo do tipo de remessa. A exibição de remessas incompatíveis no mesmo trajeto é restrita com base no modo de incompatibilidade.
Representação JSON |
---|
{
"types": [
string
],
"incompatibilityMode": enum ( |
Campos | |
---|---|
types[] |
Lista de tipos incompatíveis. Dois envios com |
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, dois envios 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
|
ShipmentTypeRequirement
Especifica os requisitos entre os envios com base no tipo de envio. As especificidades do requisito são definidas pelo modo do requisito.
Representação JSON |
---|
{
"requiredShipmentTypeAlternatives": [
string
],
"dependentShipmentTypes": [
string
],
"requirementMode": enum ( |
Campos | |
---|---|
requiredShipmentTypeAlternatives[] |
Lista de tipos de frete alternativos exigidos pelo |
dependentShipmentTypes[] |
Todas as remessas com um tipo no campo OBSERVAÇÃO: não são permitidas cadeias de requisitos em que um |
requirementMode |
Modo aplicado ao requisito. |
RequirementMode
Modos que definem a aparência de remessas dependentes em um trajeto.
Enums | |
---|---|
REQUIREMENT_MODE_UNSPECIFIED |
Modo de requisito não especificado. Esse valor nunca pode ser usado. |
PERFORMED_BY_SAME_VEHICLE |
Nesse modo, todas as remessas "dependentes" precisam compartilhar o mesmo veículo de pelo menos uma das remessas "obrigatórias". |
IN_SAME_VEHICLE_AT_PICKUP_TIME |
Com o modo Portanto, uma retirada de frete "dependente" precisa ter:
|
IN_SAME_VEHICLE_AT_DELIVERY_TIME |
Igual de antes, mas as remessas "dependentes" precisam ter uma remessa "obrigatória" no veículo no momento da entrega. |
PrecedenceRule
Uma regra de precedência entre dois eventos (cada evento é a retirada ou a entrega de um envio): o "segundo" evento precisa começar pelo menos offsetDuration
depois do "primeiro".
Várias precedências podem se referir aos mesmos eventos (ou relacionados), por exemplo, "A retirada de B acontece após a entrega de A" e "A retirada de C acontece após a retirada de B".
Além disso, as precedências só são aplicadas quando os dois envios são realizados e são ignoradas de outra forma.
Representação JSON |
---|
{ "firstIsDelivery": boolean, "secondIsDelivery": boolean, "offsetDuration": string, "firstIndex": integer, "secondIndex": integer } |
Campos | |
---|---|
firstIsDelivery |
Indica se o evento "primeiro" é uma entrega. |
secondIsDelivery |
Indica se o "segundo" evento é uma entrega. |
offsetDuration |
O deslocamento entre o "primeiro" e o "segundo". Pode ser negativo. Duração em segundos com até nove dígitos fracionários, terminando em " |
firstIndex |
Índice de envio do "primeiro" evento. Este campo precisa ser especificado. |
secondIndex |
Índice de envio do "segundo" evento. É necessário especificar este campo. |