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.
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:
- Aby dopasować wszystkie możliwe przejścia, wybierz tag, który nie jest używany w modelu, np.
UNUSED_TAG
. Ustaw dla tego tagu wartościTransitionAttributes.excluded_src_tag
iTransitionAttributes.excluded_dst_tag
. - Skonfiguruj
TransitionAttributes.distance_limit
z wartościami progowymi odległości i kosztów:- Ustaw
DistanceLimit.soft_max_meters
na wybrany próg. - Ustaw
DistanceLimit.cost_per_kilometer_below_soft_max
na koszt za kilometr poniżej progu. - Ustaw
DistanceLimit.cost_per_kilometer_above_soft_max
na koszt za kilometr powyżej progu.
- Ustaw
{
"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ąć.