Este exemplo mostra como usar atributos de transição para priorizar rotas em que as coletas e entregas próximas são realizadas pelo mesmo veículo em um período de tempo. Para saber mais sobre os atributos de transição, consulte Modelar a lógica de negócios com atributos de transição.
Neste exemplo:
- As entregas dos envios A, B e C estão próximas umas das outras na mesma estrada.
- Outras entregas estão previstas para o futuro.
- As entregas não têm horários especificados.
- Independentemente do horário da visita, o veículo precisa percorrer essa estrada duas vezes: uma de manhã, a caminho do depósito, e outra à noite, a caminho de volta.
- A distância e a duração da viagem são sempre as mesmas, independente de quando A, B e C são realizados.
Nessa situação, e para uma solicitação que usa apenas o custo por hora e o custo por quilômetro, a rota otimizada pode ter A e B processados pela manhã e C pela noite, e o custo da solução seria o mesmo se todos os três fossem processados ao mesmo tempo.
Custo por quilômetro com um limite
Para agrupar visitas próximas, primeiro é preciso selecionar uma distância mínima. Essa é a distância máxima entre duas visitas que você considera próximas. Este exemplo usa um limite de 100 metros, que corresponde aproximadamente a um quarteirão em uma área urbana. Você pode aumentar ou diminuir o limite para atender às necessidades da sua empresa e às preferências dos seus motoristas.
Para agrupar visitas próximas a até 100 metros umas das outras, defina um custo alto nos primeiros 100 metros de cada transição e um custo mais baixo para os metros adicionais da transição. Como os primeiros 100 metros são os mais caros, o otimizador faz a maior economia usando transições mais curtas que o limite de 100 metros, mesmo que isso signifique estender o comprimento total da rota.
Para configurar os custos, adicione uma nova entrada a
ShipmentModel.transition_attributes
com as seguintes propriedades:
- Para corresponder a todas as transições possíveis, escolha uma tag que não seja usada em nenhum lugar do modelo, por exemplo,
UNUSED_TAG
. DefinaTransitionAttributes.excluded_src_tag
eTransitionAttributes.excluded_dst_tag
para esta tag. - Configure
TransitionAttributes.distance_limit
com a distância e os custos de limite:- Defina
DistanceLimit.soft_max_meters
como o limite selecionado. - Defina
DistanceLimit.cost_per_kilometer_below_soft_max
como o custo por quilômetro abaixo do limite. - Defina
DistanceLimit.cost_per_kilometer_above_soft_max
como o custo por quilômetro acima do limite.
- Defina
{
"model": {
"transitionAttributes": [
{
"excluded_dst_tag": "UNUSED_TAG ",
"excluded_src_tag": "UNUSED_TAG ",
"distanceLimit": {
"softMaxMeters": 100,
"costPerKilometerBelowSoftMax": 50,
"costPerKilometerAboveSoftMax": 1,
}
}
]
}
}
A tag #unused_tag#
não pode ser usada por nenhum envio ou veículo para corresponder
a todas as transições possíveis. Para mais informações, consulte Como corresponder a todas as solicitações de visita.
Como funciona um custo alto abaixo do limite
Esta seção mostra como o custo abaixo e acima do limite afeta o custo geral de diferentes soluções do cenário de exemplo.
Solução 1: realizar A, B no caminho e C na volta
Nesta solução, as remessas são divididas nas duas travessias dessa estrada. Duas delas são enviadas na primeira travessia, e a outra é enviada na segunda. Há cinco transições:
Transição | Distância | Abaixo do limite mínimo | Acima do limite | ||
---|---|---|---|---|---|
Distância | Custo | Distância | Custo | ||
depósito →A | 1.000 m | 100 m | 5 | 900 m | 0,9 |
A→B | 50 m | 50 m | 2,5 | 0 m | 0 |
B→Outros | 1.030 m | 100 m | 5 | 930 m | 0,93 |
outro→C | 1.000 m | 100 m | 5 | 900 m | 0,9 |
C→depósito | 1080 m | 100 m | 5 | 980 m | 0,98 |
Total | 450 m | 22,5 | 3.710 m | 3,71 |
O custo total é calculado pela soma dos dois custos por quilômetro:
- o custo por quilômetro abaixo do limite (50) vezes a distância total percorrida abaixo do limite (450 m = 0,45 km),
- O custo por quilômetro acima do limite (1) vezes a distância total percorrida acima do limite (3.710 m = 3,71 km).
O custo total é 0,45 * 50 + 3,71 * 1 = 22,5 + 3,71 = 26,21.
Solução 2: executar A, B, C no caminho até lá, nada no caminho de volta
Nesta solução, ao contrário da solução 1, os três envios são entregues "como um grupo" durante uma travessia da estrada. Na outra travessia, o veículo não para. Novamente, há cinco transições, mas os comprimentos e as composições delas são diferentes:
Transição | Distância | Abaixo do limite mínimo | Acima do limite | ||
---|---|---|---|---|---|
Distância | Custo | Distância | Custo | ||
depósito →A | 1.000 m | 100 m | 5 | 900 m | 0,9 |
A→B | 50 m | 50 m | 2,5 | 0 m | 0 |
B→C | 30 m | 30 m | 1.5 | 0 m | 0 |
C→Outro | 1.000 m | 100 m | 5 | 900 m | 0,9 |
other→depot | 2.080 m | 100 m | 5 | 1980 m | 1,98 |
Total | 380 m | 19 | 3.780 m | 3,78 |
Usando a mesma computação da solução 1, o custo total é 0,38 * 50 +
3,78 * 1 = 19 + 3,78 = 22,78, e a realização de todas as visitas em um bloco de tempo tem um
custo menor do que em dois grupos. É possível reforçar esse efeito
aumentando
DistanceLimit.cost_per_kilometer_below_soft_max
.
Por que um custo por quilômetro abaixo do limite não funciona
Como você quer preferir transições curtas em vez de longas, pode ser tentador definir um custo alto por quilômetro para transições longas e manter o custo baixo por quilômetro para transições curtas. Mas isso tem um efeito inverso: como os primeiros 100 metros da transição são os mais baratos, o otimizador usa esses metros "baratos" para ter o maior efeito, preferindo transições que tenham cerca de 100 metros ou mais.
Você pode conferir esse efeito nas duas soluções de exemplo. Se você trocar o custo por quilômetro abaixo e acima do limite, os custos da rota vão mudar:
Custo alto acima do limite | Custo alto abaixo do limite | |||
---|---|---|---|---|
Solução 1 | Solução 2 | Solução 1 | Solução 2 | |
KMs abaixo do limite | 0,45 | 0.38 | 0,45 | 0.38 |
Custo por KM abaixo do limite | 1,00 | 1,00 | 50,00 | 50,00 |
KMs acima do limite | 3,71 | 3,78 | 3,71 | 3,78 |
Custo por KM acima do limite | 50,00 | 50,00 | 1,00 | 1,00 |
Custo total | 185,95 | 189,38 | 26.21 | 22,78 |
Para cada versão, o menor dos custos totais das duas soluções é destacado em negrito. Quando você usa um custo alto acima do limite, o custo total da rota em que as visitas são agrupadas fica mais alto, o que é o oposto do que você queria.