Priorytetowe traktowanie wizyt w pobliżu dzięki atrybutom przejścia

Ten przykład pokazuje, jak używać atrybutów przejścia do ustalania priorytetów tras, na których odbiory i dostawy w pobliżu są wykonywane przez ten sam pojazd w ramach jednego bloku czasowego. Więcej informacji o atrybutach przejścia znajdziesz w artykule Modelowanie logiki biznesowej za pomocą atrybutów przejścia.

W tym przykładzie:

  • Przesyłki A, B i C znajdują się blisko siebie na tej samej drodze.
  • Dodatkowe dostawy są planowane na później.
  • Nie ma określonych terminów dostawy.
  • Niezależnie od harmonogramu wizyty pojazd musi przejechać tą drogą dwa razy: raz rano w drodze z bazy, a raz wieczorem w drodze powrotnej.
  • Całkowita odległość podróży i czas trwania trasy są zawsze takie same, niezależnie od tego, kiedy wykonywane są czynności A, B i C.

Przykład dostawy przesyłek na tej samej drodze Istnieją 3 przesyłki A, B i C w drodze z magazynu do innych przesyłek. Punkt A znajduje się 1000 m od dworca, punkt B jest o 50 metrów dalej od dworca, a punkt C jest o 30 metrów dalej w tym samym kierunku. Są też inne przesyłki w odległości 1000 m od C.

W tej sytuacji i w przypadku żądania, które wykorzystuje tylko koszt na godzinę i koszt na kilometr, zoptymalizowana trasa mogłaby obejmować punkty A i B rano, a punkt C wieczorem. Koszt rozwiązania byłby taki sam, jak gdyby wszystkie trzy punkty były obsługiwane w tym samym czasie.

Koszt na kilometr z wartością progową

Aby grupować wizyty w pobliżu, musisz najpierw wybrać odległość progową. Jest to maksymalna odległość między 2 wizytami, które uważasz za pobliskie. W tym przykładzie zastosowano próg 100 metrów, który odpowiada mniej więcej blokowi w mieście. Możesz zwiększyć lub zmniejszyć próg, aby dopasować go do potrzeb firmy i preferencji kierowców.

Aby grupować wizyty w odległości 100 metrów od siebie, możesz ustawić wysoki koszt za pierwsze 100 metrów każdego przejścia i niższy koszt za każdy dodatkowy metr przejścia. Ponieważ pierwsze 100 metrów jest najdroższe, optymalizator osiąga największe oszczędności, stosując przejścia krótsze niż próg 100 metrów, nawet jeśli oznacza to wydłużenie całkowitej długości trasy.

Aby skonfigurować koszty, dodaj nowy wpis do kolumny ShipmentModel.transition_attributes z tymi właściwościami:

{
  "model": {
    "transitionAttributes": [
      {
        "excluded_dst_tag": "UNUSED_TAG",
        "excluded_src_tag": "UNUSED_TAG",
        "distanceLimit": {
          "softMaxMeters": 100,
          "costPerKilometerBelowSoftMax": 50,
          "costPerKilometerAboveSoftMax": 1,
        }
      }
    ]
  }
}

Tag #unused_tag# nie może być używany przez żadne przesyłki ani pojazdy, aby pasowały do wszystkich możliwych przejść. Więcej informacji znajdziesz w artykule Jak dopasowywać wszystkie żądania wizyty.

Jak działa wysoki koszt poniżej progu

W tej sekcji pokazano, jak koszty poniżej i powyżej progu wpływają na łączny koszt różnych rozwiązań w przykładowym scenariuszu.

Rozwiązanie 1. Wykonaj czynności A i B na trasie tam, a C na trasie z powrotem.

W tym rozwiązaniu przesyłki są dzielone na 2 przejazdy po tej drodze. Dwa z nich są dostarczane podczas pierwszego przejścia, a trzeci podczas drugiego. Dostępnych jest 5 przejść:

Przejście Odległość Poniżej progu Powyżej progu
Odległość Koszt Odległość Koszt
depot →A 1000 m 100 m 5 900 m 0,9
A→B 50 m 50 m 2.5 0 m 0
B→other 1030 m 100 m 5 930 m 0,93
inne → C 1000 m 100 m 5 900 m 0,9
C→depot 1080 m 100 m 5 980 m 0,98
Łącznie 450 m 22,5 3710 m 3,71

Całkowity koszt jest obliczany jako suma tych 2 wartości na kilometr:

  • koszt za kilometr poniżej progu (50) pomnożony przez całkowitą odległość przebytą poniżej progu (450 m = 0,45 km),
  • koszt za kilometr powyżej progu (1) pomnożony przez całkowity przebyty dystans powyżej progu (3710 m = 3,71 km).

Całkowity koszt wynosi więc 0,45 × 50 + 3,71 × 1 = 22,5 + 3,71 = 26,21.

Rozwiązanie 2. Wykonaj czynności A, B i C na trasie tam, a na trasie powrotnej nie wykonuj żadnych czynności.

W tym rozwiązaniu, w przeciwieństwie do rozwiązania 1, wszystkie 3 przesyłki są dostarczane „w grupie” podczas jednego przejazdu. Podczas drugiej jazdy pojazd wcale się nie zatrzymuje. Ponownie mamy 5 przejść, ale ich długość i skład są różne:

Przejście Odległość Poniżej progu Powyżej progu
Odległość Koszt Odległość Koszt
depot →A 1000 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 → inne 1000 m 100 m 5 900 m 0,9
inne → depot 2080 m 100 m 5 1980 m 1,98
Łącznie 380 m 19 3780 m 3,78

Przyjmując te same założenia co w rozwiązaniu 1, ogólny koszt wynosi 0,38 × 50 + 3,78 × 1 = 19 + 3,78 = 22,78. Wykonywanie wszystkich wizyt w jednym bloku czasowym jest tańsze niż wykonywanie ich w 2 grupach. Możesz wzmocnić ten efekt, zwiększając wartość DistanceLimit.cost_per_kilometer_below_soft_max.

Dlaczego niski koszt za kilometr poniżej progu nie działa

Ponieważ chcesz, aby krótkie przejazdy były preferowane przed długimi, możesz być skłonny ustawić wysoki koszt za kilometr w przypadku długich przejazdów i utrzymać niski koszt za kilometr w przypadku krótkich przejazdów. Ma to jednak odwrotny skutek: ponieważ pierwsze 100 metrów przejazdu jest najtańsze, optymalizator wykorzystuje te „tanie” metry w największym stopniu, preferując przejazdy o długości około 100 metrów lub większej.

Możesz zobaczyć ten efekt na przykładowych rozwiązaniach. Jeśli koszt za kilometr jest poniżej lub powyżej progu, koszty trasy ulegają zmianie:

Wysoki koszt powyżej progu Wysoki koszt poniżej progu
Rozwiązanie 1 Rozwiązanie 2 Rozwiązanie 1 Rozwiązanie 2
KMs poniżej progu 0,45 0,38 0,45 0,38
Koszt KM poniżej progu 3,00 3,00 50,00 50,00
KMs powyżej progu 3,71 3,78 3,71 3,78
Koszt KM powyżej progu 50,00 50,00 3,00 3,00
Całkowity koszt 185,95 189,38 26,21 22,78

W przypadku każdej wersji niższy z łącznych kosztów obu rozwiązań jest wyróżniony pogrubioną czcionką. Gdy użyjesz wysokiego kosztu powyżej progu, łączny koszt trasy, na której wizyty są zgrupowane, będzie wyższy, co jest przeciwieństwem tego, czego oczekujesz.