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.

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:
- Aby dopasować wszystkie możliwe przejścia, wybierz tag, który nie jest używany nigdzie w modelu, na przykład
UNUSED_TAG. Ustaw dla tego tagu wartościTransitionAttributes.excluded_src_tagiTransitionAttributes.excluded_dst_tag. - Skonfiguruj
TransitionAttributes.distance_limitz odległością progową i kosztami:- Ustaw
DistanceLimit.soft_max_metersna wybrany próg. - Ustaw
DistanceLimit.cost_per_kilometer_below_soft_maxna koszt za kilometr poniżej progu. - Ustaw
DistanceLimit.cost_per_kilometer_above_soft_maxna 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 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ąć.