Este exemplo mostra como usar atributos de transição para priorizar rotas em que coletas e entregas próximas são realizadas pelo mesmo veículo em um bloco de tempo. Para saber mais sobre 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 rua.
- Outras entregas estão mais adiante na rua.
- As entregas não têm tempo de entrega especificado.
- Independentemente da programação de visitas, o veículo precisa passar por essa rua duas vezes: uma pela manhã, no caminho do depósito, e outra à noite, no caminho de volta.
- A distância total percorrida e a duração da rota são sempre as mesmas, independentemente 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 tratados pela manhã e C à noite, e o custo da solução seria o mesmo que se os três fossem tratados ao mesmo tempo.
Custo por quilômetro com um limite
Para agrupar visitas próximas, primeiro selecione uma distância limite. 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 em um raio de 100 metros, defina um custo alto nos primeiros 100 metros de cada transição e um custo menor para qualquer metro adicional da transição. Como os primeiros 100 metros são os mais caros, o otimizador faz as maiores economias usando transições mais curtas do que o limite de 100 metros, mesmo que isso signifique estender o comprimento geral 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_tageTransitionAttributes.excluded_dst_tagpara essa tag. - Configure
TransitionAttributes.distance_limitcom a distância e os custos do limite:- Defina
DistanceLimit.soft_max_meterscomo o limite selecionado. - Defina
DistanceLimit.cost_per_kilometer_below_soft_maxcomo o custo por quilômetro abaixo do limite. - Defina
DistanceLimit.cost_per_kilometer_above_soft_maxcomo 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 e B no caminho de ida e C no caminho de volta
Nessa solução, os envios são divididos em duas travessias dessa rua. Dois deles são entregues na primeira travessia, e o restante é entregue 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→outro | 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 | 1.080 m | 100 m | 5 | 980 m | 0,98 |
| Total | 450 m | 22,5 | 3.710 m | 3,71 | |
O custo geral é calculado como a soma dos dois custos por quilômetro:
- o custo por quilômetro abaixo do limite (50) multiplicado pela distância total percorrida abaixo do limite (450 m = 0,45 km);
- o custo por quilômetro acima do limite (1) multiplicado pela distância total percorrida acima do limite (3.710 m = 3,71 km).
O custo geral é, portanto, 0,45 * 50 + 3,71 * 1 = 22,5 + 3,71 = 26,21.
Solução 2: realizar A, B e C no caminho de ida e nada no caminho de volta
Nessa solução, ao contrário da solução 1, todos os três envios são entregues "em grupo" durante uma travessia da rua. Na outra travessia, o veículo não para. Novamente, há cinco transições, mas os comprimentos e as composições 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 |
| outro→depósito | 2.080 m | 100 m | 5 | 1.980 m | 1,98 |
| Total | 380 m | 19 | 3.780 m | 3,78 | |
Usando o mesmo cálculo da solução 1, o custo geral é 0,38 * 50 + 3,78 * 1 = 19 + 3,78 = 22,78, e realizar todas as visitas em um bloco de tempo tem um custo menor do que realizá-las em dois grupos. Você pode reforçar esse efeito por
aumentando
DistanceLimit.cost_per_kilometer_below_soft_max.
Por que um custo baixo por quilômetro abaixo do limite não funciona
Como você quer preferir transições curtas em vez de longas, pode ser tentador dar 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 o maior efeito, preferindo transições que tenham perto 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 | |
| Quilômetros abaixo do limite | 0,45 | 0,38 | 0,45 | 0,38 |
| Custo por quilômetro abaixo do limite | 1,00 | 1,00 | 50,00 | 50,00 |
| Quilômetros acima do limite | 3,71 | 3,78 | 3,71 | 3,78 |
| Custo por quilômetro 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 é maior para a rota em que as visitas são agrupadas, o que é o oposto do que você queria alcançar.