W tej sekcji opisano niektóre opcje rozwiązania problemów z routingiem.
Limity wyszukiwania
Limity wyszukiwania kończą działanie po osiągnięciu określonego limitu, takiego jak maksymalny czas trwania lub liczba znalezionych rozwiązań. Limit wyszukiwania możesz ustawić za pomocą parametrów wyszukiwania do rozwiązania. Przykład znajdziesz w sekcji Limity czasu.
W poniższej tabeli opisano najczęstsze limity wyszukiwania.
Nazwa | Typ | Domyślna | Opis |
---|---|---|---|
solution_limit
|
int64 | kint64max, | Ogranicz liczbę rozwiązań wygenerowanych podczas wyszukiwania. |
time_limit.seconds
|
int64 | kint64max, | Ogranicz czas w wyszukiwania do sekund: |
lns_time_limit.seconds
|
int64 | 100 | Ogranicz czas w sekundach do czasu: przekończenia wyszukiwania w przypadku każdego sąsiada. |
Pierwsza strategia rozwiązania
Pierwsza strategia rozwiązania to metoda, której używa rozstrzygnięcie, aby znaleźć początkowe rozwiązanie. W tabeli poniżej znajdziesz opcje dotyczące narzędzia first_solution_strategy
.
Option | Opis |
---|---|
AUTOMATIC
|
Umożliwia on znalezienie strategii, którą należy zastosować w przypadku danego modelu. |
PATH_CHEAPEST_ARC
|
Zaczynając od węzła „start” na trasie, połącz go z węzłem, który powoduje utworzenie najtańszego segmentu trasy, a następnie rozszerz trasę, powtarzając ostatni węzeł dodany do trasy. |
PATH_MOST_CONSTRAINED_ARC
|
Podobnie jak w przypadku typu PATH_CHEAPEST_ARC , ale łuki są oceniane za pomocą selektora opartego na porównaniu, który będzie preferować najbardziej ograniczony łuk najpierw. Aby przypisać selektor do modelu routingu, użyj metody ArcIsMoreConstrainedThanArc() . |
EVALUATOR_STRATEGY
|
Podobnie jak w przypadku funkcji PATH_CHEAPEST_ARC , ale koszty łuku są oceniane za pomocą funkcji przekazanej do SetFirstSolutionEvaluator() . |
SAVINGS
|
Algorytm oszczędzania (Clarke i Wright). Odwołanie: Clarke, G. i Wright, J.W. „Scheduling Vehicles from Central Central Depot to a Delivery Points”, Operations Operations, str. 12, 1964, s. 568-581. |
SWEEP
|
Algorytm przesuwania (Wren i Holliday). Więcej informacji: Anthony Wren i Alan Holliday, komputerowe określanie harmonogramu pojazdów z jednej lub kilku stowarzyszeń do liczby obsługiwanych punktów dostawy (kwartał 1970–1977), nr 3, nr 3 (wrzesień, 1972), str. 333–344). |
CHRISTOFIDES
|
algorytm Christofides (w rzeczywistości jest to odmiana algorytmu Christofides określana za pomocą dopasowania maksymalnego, a nie maksymalnego dopasowania, co nie gwarantuje 3/2 przybliżenia dla danego metrycznego sprzedawcy). Działa w przypadku ogólnych modeli routingu pojazdów przez poszerzenie trasy do momentu, aż nie będzie można w niej umieścić węzłów. Patrz: Nicos Christofides, najgorsza analiza nowego heurystyki dla podróżnych sprzedawców, raport 388, Graduate School of Industrial Admin, CMU, 1976 r. |
ALL_UNPERFORMED
|
Dezaktywuj wszystkie węzły. Znajduje rozwiązanie tylko wtedy, gdy węzły są opcjonalne (jest to element ograniczenia połączenia z ostatecznym kosztem kary). |
BEST_INSERTION
|
Rusztowo utwórz rozwiązanie, wstawiając najtańszy węzeł na najniższą pozycję. Koszt wstawiania jest oparty na globalnej funkcji kosztu modelu routingu. Od 2022 r. działa tylko w modelach z opcjonalnymi węzłami (z kosztami skończonej kary). |
PARALLEL_CHEAPEST_INSERTION
|
Rutynowo utwórz rozwiązanie, wstawiając najtańszy węzeł na najniższą pozycję. Koszt wstawienia jest oparty na funkcji kosztów arc. Jest szybsze niż BEST_INSERTION . |
LOCAL_CHEAPEST_INSERTION
|
Rusztowo utwórz rozwiązanie, wstawiając każdy węzeł w najtańszą pozycję. Koszt wstawiania jest oparty na funkcji kosztów arcus . Różni się od węzła PARALLEL_CHEAPEST_INSERTION wybranego do wstawienia. Węzły są brane pod uwagę w kolejności utworzenia. Jest szybsze niż PARALLEL_CHEAPEST_INSERTION . |
GLOBAL_CHEAPEST_ARC
|
Powtarzaj połączenie 2 węzłów, które zapewniają najtańszy segment trasy. |
LOCAL_CHEAPEST_ARC
|
Wybierz pierwszy węzeł z niezastąpionym następcą i połącz go z węzłem, który tworzy najtańszy segment trasy. |
FIRST_UNBOUND_MIN_VALUE
|
Wybierz pierwszy węzeł z niezastąpionym następcą i połącz go z pierwszym dostępnym węzłem. To odpowiednik strategii CHOOSE_FIRST_UNBOUND połączonej z zasadą ASSIGN_MIN_VALUE (por. constraint_solver.h). |
Stan wyszukiwania
Możesz zwrócić stan wyszukiwania za pomocą metody status
modelu routingu.
Oto kod Pythona do wydrukowania stanu wyszukiwania:
print("Solver status: ", solver.status())
Spowoduje to wydrukowanie liczby całkowitej w tym znaczeniu:
Wartość | Opis |
---|---|
0 |
ROUTING_NOT_SOLVED : nie udało się jeszcze rozwiązać problemu. |
1 |
ROUTING_SUCCESS : udało się rozwiązać problem. |
2
|
ROUTING_PARTIAL_SUCCESS_LOCAL_OPTIMUM_NOT_REACHED : po wywołaniu funkcji RoutingModel.Solve() problem został rozwiązany, ale lokalna optymalizacja nie została osiągnięta. Pozostawienie większej ilości czasu umożliwiłoby
lepsze rozwiązanie. |
3 |
ROUTING_FAIL : nie znaleziono rozwiązania problemu. |
4 |
ROUTING_FAIL_TIMEOUT : osiągnięto limit czasu przed znalezieniem rozwiązania. |
5 |
ROUTING_INVALID : model, parametry modelu lub flagi są nieprawidłowe. |
6 |
ROUTING_INFEASIBLE : problem okazał się niemożliwy. |
Opcje wyszukiwania lokalnego
W tabeli poniżej znajdziesz opcje lokalnych strategii wyszukiwania (nazywane też metaheurystyką). Przykłady ustawienia tych opcji znajdziesz w sekcji Zmiana strategii wyszukiwania.
Option | Opis |
---|---|
AUTOMATIC |
Umożliwia rozstrzygniecie metabolizmu. |
GREEDY_DESCENT |
Akceptuje ulepszanie sąsiednich wyszukiwań (zmniejszających koszty), dopóki nie zostanie osiągnięta lokalna wartość minimalna. |
GUIDED_LOCAL_SEARCH |
Wykorzystuje funkcję wyszukiwania lokalnego w celu zmiany znaczenia. (por. Wyszukiwanie lokalne z przewodnikiem) to najbardziej wydajna metoda metapozycji wyznaczania trasy. |
SIMULATED_ANNEALING |
Używa symulowanej oddłużenia, aby unikać lokalnych miniatur. (por. Symulowana animacja). |
TABU_SEARCH |
Używa znaczenia wyszukiwania Tabu, by unikać lokalnych znaków minimalnych (por. Wyszukiwanie Tabu). |
GENERIC_TABU_SEARCH |
Korzysta z wyszukiwania Tabu na podstawie wartości celu rozwiązania, aby unikać lokalnych wartości minimalnych. |
Rozpowszechnianie
Nazwa | Typ | Domyślna | Opis |
---|---|---|---|
use_full_propagation
|
wartość logiczna | prawda | Stosuj ograniczenia z pełną propagacją w modelu routingu (zamiast tylko prostsza). Pełna rozpowszechnienie jest potrzebna tylko w przypadku wyszukiwania z pierwszej głębiej lub w modelach, które wymagają silnej propagacji w celu wykończenia wartości zmiennych dodatkowych. Zmiana tego ustawienia na „true” (prawda) w większości przypadków spowalnia wyszukiwanie i zwiększa wykorzystanie pamięci. |