Este guia mostra possíveis usos de atributos de transição. Ele vai ensinar você a modelar cenários do mundo real em dois exemplos: incorporar o tempo para estacionar o veículo nas rotas otimizadas e garantir que cada rota termine com uma visita a um local específico.
Antes de começar
Você usa atributos de transição para adicionar custos e atrasos específicos do modelo a determinadas transições nas rotas otimizadas. Esses custos e atrasos são adicionados às durações e aos custos de transição calculados com base nos dados do mapa e nos parâmetros do veículo usado.
Uma transição é o segmento da rota que conecta um local ao próximo.
Um local se refere a qualquer um dos seguintes pontos no trajeto de um veículo:
- O ponto de partida do trajeto.
- Uma parada para retirada ou entrega.
- O ponto final do trajeto.
Para definir todos os atributos de transição do modelo, adicione-os à lista
ShipmentModel.transition_attributes
.
Cada elemento da lista define um conjunto de atributos de transição e é correspondido com transições nas rotas usando tags no local de início e no local de término da transição. Para saber mais sobre atributos de transição, consulte
a documentação de referência para
TransitionAttributes
.
Criar modelos de situações reais
Esta seção mostra dois pequenos exemplos de como implementar restrições comerciais do mundo real usando atributos de transição.
Reservar tempo para estacionamento
Nesse cenário, o motorista precisa estacionar o veículo antes de visitar o local A. O local B fica perto, e o motorista pode usar a mesma vaga de estacionamento para as duas visitas. Se o motorista visitar B logo após A, ele vai economizar tempo porque não precisará sair da vaga e estacionar o veículo novamente. Na API Route Optimization, é possível usar atributos de transição para adicionar tempo extra para estacionar o veículo somente quando o motorista se move de uma vaga para outra.
Ao modelar o tempo de estacionamento separadamente das durações das visitas, você cria rotas em que as visitas que usam o mesmo estacionamento são agrupadas e levam menos tempo. Assim, o modelo fica mais preciso, e o otimizador prefere rotas em que as visitas estão agrupadas.
Siga estas etapas para fazer isso em uma solicitação da API Route Optimization:
Use
VisitRequest.duration
apenas pelo tempo necessário para realizar a visita. Por exemplo, para entregar o pacote e coletar uma assinatura do cliente.Para cada vaga de estacionamento distinta usada no modelo, use uma nova tag que não seja usada para mais nada no modelo, por exemplo,
PARKING_123
.Adicione essa tag aos seguintes elementos:
VisitRequest.tags
em todas as solicitações de visita que usam essa vaga de estacionamento.Vehicle.start_tags
se o veículo iniciar o trajeto nessa vaga de estacionamento.Vehicle.end_tags
se o veículo começar ou terminar o trajeto nessa vaga de estacionamento.
Para cada nova tag de estacionamento, adicione uma entrada a
ShipmentModel.transition_attributes
que adicione um atraso para estacionar ao vir de uma vaga diferente fazendo o seguinte:Defina
TransitionAttributes.excluded_src_tag
eTransitionAttributes.dst_tag
comoPARKING_123
.Defina
TransitionAttributes.delay
como o tempo necessário para estacionar o veículo.
Por exemplo, quando a tag de um local é
PARKING_123
e leva 150 segundos para estacionar o veículo, adicione a seguinte entrada aShipmentModel.transition_attributes
:{ "excluded_src_tag": "PARKING_123", "dst_tag": "PARKING_123", "delay": "150s" }
Limpeza obrigatória no final do trajeto
Nesse cenário, o veículo precisa ser limpo no final do trajeto, com as seguintes restrições adicionais:
- A limpeza é feita em uma instalação especializada antes de retornar ao depósito de veículos. O trajeto otimizado usa a melhor instalação de limpeza com base na localização dela e nas localizações das coletas e entregas feitas pelo veículo.
- Depois da limpeza, o veículo não pode fazer mais coletas ou entregas.
- O tempo para chegar lá e limpar o veículo conta para as horas de trabalho do motorista e precisa se encaixar na duração máxima do trajeto.
Você modela esse requisito permitindo apenas rotas vazias ou cuja última visita seja a uma instalação de limpeza. Na API Route Optimization, isso é feito proibindo transições para o ponto de parada final do trajeto de qualquer local, exceto da instalação de limpeza ou do ponto de partida do trajeto:
- Escolha duas novas tags que não são usadas em nenhum lugar do modelo, por exemplo,
CLEANED
eROUTE_END
. O primeiro é para locais em que o veículo está ou fica limpo, e o segundo é para o final do trajeto. - Para cada veículo, adicione um novo frete somente para entrega que represente a visita
a uma instalação de limpeza com os seguintes atributos:
- Cada local de limpeza precisa ser representado como uma solicitação de visita de entrega desse envio.
- Adicione
CLEANED
aVisitRequest.tags
de cada solicitação de visita do envio da instalação de limpeza. Ele indica que um veículo que sai desse local está limpo. Outros pedidos de visita no modelo não devem usar essa tag para que o veículo seja considerado "não limpo" ao sair deles. - Permita que o otimizador pule essa entrega quando o veículo não estiver sendo usado. Para isso, defina o
penalty_cost
como um número pequeno.
Para cada veículo, adicione
CLEANED
aVehicle.start_tags
. Isso é usado para marcar o veículo como limpo antes de fazer coletas ou entregas, supondo que ele tenha sido limpo no final do dia de trabalho anterior, e permitir que ele vá do ponto de partida diretamente para o ponto de destino. Mesmo que essas rotas não aconteçam na prática, permitir esse cenário ajuda o otimizador a procurar rotas otimizadas com mais eficiência.Para cada veículo, adicione
ROUTE_END
aVehicle.end_tags
.Adicione uma nova entrada a
ShipmentModel.transition_attributes
que proíbe os veículos de chegar ao ponto de parada final quando eles não estão limpos, com as seguintes propriedades:Defina
TransitionAttributes.excluded_src_tag
comoCLEANED
.Defina
TransitionAttributes.dst_tag
comoROUTE_END
.Defina
TransitionAttributes.delay
como um valor alto. Quando você aumenta o atraso além da duração máxima do trajeto, impede que o otimizador use essa transição em um trajeto.
Por exemplo, quando a escala de tempo do modelo é de um dia útil, é possível usar um atraso de 24 horas (86.400 segundos) para proibir a transição para o final do trajeto de qualquer lugar, exceto um centro de limpeza e o início do trajeto:
{ "excluded_src_tag": "CLEANED", "dst_tag": "ROUTE_END", "delay": "86400s" }
Como escolher entre atrasos e custos
A escolha entre atrasos e custos depende da natureza da lógica e das restrições de negócios implementadas. Definir TransitionAttributes.delay
é a melhor opção para implementar restrições rígidas ou expressar uma troca em termos de tempo gasto.
TransitionAttributes.cost
é mais adequado ao implementar preferências flexíveis ou compensações expressas como um
custo adicional. É possível combinar atrasos e custos arbitrariamente quando se trata de tempo gasto e custo.
O exemplo de limpeza de veículos usa um atraso muito longo porque a limpeza do veículo no final do trajeto é um requisito obrigatório, e o longo atraso impede que o otimizador ignore o requisito. Se você definir apenas um custo, o otimizador poderá optar por pular a limpeza se encontrar uma maneira de compensar o custo em outro lugar, por exemplo, fazendo mais entregas no tempo "economizado" por não limpar o veículo.
O exemplo de estacionamento usa um atraso curto que corresponde ao tempo adicional necessário para estacionar o veículo. Também é possível usar costs em combinação com delays, se o motorista parar em um estacionamento pago.
Como adicionar um atributo de transição que corresponda a todas as solicitações de visita
Os exemplos acima usam atributos de transição que correspondem a locais com uma determinada tag ou sem ela. Mas e se você precisar adicionar atributos de transição que se aplicam a todas as transições?
Não é possível omitir as tags, porque cada mensagem TransitionAttributes
precisa ter uma das tags TransitionAttributes.src_tag
e TransitionAttributes.excluded_src_tag
, além de uma das tags TransitionAttributes.dst_tag
e TransitionAttributes.excluded_dst_tag
.
No entanto, é possível corresponder a todas as tags definindo TransitionAttributes.excluded_src_tag
ou TransitionAttributes.excluded_dst_tag
como uma tag que não é usada em nenhum lugar do modelo. Isso vai corresponder a todos os locais que não têm essa tag, mas como você escolheu intencionalmente uma tag que não é usada por nenhum local, esses atributos de transição vão corresponder a todos os locais.