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

Ten przykład pokazuje, jak używać atrybutów przejścia, aby nadawać priorytet trasom, na których odbiory i dostawy w pobliżu 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ą planowane na późniejszy termin.
  • Dostawy nie mają określonego czasu dostawy.
  • Niezależnie od harmonogramu wizyt pojazd musi przejechać tę drogę dwukrotnie: raz rano w drodze z bazy i raz wieczorem w drodze powrotnej.
  • Łączna odległość i czas trwania trasy są zawsze takie same, niezależnie od tego, kiedy wykonywane są czynności A, B i C.

Przykład z dostawami przesyłek na tej samej trasie. Na drodze z magazynu do innych przesyłek znajdują się 3 przesyłki: A, B i C. Punkt A znajduje się 1000 m od bazy, punkt B jest o 50 m dalej, a punkt C jest 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 używa tylko kosztu za godzinę i kosztu za kilometr, zoptymalizowana trasa może obejmować obsługę lokalizacji A i B rano, a lokalizacji C wieczorem. Koszt rozwiązania będzie taki sam, jak w przypadku obsługi wszystkich 3 lokalizacji w tym samym czasie.

Koszt za kilometr z progiem

Aby pogrupować wizyty w pobliżu, musisz najpierw wybrać odległość progową. Jest to maksymalna odległość między 2 wizytami, które uważasz za bliskie. W tym przykładzie użyto progu 100 metrów, co odpowiada mniej więcej jednej przecznicy w obszarze miejskim. Możesz zwiększyć lub zmniejszyć próg, aby dostosować go do potrzeb firmy i preferencji kierowców.

Aby pogrupować wizyty w pobliżu w odległości 100 metrów od siebie, ustaw wysoki koszt pierwszych 100 metrów każdego przejścia i niższy koszt dodatkowych metrów przejścia. Ponieważ pierwsze 100 metrów jest najdroższe, optymalizator generuje największe oszczędności, korzystając z przejść krótszych niż 100 metrów, nawet jeśli oznacza to wydłużenie całej trasy.

Aby skonfigurować koszty, dodaj nowy wpis do 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 dopasować wszystkie możliwe przejścia. Więcej informacji znajdziesz w artykule Jak dopasować 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ą podzielone na 2 przejazdy tą drogą. Dwa z nich są dostarczane podczas pierwszego przejazdu, 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 m 0
B→other 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

Łączny koszt jest obliczany jako suma 2 kosztów za kilometr:

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

Łączny 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 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 „jako grupa” podczas jednego przejazdu drogą. Podczas drugiego przejazdu pojazd w ogóle się nie zatrzymuje. Ponownie mamy 5 przejść, ale ich długość i kompozycja są inne:

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
other→depot 2080 m 100 m 5 1980 m 1,98
Łącznie 380 m 19 3780 m 3,78

Korzystając z tych samych obliczeń co w rozwiązaniu 1, łączny koszt wynosi 0,38 * 50 + 3,78 * 1 = 19 + 3,78 = 22,78. Przeprowadzenie wszystkich wizyt w jednym bloku czasowym jest tańsze niż przeprowadzenie 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ż chcesz preferować krótkie przejścia, możesz ulec pokusie, aby przypisać wysoki koszt za kilometr do długich przejść i zachować niski koszt za kilometr w przypadku krótkich przejść. W rzeczywistości 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.

Możesz zobaczyć ten efekt na 2 przykładowych rozwiązaniach. 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
Klucze KMS poniżej progu 0,45 0,38 0,45 0,38
Koszt za KM poniżej progu 1,00 1,00 50 50
KM powyżej progu 3,71 3,78 3,71 3,78
Koszt za kilometr powyżej progu 50 50 1,00 1,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 pogrubieniem. Jak widać, gdy użyjesz wysokiego kosztu powyżej progu, łączny koszt trasy jest teraz wyższy w przypadku trasy, na której wizyty są pogrupowane, co jest przeciwieństwem tego, co chcesz osiągnąć.