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

Ten przykład pokazuje, jak za pomocą atrybutów przejścia określać priorytety tras, na których pobliskie odbiory i dostawy są realizowane przez ten sam pojazd w jednym bloku czasowym. Więcej informacji o atrybutach przejścia znajdziesz w artykule Modelowanie logiki biznesowej za pomocą atrybutów przejścia.

W tym przykładzie:

  • Dostawy przesyłek A, B i C są blisko siebie na tej samej drodze.
  • Kolejne dostawy są w drodze.
  • Dostawy nie mają określonego czasu dostawy.
  • Niezależnie od harmonogramu wizyt pojazd musi przejechać tę drogę dwa razy: raz rano w drodze z bazy i raz wieczorem w drodze powrotnej.
  • Całkowita odległość i czas trwania trasy są zawsze takie same, niezależnie od tego, kiedy wykonane zostaną czynności A, B i C.

Przykład dostaw przesyłek na tej samej drodze. W drodze z magazynu do innych przesyłek są 3 przesyłki: A, B i C. Punkt A jest oddalony od magazynu o 1000 m, punkt B – o 50 m dalej w tym samym kierunku, a punkt C – o 30 m dalej w tym samym kierunku. W odległości 1000 m od punktu C znajdują się inne przesyłki.

W takiej sytuacji w przypadku żądania, które uwzględnia tylko koszt za godzinę i koszt za kilometr, zoptymalizowana trasa może obejmować punkty A i B rano, a punkt C – wieczorem. Koszt rozwiązania będzie taki sam, jak w przypadku, gdyby wszystkie 3 punkty zostały obsłużone w tym samym czasie.

Koszt za kilometry z wartością progową

Aby pogrupować pobliskie wizyty, musisz najpierw wybrać próg odległości. Jest to maksymalna odległość między dwiema wizytami, które uznajesz za bliskie. W tym przykładzie użyto progu 100 metrów, który w przybliżeniu odpowiada jednemu blokowi w obszarze miejskim. Możesz zwiększyć lub zmniejszyć próg, aby dopasować go do potrzeb firmy i preferencji kierowców.

Aby zgrupować pobliskie wizyty w promieniu 100 metrów od siebie, ustaw wysoki koszt pierwszych 100 metrów każdej zmiany i niższy koszt kolejnych metrów zmiany. Pierwsze 100 metrów jest najdroższe, więc optymalizator uzyskuje największe oszczędności, stosując przejścia krótsze niż 100 metrów, nawet jeśli oznacza to wydłużenie całej trasy.

Aby skonfigurować koszty, dodaj nowy wpis do elementu 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 w przypadku żadnych przesyłek ani pojazdów, aby dopasować wszystkie możliwe przejścia. Więcej informacji znajdziesz w artykule Jak dopasowywać wszystkie prośby o wizytę.

Jak działa wysoki koszt poniżej progu

W tej sekcji pokazujemy, jak koszt poniżej i powyżej progu wpływa na ogólny koszt różnych rozwiązań w przykładowym scenariuszu.

Rozwiązanie 1. Wykonaj czynności A i B w drodze do celu, a czynność C w drodze powrotnej.

W tym rozwiązaniu przesyłki są dzielone na 2 przejazdy tą drogą. Dwa z nich są dostarczane podczas pierwszego przejścia, a pozostały 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 min 0
B→inne 1030 m 100 m 5 930 m 0,93
other→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 dwóch kosztów na kilometr:

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

Całkowity koszt wynosi zatem 0,45 * 50 + 3,71 * 1 = 22,5 + 3,71 = 26,21.

Rozwiązanie 2. Wykonaj czynności A, B i C w drodze do celu, a w drodze powrotnej nie rób nic.

W tym rozwiązaniu, w przeciwieństwie do rozwiązania 1, wszystkie 3 przesyłki są dostarczane „grupowo” podczas jednego przejazdu. Podczas drugiego przejazdu pojazd w ogóle się nie zatrzymuje. Ponownie mamy 5 przejść, ale ich długość i kompozycja 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 min 0
B→C 30 m 30 m 1,5 0 min 0
C→inne 1000 m 100 m 5 900 m 0,9
other→depot 2080 m 100 m 5 1980 m 1,98
Łącznie 380 m 19 3780 m 3.78

Stosując te same obliczenia co w rozwiązaniu 1, otrzymujemy łączny koszt 0,38 * 50 + 3,78 * 1 = 19 + 3,78 = 22,78. Wykonanie wszystkich wizyt w jednym bloku czasowym jest tańsze niż wykonanie ich w 2 grupach. Możesz wzmocnić ten efekt, zwiększając DistanceLimit.cost_per_kilometer_below_soft_max.

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

Ponieważ wolisz krótkie przesiadki od długich, możesz przypisać wysoki koszt za kilometr długim przesiadkom, a niski koszt za kilometr krótkim przesiadkom. Ma to jednak odwrotny skutek: ponieważ pierwsze 100 metrów przejścia jest najtańsze, optymalizator wykorzystuje te „tanie” metry w największym stopniu, preferując przejścia, które mają blisko 100 metrów lub więcej.

Ten efekt widać w 2 przykładach rozwiązań. Jeśli zamienisz koszt za kilometr poniżej i powyżej progu, koszty trasy ulegną zmianie:

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

W przypadku każdej wersji niższy z całkowitych kosztów obu rozwiązań jest wyróżniony pogrubioną czcionką. Możesz zauważyć, że gdy używasz wysokiego kosztu powyżej progu, całkowity koszt trasy jest teraz wyższy w przypadku trasy, na której wizyty są zgrupowane, co jest odwrotnością tego, co chciałeś osiągnąć.