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
Use 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 aos tempos de transição e aos custos calculados com base nos dados do mapa com base nos parâmetros do veículo usado.
Uma transição é o segmento da rota que conecta um local ao seguinte.
Um local se refere a qualquer um dos seguintes pontos no trajeto de um veículo:
- O ponto de partida do trajeto.
- Uma parada em que uma retirada ou entrega é feita.
- 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 às 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 de
TransitionAttributes
.
Criar modelos de cenários reais
Esta seção mostra dois exemplos pequenos de como implementar restrições de negócios reais usando atributos de transição.
Reservar horário para estacionar
Nesse cenário, o motorista precisa estacionar o veículo antes de visitar o local A. O local B está próximo, e o motorista pode usar o mesmo estacionamento para as duas visitas. Se o motorista visitar B logo após A, ele economiza tempo porque não precisa sair do estacionamento 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 um ponto de estacionamento para outro.
Quando você modela o tempo de estacionamento separadamente das durações de visita, você faz rotas em que as visitas que usam o mesmo estacionamento são agrupadas e levam menos tempo. Você torna o modelo mais preciso e também faz com que o otimizador prefira rotas em que as visitas sã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 a assinatura do cliente.Para cada vaga de estacionamento usada no modelo, use uma nova tag que não seja usada para mais nada no modelo, por exemplo,
PARKING_123
.Adicione esta tag ao seguinte:
VisitRequest.tags
em todas as solicitações de visita que usam esse local de estacionamento.Vehicle.start_tags
se o veículo iniciar o trajeto nesse estacionamento.Vehicle.end_tags
se o veículo iniciar e terminar a rota nesse estacionamento.
Para cada nova tag de estacionamento, adicione uma entrada a
ShipmentModel.transition_attributes
que adicione um atraso para o estacionamento ao vir de um outro local de estacionamento. Para fazer isso, siga estas etapas: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 inserção aShipmentModel.transition_attributes
:{ "excluded_src_tag": "
PARKING_123 ", "dst_tag": "PARKING_123 ", "delay": "150s" }
Limpeza obrigatória no final do percurso
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 à frota de veículos. A rota otimizada usa a melhor instalação de limpeza com base na localização dela e nos locais das coletas e entregas feitas pelo veículo.
- Após a limpeza, o veículo não pode fazer mais coletas ou entregas.
- O tempo de dirigir até lá e limpar o veículo é contabilizado nas 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 cujas últimas visitas são a uma instalação de limpeza. Na API Route Optimization, você faz isso proibindo transições para o ponto de passagem 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 onde o veículo está ou se torna limpo, e o segundo é para o fim do trajeto. - Para cada veículo, adicione um novo envio de entrega que represente a visita
a uma instalação de limpeza com os seguintes atributos:
- Cada local de instalação de limpeza precisa ser representado como uma solicitação de visita de entrega deste 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. Outras solicitações de visita no modelo não devem usar essa tag para que o veículo seja considerado "não limpo" ao sair. - Permita que o otimizador ignore esse envio quando o veículo não estiver sendo usado, definindo
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 realizar coletas ou entregas, supondo que ele tenha sido limpo no final do dia de trabalho anterior, e permitir que ele vá do ponto de passagem inicial diretamente para o ponto de passagem final. Mesmo que essas rotas não aconteçam na prática, permitir esse cenário ajuda a otimização a pesquisar 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íba os veículos de chegar ao ponto final do veículo quando eles não estiverem limpos, com as seguintes propriedades:Defina
TransitionAttributes.excluded_src_tag
comoCLEANED
.Defina
TransitionAttributes.dst_tag
comoROUTE_END
.Defina
TransitionAttributes.delay
como um valor grande. Quando você aumenta o tempo de espera para mais do que a duração máxima do trajeto, o otimizador não pode usar 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 fim da rota de qualquer lugar, exceto de uma instalação de limpeza e do início da rota:
{ "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 de negócios
implementada e das restrições. A definição de
TransitionAttributes.delay
é a melhor opção para implementar restrições rígidas ou expressar um trade-off em termos de
tempo gasto.
TransitionAttributes.cost
é mais adequado para implementar preferências flexíveis ou compensações expressas como um
custo adicional. Você pode combinar atrasos e custos de forma arbitrária quando o tempo
gastado e o custo estiverem envolvidos.
O exemplo de limpeza de veículos usa um atraso muito longo, porque a limpeza do veículo no final do trajeto é um requisito rígido, e o atraso longo impede que o otimizador ignore o requisito. Se você definir apenas um custo, o otimizador poderá pular a limpeza se encontrar uma maneira de compensar o custo em outro lugar, por exemplo, entregando mais remessas no tempo "economizado" sem 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 custos em combinação com os atrasos, 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 locais que não têm a tag. 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
TransitionAttributes
precisa ter uma de
TransitionAttributes.src_tag
e
TransitionAttributes.excluded_src_tag
e uma de
TransitionAttributes.dst_tag
e
TransitionAttributes.excluded_dst_tag
.
No entanto, é possível fazer a correspondência de todas as tags definindo
TransitionAttributes.excluded_src_tag
ou
TransitionAttributes.excluded_dst_tag
para 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.