ShipmentModel

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

  • o custo de deslocamento dos veículos (soma do custo por tempo total, custo por tempo de viagem e custo fixo de todos os veículos).
  • as penalidades de remessa não executadas.
  • o custo da duração global das remessas.
Representação JSON
{
  "shipments": [
    {
      object (Shipment)
    }
  ],
  "vehicles": [
    {
      object (Vehicle)
    }
  ],
  "globalStartTime": string,
  "globalEndTime": string,
  "globalDurationCostPerHour": number,
  "durationDistanceMatrices": [
    {
      object (DurationDistanceMatrix)
    }
  ],
  "durationDistanceMatrixSrcTags": [
    string
  ],
  "durationDistanceMatrixDstTags": [
    string
  ],
  "transitionAttributes": [
    {
      object (TransitionAttributes)
    }
  ],
  "shipmentTypeIncompatibilities": [
    {
      object (ShipmentTypeIncompatibility)
    }
  ],
  "shipmentTypeRequirements": [
    {
      object (ShipmentTypeRequirement)
    }
  ],
  "precedenceRules": [
    {
      object (PrecedenceRule)
    }
  ],
  "maxActiveVehicles": integer
}
Campos
shipments[]

object (Shipment)

Conjunto de remessas que devem ser executados no modelo.

vehicles[]

object (Vehicle)

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

globalStartTime

string (Timestamp format)

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

O período do modelo precisa ser inferior a um ano, ou seja, globalEndTime e globalStartTime precisam ter uma distância de 31536.000 segundos entre si.

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

Um carimbo de data/hora no formato UTC "Zulu" RFC3339, com resolução de nanossegundos e até nove dígitos fracionários. Exemplos: "2014-10-02T15:01:23Z" e "2014-10-02T15:01:23.045123456Z".

globalEndTime

string (Timestamp format)

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

Um carimbo de data/hora no formato UTC "Zulu" RFC3339, com resolução de nanossegundos e até nove dígitos fracionários. Exemplos: "2014-10-02T15:01:23Z" e "2014-10-02T15:01:23.045123456Z".

globalDurationCostPerHour

number

A "duração global" do plano geral é a diferença entre o horário de início mais cedo 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 a conclusão mais próxima do job, por exemplo. Esse custo precisa estar na mesma unidade que Shipment.penalty_cost.

durationDistanceMatrices[]

object (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 useGeodesicDistances. Se não estiver vazio, useGeodesicDistances não poderá ser verdadeiro, e durationDistanceMatrixSrcTags e durationDistanceMatrixDstTags não poderão estar vazios.

Exemplos de uso:

  • Há dois locais: locA e locB.
  • 1 veículo iniciando seu trajeto em locA e terminando em locA.
  • 1 solicitação de visita de retirada em locB.
model {
  vehicles { startTags: "locA"  endTags: "locA" }
  shipments { pickups { tags: "locB" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixDstTags: "locA"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrices {
    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 iniciando seu trajeto em locA e terminando em locB, usando a matriz "rápido".
  • 1 veículo iniciando seu trajeto em locB e terminando em locB, usando a matriz "lento".
  • 1 veículo iniciando seu trajeto em locB e terminando em locB, usando a matriz "rápido".
  • 1 solicitação de visita de retirada em locC.
model {
  vehicles { startTags: "locA" endTags: "locB" startTags: "fast" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "slow" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "fast" }
  shipments { pickups { tags: "locC" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixSrcTags: "locC"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrixDstTags: "locC"
  durationDistanceMatrices {
    vehicleStartTag: "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
    }
  }
  durationDistanceMatrices {
    vehicleStartTag: "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
    }
  }
}
durationDistanceMatrixSrcTags[]

string

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

As tags correspondem a VisitRequest.tags ou Vehicle.start_tags. Um determinado VisitRequest ou Vehicle precisa corresponder exatamente a uma tag nesse campo. As tags de origem, destino e matriz de um Vehicle podem ser as mesmas. De maneira semelhante, as tags de origem e de destino de um 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, durationDistanceMatrices não poderá ficar vazio.

durationDistanceMatrixDstTags[]

string

Tags que definem os destinos das matrizes de duração e distância. durationDistanceMatrices(i).rows(j).durations(k) (resp. durationDistanceMatrices(i).rows(j).meters(k)) define a duração (resp. a distância) da viagem de visitas com tag durationDistanceMatrixSrcTags(j) a visitas com tag durationDistanceMatrixDstTags(k) na matriz i.

As tags correspondem a VisitRequest.tags ou Vehicle.start_tags. Um determinado VisitRequest ou Vehicle precisa corresponder exatamente a uma tag nesse campo. As tags de origem, destino e matriz de um Vehicle podem ser as mesmas. De maneira semelhante, as tags de origem e de destino de um 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, durationDistanceMatrices não poderá ficar vazio.

transitionAttributes[]

object (TransitionAttributes)

Atributos de transição adicionados ao modelo.

shipmentTypeIncompatibilities[]

object (ShipmentTypeIncompatibility)

Conjuntos de envios_types incompatíveis (consulte ShipmentTypeIncompatibility).

shipmentTypeRequirements[]

object (ShipmentTypeRequirement)

Conjuntos de requisitos de shipmentType (consulte ShipmentTypeRequirement).

precedenceRules[]

object (PrecedenceRule)

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

maxActiveVehicles

integer

Restringe o número máximo de veículos ativos. Um veículo está ativo se o trajeto tem pelo menos uma remessa. Isso pode ser usado para limitar o número de trajetos nos casos 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 usar. Precisa ser estritamente positivo.

Envio

O envio de um único item, de uma das coletas até uma das entregas. Para que a remessa seja considerada como realizada, um veículo exclusivo precisa visitar um dos locais de retirada (e diminuir a capacidade disponível). Depois, visitar um dos locais de entrega mais tarde e aumentar a capacidade disponível novamente.

Representação JSON
{
  "displayName": string,
  "pickups": [
    {
      object (VisitRequest)
    }
  ],
  "deliveries": [
    {
      object (VisitRequest)
    }
  ],
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "allowedVehicleIndices": [
    integer
  ],
  "costsPerVehicle": [
    number
  ],
  "costsPerVehicleIndices": [
    integer
  ],
  "pickupToDeliveryAbsoluteDetourLimit": string,
  "pickupToDeliveryTimeLimit": string,
  "shipmentType": string,
  "label": string,
  "ignore": boolean,
  "penaltyCost": number,
  "pickupToDeliveryRelativeDetourLimit": number
}
Campos
displayName

string

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

pickups[]

object (VisitRequest)

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

deliveries[]

object (VisitRequest)

Conjunto de alternativas de entrega associadas ao envio. Caso não seja especificado, o veículo só vai precisar visitar um local correspondente às retiradas.

loadDemands

map (key: string, value: object (Load))

As demandas de carga do frete (por exemplo, peso, volume, número de paletes etc.). As chaves no mapa devem ser identificadores que descrevam o tipo de carga correspondente, incluindo, idealmente, 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.

Um objeto com uma lista de pares "key": value. Exemplo: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

allowedVehicleIndices[]

integer

O conjunto de veículos que podem realizar esta remessa. Se estiver vazia, ela pode ser realizada por todos os veículos. Os veículos são fornecidos pelo índice na lista vehicles do ShipmentModel.

costsPerVehicle[]

number

Especifica o custo incorrido quando esta encomenda é entregue por cada veículo. Se especificado, ele precisa incluir:

  • o mesmo número de elementos que costsPerVehicleIndices. costsPerVehicle[i] corresponde ao veículo costsPerVehicleIndices[i] do modelo.
  • o mesmo número de elementos que há veículos no modelo. O i-ésimo elemento corresponde ao veículo #i do modelo.

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

costsPerVehicleIndices[]

integer

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

pickupToDeliveryAbsoluteDetourLimit

string (Duration format)

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

Por exemplo, que t seja o menor tempo necessário para ir da alternativa de retirada selecionada diretamente à alternativa de entrega selecionada. Em seguida, definir pickupToDeliveryAbsoluteDetourLimit aplica:

startTime(delivery) - startTime(pickup) <=
t + pickupToDeliveryAbsoluteDetourLimit

Se os limites relativos e absolutos forem especificados na mesma remessa, será usado o limite mais limitador para cada par de coleta/entrega possível. A partir de 2017/10, os desvios serão aceitos apenas quando a duração das viagens não depender de veículos.

Uma duração em segundos com até nove dígitos fracionários, terminando em "s". Exemplo: "3.5s".

pickupToDeliveryTimeLimit

string (Duration format)

Especifica a duração máxima entre o início da retirada e o início da entrega de uma remessa. Se especificado, ele 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.

Uma duração em segundos com até nove dígitos fracionários, terminando em "s". Exemplo: "3.5s".

shipmentType

string

String que especifica um "tipo" para este envio. Esse recurso pode ser usado para definir incompatibilidades ou requisitos entre o shipment_types. Consulte shipmentTypeIncompatibilities e shipmentTypeRequirements no ShipmentModel.

É diferente de visitTypes, que é especificado para uma única visita: todas as retiradas/entregas pertencentes à mesma remessa compartilham o mesmo shipmentType.

label

string

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

ignore

boolean

Se verdadeiro, pular este envio, mas não aplicar uma penaltyCost.

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

É permitido ignorar uma remessa realizada em injectedFirstSolutionRoutes ou injectedSolutionConstraint. O solucionador remove as visitas de coleta/entrega relacionadas do trajeto em questão. precedenceRules que fazem referência a fretes ignorados também serão ignorados.

penaltyCost

number

Se o frete não for concluído, essa penalidade será adicionada ao custo total dos trajetos. Uma remessa é considerada concluída quando uma das alternativas de coleta e entrega é 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 é especificada, ela é considerada infinita, ou seja, o envio precisa ser concluído.

pickupToDeliveryRelativeDetourLimit

number

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

Por exemplo, que t seja o menor tempo necessário para ir da alternativa de retirada selecionada diretamente à alternativa de entrega selecionada. Em seguida, definir pickupToDeliveryRelativeDetourLimit aplica:

startTime(delivery) - startTime(pickup) <=
std::ceil(t * (1.0 + pickupToDeliveryRelativeDetourLimit))

Se os limites relativos e absolutos forem especificados na mesma remessa, será usado o limite mais limitador para cada par de coleta/entrega possível. A partir de 2017/10, os desvios serão aceitos apenas quando a duração das viagens não depender de veículos.

VisitRequest

Solicitação de visita que pode ser feita por um veículo: ela tem uma localização geográfica (ou duas, conforme mostrado abaixo), os horários de abertura e fechamento representados por janelas e um tempo de duração do serviço (tempo gasto pelo veículo depois que ele chegou até a coleta ou a entrega de produtos).

Representação JSON
{
  "arrivalLocation": {
    object (LatLng)
  },
  "arrivalWaypoint": {
    object (Waypoint)
  },
  "departureLocation": {
    object (LatLng)
  },
  "departureWaypoint": {
    object (Waypoint)
  },
  "tags": [
    string
  ],
  "timeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "duration": string,
  "cost": number,
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "visitTypes": [
    string
  ],
  "label": string
}
Campos
arrivalLocation

object (LatLng)

A geolocalização em que o veículo chega ao executar este VisitRequest. Se o modelo de frete tiver matrizes de distância de duração, arrivalLocation não deverá ser especificado.

arrivalWaypoint

object (Waypoint)

O waypoint a que o veículo chega ao realizar esta VisitRequest. Se o modelo de frete tiver matrizes de distância de duração, arrivalWaypoint não deverá ser especificado.

departureLocation

object (LatLng)

A geolocalização de onde o veículo parte após concluir esta VisitRequest. Pode ser omitido se for igual a arrivalLocation. Se o modelo de frete tiver matrizes de distância de duração, departureLocation não deverá ser especificado.

departureWaypoint

object (Waypoint)

O waypoint de onde o veículo parte após concluir esta VisitRequest. Pode ser omitido se for igual a arrivalWaypoint. Se o modelo de frete tiver matrizes de distância de duração, departureWaypoint não deverá ser especificado.

tags[]

string

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

timeWindows[]

object (TimeWindow)

Janelas de tempo que restringem o horário de chegada em uma visita. Um veículo pode partir fora do horário de chegada, ou seja, não é preciso inserir o horário de chegada + duração dentro de um intervalo dentro desse período. 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 fazer a visita a qualquer momento.

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

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

duration

string (Duration format)

Duração da visita, ou seja, tempo gasto pelo veículo entre a chegada e a partida (a ser adicionada ao possível tempo de espera; consulte timeWindows).

Uma duração em segundos com até nove dígitos fracionários, terminando em "s". Exemplo: "3.5s".

cost

number

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

loadDemands

map (key: string, value: object (Load))

Demandas de carga desta solicitação de visita. Ele é semelhante ao 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.

Um objeto com uma lista de pares "key": value. Exemplo: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

visitTypes[]

string

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

Um tipo só pode aparecer uma vez.

label

string

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

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 estar em conformidade com o padrão WGS84. Os valores precisam estar dentro de intervalos normalizados.

Representação JSON
{
  "latitude": number,
  "longitude": number
}
Campos
latitude

number

A latitude em graus. Precisa estar no intervalo [-90,0, +90,0].

longitude

number

A longitude em graus. Precisa estar no intervalo [-180,0, +180,0].

Ponto de referência

Encapsula um waypoint. Os waypoints indicam os locais de chegada e partida de VisitRequests, além de locais de partida e chegada dos Veículos.

Representação JSON
{
  "sideOfRoad": boolean,

  // Union field location_type can be only one of the following:
  "location": {
    object (Location)
  },
  "placeId": string
  // End of list of possible types for union field location_type.
}
Campos
sideOfRoad

boolean

Opcional. Indica que o local deste waypoint deve ter preferência para que o veículo pare em um lado específico da via. Quando você define este valor, o trajeto passa pelo local, de modo que o veículo possa parar no lado da estrada para onde o local é direcionado a partir do centro da estrada. Esta opção não funciona para o modo de viagem "WALKING".

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

object (Location)

Um ponto especificado usando coordenadas geográficas, incluindo um cabeçalho opcional.

placeId

string

O ID de lugar do PDI associado ao waypoint.

Local

Encapsula um local (um ponto geográfico e um cabeçalho opcional).

Representação JSON
{
  "latLng": {
    object (LatLng)
  },
  "heading": integer
}
Campos
latLng

object (LatLng)

Coordenadas geográficas do waypoint.

heading

integer

A bússola associada à direção do fluxo de 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 direção para o norte, 90 especifica uma orientação para o leste etc.

TimeWindow

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

Os limites de janela de tempo rígido, startTime e endTime, impõem o horário mais antigo e mais recente do evento, de modo que startTime <= event_time <= endTime. O limite inferior da janela de tempo flexível, softStartTime, expressa uma preferência para que o evento aconteça em softStartTime ou depois, incorrendo em um custo proporcional ao tempo antes de softStartTime ocorrer. O limite superior da janela de tempo flexível, softEndTime, expressa uma preferência para que o evento aconteça em softEndTime ou antes, incorrendo em um custo proporcional ao tempo após softEndTime o evento ocorrer. startTime, endTime, softStartTime e softEndTime precisam estar dentro dos limites de tempo globais (consulte ShipmentModel.global_start_time e ShipmentModel.global_end_time) e respeitar:

  0 <= `startTime` <= `softStartTime` <= `endTime` and
  0 <= `startTime` <= `softEndTime` <= `endTime`.
Representação JSON
{
  "startTime": string,
  "endTime": string,
  "softStartTime": string,
  "softEndTime": string,
  "costPerHourBeforeSoftStartTime": number,
  "costPerHourAfterSoftEndTime": number
}
Campos
startTime

string (Timestamp format)

O horário de início da janela de horário difícil. Se não for especificado, ele será definido como ShipmentModel.global_start_time.

Um carimbo de data/hora no formato UTC "Zulu" RFC3339, com resolução de nanossegundos e até nove dígitos fracionários. Exemplos: "2014-10-02T15:01:23Z" e "2014-10-02T15:01:23.045123456Z".

endTime

string (Timestamp format)

O horário de término da janela de horário difícil. Se não for especificado, ele será definido como ShipmentModel.global_end_time.

Um carimbo de data/hora no formato UTC "Zulu" RFC3339, com resolução de nanossegundos e até nove dígitos fracionários. Exemplos: "2014-10-02T15:01:23Z" e "2014-10-02T15:01:23.045123456Z".

softStartTime

string (Timestamp format)

O horário de início gradual da janela de tempo.

Um carimbo de data/hora no formato UTC "Zulu" RFC3339, com resolução de nanossegundos e até nove dígitos fracionários. Exemplos: "2014-10-02T15:01:23Z" e "2014-10-02T15:01:23.045123456Z".

softEndTime

string (Timestamp format)

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

Um carimbo de data/hora no formato UTC "Zulu" RFC3339, com resolução de nanossegundos e até nove dígitos fracionários. Exemplos: "2014-10-02T15:01:23Z" e "2014-10-02T15:01:23.045123456Z".

costPerHourBeforeSoftStartTime

number

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

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

Esse custo precisa ser positivo, e o campo só poderá ser definido se softStartTime tiver sido definido.

costPerHourAfterSoftEndTime

number

Um custo por hora adicionado a outros custos no modelo se o evento ocorrer após softEndTime, calculado da seguinte forma:

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

O custo precisa ser positivo, e o campo só poderá ser definido se softEndTime tiver sido definido.

Veículo

Modela um veículo em um problema de remessa. Resolver um problema de remessa criará um trajeto começando em startLocation e terminando em endLocation para este veículo. Um trajeto é uma sequência de visitas (consulte ShipmentRoute).

Representação JSON
{
  "displayName": string,
  "travelMode": enum (TravelMode),
  "startLocation": {
    object (LatLng)
  },
  "startWaypoint": {
    object (Waypoint)
  },
  "endLocation": {
    object (LatLng)
  },
  "endWaypoint": {
    object (Waypoint)
  },
  "startTags": [
    string
  ],
  "endTags": [
    string
  ],
  "startTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "endTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "unloadingPolicy": enum (UnloadingPolicy),
  "loadLimits": {
    string: {
      object (LoadLimit)
    },
    ...
  },
  "costPerHour": number,
  "costPerTraveledHour": number,
  "costPerKilometer": number,
  "fixedCost": number,
  "usedIfRouteIsEmpty": boolean,
  "routeDurationLimit": {
    object (DurationLimit)
  },
  "travelDurationLimit": {
    object (DurationLimit)
  },
  "routeDistanceLimit": {
    object (DistanceLimit)
  },
  "extraVisitDurationForVisitType": {
    string: string,
    ...
  },
  "breakRule": {
    object (BreakRule)
  },
  "label": string,
  "ignore": boolean,
  "travelDurationMultiple": number
}
Campos
displayName

string

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

travelMode

enum (TravelMode)

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

startLocation

object (LatLng)

Localização geográfica onde o veículo começa antes de pegar qualquer frete. Se não for especificado, o veículo iniciará na primeira retirada. Se o modelo de frete tiver matrizes de duração e distância, startLocation não deverá ser especificado.

startWaypoint

object (Waypoint)

Waypoint que representa uma localização geográfica em que o veículo inicia antes de retirar qualquer envio. Se startWaypoint e startLocation não forem especificados, o veículo iniciará na primeira retirada. Se o modelo de frete tiver matrizes de duração e distância, startWaypoint não deverá ser especificado.

endLocation

object (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 concluir o último VisitRequest. Se o modelo de frete tiver matrizes de duração e distância, endLocation não deverá ser especificado.

endWaypoint

object (Waypoint)

Waypoint que representa um local geográfico em que o veículo termina após concluir a última VisitRequest. Se endWaypoint e endLocation não forem especificados, o ShipmentRoute do veículo terminará imediatamente quando o último VisitRequest for concluído. Se o modelo de frete tiver matrizes de duração e distância, endWaypoint não deverá ser especificado.

startTags[]

string

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

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

endTags[]

string

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

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

startTimeWindows[]

object (TimeWindow)

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

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

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

endTimeWindows[]

object (TimeWindow)

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

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

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

unloadingPolicy

enum (UnloadingPolicy)

Política de descarregamento aplicada no veículo.

loadLimits

map (key: string, value: object (LoadLimit))

Capacidade 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 Shipment.load_demands. Se uma determinada chave estiver ausente do mapa, a capacidade correspondente será considerada ilimitada.

Um objeto com uma lista de pares "key": value. Exemplo: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

costPerHour

number

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

Custo por hora do trajeto do veículo. Esse custo é aplicado ao tempo total percorrido pelo trajeto e inclui tempo de viagem, tempo de espera e tempo de visita. Usar costPerHour em vez de apenas costPerTraveledHour pode resultar em latência adicional.

costPerTraveledHour

number

Custo por hora percorrida do trajeto do veículo. Esse custo é aplicado somente ao tempo de viagem no trajeto (ou seja, o valor informado no ShipmentRoute.transitions), excluindo o tempo de espera e a visita.

costPerKilometer

number

Custo por quilômetro do trajeto do veículo. Esse custo é aplicado à distância informada no ShipmentRoute.transitions e não se aplica a nenhuma distância percorrida implicitamente de arrivalLocation para departureLocation de uma única VisitRequest.

fixedCost

number

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

usedIfRouteIsEmpty

boolean

Este campo só se aplica a veículos quando o trajeto não inclui remessas. Indica se o veículo deve ser considerado como usado ou não nesse caso.

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

Caso contrário, ele não vai do início ao fim, e nenhum breakRule ou atraso (de TransitionAttributes) está programado para esse veículo. Nesse caso, o ShipmentRoute do veículo não contém informações, exceto o índice e a etiqueta do veículo.

routeDurationLimit

object (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 vehicleEndTime e vehicleStartTime.

travelDurationLimit

object (DurationLimit)

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

routeDistanceLimit

object (DistanceLimit)

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

extraVisitDurationForVisitType

map (key: string, value: string (Duration format))

Especifica um mapa de strings visitTypes para durações. A duração é o tempo adicional de VisitRequest.duration a serem realizados nas visitas com o visitTypes especificado. Essa duração de visita extra adiciona custo se costPerHour for especificado. As chaves (por exemplo, visitTypes) não podem ser strings vazias.

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

Um objeto com uma lista de pares "key": value. Exemplo: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

breakRule

object (BreakRule)

Descreve a programação de intervalo a ser aplicada neste veículo. Se estiver vazio, nenhum intervalo será programado para este veículo.

label

string

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

ignore

boolean

Se for verdadeiro, usedIfRouteIsEmpty precisará ser falso e este veículo continuará sem uso.

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

Se um frete for realizado por um veículo ignorado em injectedSolutionConstraint e qualquer retirada/entrega relacionada for restrita a permanecer no veículo (ou seja, não passar pelo nível RELAX_ALL_AFTER_THRESHOLD), ele vai ser pulado na resposta. Se uma remessa tiver um campo allowedVehicleIndices não vazio e todos os veículos permitidos forem ignorados, ela vai ser ignorada na resposta.

travelDurationMultiple

number

Especifica um fator multiplicativo que pode ser usado para aumentar ou diminuir os tempos de viagem desse veículo. Por exemplo, definir esse valor como 2,0 significa que o veículo é mais lento e tem tempos de viagem duas vezes maiores que em veículos padrão. Esse múltiplo não afeta a duração das visitas. Ela afeta o custo se costPerHour ou costPerTraveledHour 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 múltiplo pequeno pode resultar em perda de precisão.

Consulte também extraVisitDurationForVisitType abaixo.

TravelMode

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

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

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

UnloadingPolicy

Política sobre como um veículo pode ser descarregado. Isso se aplica apenas a fretes com retirada e entrega.

Outras encomendas são sem custo financeiro para ocorrer em qualquer lugar da rota, independentemente da unloadingPolicy.

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 ocorrer na ordem inversa de retirada
FIRST_IN_FIRST_OUT As entregas precisam ocorrer na mesma ordem que as de retirada

LoadLimit

Define um limite de carga aplicado a um veículo, por exemplo, "este caminhão só pode carregar até 3.500 kg". Consulte os loadLimits.

Representação JSON
{
  "softMaxLoad": string,
  "costPerUnitAboveSoftMax": number,
  "startLoadInterval": {
    object (Interval)
  },
  "endLoadInterval": {
    object (Interval)
  },
  "maxLoad": string
}
Campos
softMaxLoad

string (int64 format)

Um limite flexível da carga. Consulte os costPerUnitAboveSoftMax.

costPerUnitAboveSoftMax

number

Se a carga exceder softMaxLoad no trajeto desse veículo, a seguinte penalidade de custo vai ser aplicada (apenas uma vez por veículo): (carga - softMaxLoad) * costPerUnitAboveSoftMax. Todos os custos somam e precisam estar na mesma unidade que Shipment.penalty_cost.

startLoadInterval

object (Interval)

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

endLoadInterval

object (Interval)

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

maxLoad

string (int64 format)

A quantidade máxima aceitável de carga.

Intervalo

Intervalo de quantidades de carga aceitáveis.

Representação JSON
{
  "min": string,
  "max": string
}
Campos
min

string (int64 format)

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

max

string (int64 format)

Um carregamento máximo aceitável. Precisa ser ≥ 0. Se não for especificada, a carga máxima não será restrita por essa mensagem. Se ambos forem especificados, min precisará ser ≤ max.

DurationLimit

Um limite que define a duração máxima do trajeto de um veículo. Pode ser difícil ou suave.

Quando um campo de limite flexível é definido, o limite 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

string (Duration format)

Um limite rígido que restringe a duração ao máximo de maxDuration.

Uma duração em segundos com até nove dígitos fracionários, terminando em "s". Exemplo: "3.5s".

softMaxDuration

string (Duration format)

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

Se definido, softMaxDuration não pode ser negativo. Se maxDuration também for definido, softMaxDuration precisará ser menor que maxDuration.

Uma duração em segundos com até nove dígitos fracionários, terminando em "s". Exemplo: "3.5s".

quadraticSoftMaxDuration

string (Duration format)

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

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

maxDuration - quadraticSoftMaxDuration <= 86400 seconds

Uma duração em segundos com até nove dígitos fracionários, terminando em "s". Exemplo: "3.5s".

costPerHourAfterSoftMax

number

Custo por hora incorrido se o limite de softMaxDuration 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:

  costPerHourAfterSoftMax * (duration - softMaxDuration)

O custo não pode ser negativo.

costPerSquareHourAfterQuadraticSoftMax

number

Custo por hora quadrada incorrida se o limite de quadraticSoftMaxDuration 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:

  costPerSquareHourAfterQuadraticSoftMax *
  (duration - quadraticSoftMaxDuration)^2

O custo não pode ser negativo.

DistanceLimit

Um limite que define a distância máxima que pode ser percorrida. Pode ser difícil ou suave.

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

Representação JSON
{
  "maxMeters": string,
  "softMaxMeters": string,
  "costPerKilometerAboveSoftMax": number
}
Campos
maxMeters

string (int64 format)

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

softMaxMeters

string (int64 format)

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

Se definido, softMaxMeters deve ser menor que maxMeters e deve ser não negativo.

costPerKilometerAboveSoftMax

number

Custo por quilômetro incorrido se a distância estiver acima do limite de softMaxMeters. 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:

  (distanceMeters - softMaxMeters) / 1000.0 *
  costPerKilometerAboveSoftMax.

O custo não pode ser negativo.

BreakRule

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

  • durante a viagem entre duas visitas (que inclui o tempo 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 pode ser ligado no meio de uma pausa), o que 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 (BreakRequest)
    }
  ],
  "frequencyConstraints": [
    {
      object (FrequencyConstraint)
    }
  ]
}
Campos
breakRequests[]

object (BreakRequest)

Sequência de intervalos. Veja a mensagem BreakRequest.

frequencyConstraints[]

object (FrequencyConstraint)

Várias FrequencyConstraint podem ser aplicáveis. Todos eles precisam ser satisfeitos pelos BreakRequests desse BreakRule. Consulte FrequencyConstraint.

BreakRequest

A sequência de quebras (ou seja, o número e a ordem) de cada veículo deve ser conhecida com antecedência. Os BreakRequests repetidos definem essa sequência, na ordem em que precisam ocorrer. As janelas de tempo (earliestStartTime / latestStartTime) podem se sobrepor, mas precisam ser compatíveis com a ordem (essa opção está marcada).

Representação JSON
{
  "earliestStartTime": string,
  "latestStartTime": string,
  "minDuration": string
}
Campos
earliestStartTime

string (Timestamp format)

Obrigatório. Limite inferior (inclusivo) no início da quebra.

Um carimbo de data/hora no formato UTC "Zulu" RFC3339, com resolução de nanossegundos e até nove dígitos fracionários. Exemplos: "2014-10-02T15:01:23Z" e "2014-10-02T15:01:23.045123456Z".

latestStartTime

string (Timestamp format)

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

Um carimbo de data/hora no formato UTC "Zulu" RFC3339, com resolução de nanossegundos e até nove dígitos fracionários. Exemplos: "2014-10-02T15:01:23Z" e "2014-10-02T15:01:23.045123456Z".

minDuration

string (Duration format)

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

Uma duração em segundos com até nove dígitos fracionários, terminando em "s". Exemplo: "3.5s".

FrequencyConstraint

É possível restringir ainda mais a frequência e a duração dos intervalos especificados acima, aplicando uma frequência mínima de pausa. Por exemplo, "É preciso haver um intervalo de pelo menos uma 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 traduzido como 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 respeitarão todas essas restrições, além dos períodos e das 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 "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

string (Duration format)

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

Uma duração em segundos com até nove dígitos fracionários, terminando em "s". Exemplo: "3.5s".

maxInterBreakDuration

string (Duration format)

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

Uma duração em segundos com até nove dígitos fracionários, terminando em "s". Exemplo: "3.5s".

DurationDistanceMatrix

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

Representação JSON
{
  "rows": [
    {
      object (Row)
    }
  ],
  "vehicleStartTag": string
}
Campos
rows[]

object (Row)

Especifica as linhas da matriz de duração e distância. O número de elementos precisa ser igual a ShipmentModel.duration_distance_matrix_src_tags.

vehicleStartTag

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 startTags precisa corresponder ao vehicleStartTag de uma matriz (e apenas dessa matriz).

Todas as matrizes precisam ter um vehicleStartTag diferente.

Linha

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

Representação JSON
{
  "durations": [
    string
  ],
  "meters": [
    number
  ]
}
Campos
durations[]

string (Duration format)

Valores de duração para uma determinada linha. O número de elementos precisa ser igual a ShipmentModel.duration_distance_matrix_dst_tags.

Uma duração em segundos com até nove dígitos fracionários, terminando em "s". Exemplo: "3.5s".

meters[]

number

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

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 "AND" natural).

Representação JSON
{
  "srcTag": string,
  "excludedSrcTag": string,
  "dstTag": string,
  "excludedDstTag": string,
  "cost": number,
  "costPerKilometer": number,
  "distanceLimit": {
    object (DistanceLimit)
  },
  "delay": string
}
Campos
srcTag

string

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

Uma visita à origem ou a partida do veículo corresponde se VisitRequest.tags ou Vehicle.start_tags contiver srcTag ou excludedSrcTag (dependendo de qual desses dois campos estiver preenchido).

excludedSrcTag

string

Consulte os srcTag. Exatamente um de srcTag e excludedSrcTag não pode estar vazio.

dstTag

string

Uma visita de destino ou fim de veículo corresponde se o VisitRequest.tags ou Vehicle.end_tags contiver dstTag ou não contiver excludedDstTag (dependendo de qual desses dois campos estiver preenchido).

excludedDstTag

string

Consulte os dstTag. Exatamente um de dstTag e excludedDstTag não pode estar vazio.

cost

number

Especifica um custo para realizar essa transição. Essa unidade está na mesma unidade de todos os outros custos do modelo e não pode ser negativa. Ele é aplicado sobre todos os outros custos existentes.

costPerKilometer

number

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

distanceLimit

object (DistanceLimit)

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

A partir de 2021/06, apenas limites flexíveis são suportados.

delay

string (Duration format)

Especifica um atraso ao realizar essa transição.

Esse atraso sempre ocorre após a conclusão da visita de origem e antes de iniciar a visita de destino.

Uma duração em segundos com até nove dígitos fracionários, terminando em "s". Exemplo: "3.5s".

ShipmentTypeIncompatibility

Especifica incompatibilidades entre fretes dependendo do shippingType. A aparência de remessas incompatíveis no mesmo trajeto é restrita com base no modo de incompatibilidade.

Representação JSON
{
  "types": [
    string
  ],
  "incompatibilityMode": enum (IncompatibilityMode)
}
Campos
types[]

string

Lista de tipos incompatíveis. Duas remessas com shipment_types diferentes entre as listadas são "incompatíveis".

incompatibilityMode

enum (IncompatibilityMode)

Modo aplicado à incompatibilidade.

IncompatibilityMode

Modos que definem como a aparência de remessas incompatíveis é restrita 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 os dois forem apenas retiradas (sem entregas) ou apenas entregas (sem retiradas), eles não podem compartilhar o mesmo veículo.
  • Se uma das remessas tiver uma entrega e a outra, retirar, elas poderão usar o mesmo veículo se a primeira for entregue antes da coleta.

ShipmentTypeRequirement

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

Representação JSON
{
  "requiredShipmentTypeAlternatives": [
    string
  ],
  "dependentShipmentTypes": [
    string
  ],
  "requirementMode": enum (RequirementMode)
}
Campos
requiredShipmentTypeAlternatives[]

string

Lista de tipos alternativos de envio exigidos pela dependentShipmentTypes.

dependentShipmentTypes[]

string

Todas as remessas com um tipo no campo dependentShipmentTypes exigem que pelo menos uma remessa do tipo requiredShipmentTypeAlternatives seja visitada no mesmo trajeto.

OBSERVAÇÃO: não são permitidas cadeias de requisitos, para que um shipmentType dependa de si mesmo.

requirementMode

enum (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 Nesse modo, todas as remessas "dependentes" precisam usar o mesmo veículo que pelo menos uma das remessas "necessárias".
IN_SAME_VEHICLE_AT_PICKUP_TIME

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

Uma retirada de remessa "dependente" precisa ter:

  • Uma remessa "obrigatória" somente para entrega entregue no trajeto depois, ou
  • Uma remessa "obrigatória" coletada no trajeto anterior e, se a remessa "obrigatória" tiver uma entrega, ela deverá ser realizada após a retirada do frete "dependente".
IN_SAME_VEHICLE_AT_DELIVERY_TIME O mesmo que antes, mas os fretes "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 uma remessa): o "segundo" evento precisa começar pelo menos offsetDuration depois que o "primeiro" tiver começado.

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

Além disso, as precedências só se aplicam quando ambas as remessas são realizadas e ignoradas.

Representação JSON
{
  "firstIsDelivery": boolean,
  "secondIsDelivery": boolean,
  "offsetDuration": string,
  "firstIndex": integer,
  "secondIndex": integer
}
Campos
firstIsDelivery

boolean

Indica se o "primeiro" evento é uma entrega.

secondIsDelivery

boolean

Indica se o "segundo" evento é uma entrega.

offsetDuration

string (Duration format)

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

Uma duração em segundos com até nove dígitos fracionários, terminando em "s". Exemplo: "3.5s".

firstIndex

integer

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

secondIndex

integer

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