Priorizar visitas próximas com atributos de transição

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 os atributos de transição, consulte Modelar a lógica de negócios com atributos de transição.

Neste exemplo:

  • As entregas das remessas A, B e C estão próximas umas das outras na mesma via.
  • As outras entregas estão mais adiante.
  • As entregas não têm um tempo de entrega especificado.
  • Independentemente da programação de visitas, o veículo precisa passar por essa estrada duas vezes: uma de manhã, ao sair do depósito, e outra à noite, ao voltar.
  • A distância total e a duração da rota são sempre as mesmas, independentemente de quando A, B e C são realizadas.

Exemplo com entregas de remessas na mesma rua. Há três
remessas A, B e C na estrada do depósito para outras remessas. A está a 1.000 m do depósito, B está 50 metros mais longe do depósito e C está 30 metros mais longe na mesma direção. Há outras remessas a 1.000 m de distância de C.

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 processados à noite, e o custo da solução seria o mesmo que se todos os três fossem processados 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. É possível aumentar ou diminuir o limite para atender às necessidades da sua empresa e às preferências dos motoristas.

Para agrupar visitas próximas em um raio de 100 metros, defina um custo alto para os primeiros 100 metros de cada transição e um custo menor para os metros adicionais. Como os primeiros 100 metros são os mais caros, o otimizador faz a maior economia usando transições mais curtas do que o limite de 100 metros, mesmo que isso signifique estender o comprimento geral do trajeto.

Para configurar os custos, adicione uma nova entrada a ShipmentModel.transition_attributes com as seguintes propriedades:

{
  "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 remessas ou veículos 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

Nesta seção, mostramos 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 na ida e C na volta

Nessa solução, as entregas são divididas entre as duas travessias dessa via. 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 1030 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 geral é 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 geral é de 0,45 * 50 + 3,71 * 1 = 22,5 + 3,71 = 26,21.

Solução 2: realizar A, B e C na ida, nada na volta

Nessa solução, ao contrário da solução 1, as três remessas são entregues "em grupo" durante uma travessia da estrada. Na outra travessia, o veículo não para. Novamente, há cinco transições, mas as durações e 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 30min 30min 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 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. Para reforçar esse efeito, aumente DistanceLimit.cost_per_kilometer_below_soft_max.

Por que um custo por quilômetro abaixo do limite não funciona

Como você quer priorizar transições curtas em vez de longas, pode ser tentador atribuir um custo alto por quilômetro às transições longas e manter o custo baixo por quilômetro para as transições curtas. No entanto, 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 obter o maior efeito, preferindo transições que tenham cerca de 100 metros ou mais.

Você pode ver esse efeito nas duas soluções de exemplo. Se você trocar o custo por quilômetro abaixo e acima do limite, os custos do trajeto 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 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 está 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.