Dane jest n miast, które komiwojażer ma odwiedzić, oraz odległość pomiędzy każdą parą miast.
Celem jest znalezienie najkrótszej drogi łączącej wszystkie miasta.
Wikipedia
- Implementacja problemu znajduje się w przestrzeni nazw
mhe
- Do przechowywania odległości między miastami zastosowano klasę
DistanceMatrix
przyjmująca w konstruktorze wektor punktów (struct Point
).
Zawiera ona jeszcze dwie inne przydatne funkcje:double cost(const std::vector<int>& solution)
- zwracającą odległości między miastami dla podanego rozwiązaniaint size()
- zwracającą ilość miast
- Funkcje dodatkowe:
std::vector<Point> generateRandomPoints(unsigned int num_points, int gen_seed = SEED)
- funkcja generująca losowe punkty. Używa stałejSEED
zdefiniowanej#define SEED 42
.void drawSolution(const std::vector<int>& solution)
- funkcja wypisująca w konsoli podane rozwiązanie.std::vector<std::vector<int>> getNeighbors(const std::vector<int>& vector)
- funkcja zwracająca wszystkich sąsiadów podanego rozwiązania.std::vector<int> generateRandomSolution(int size, int gen_seed=SEED)
- funkcja zwracająca losowego sąsiada podanego rozwiązania.
- Algorytm pełnego przeglądu
- Służy do obliczania deterministycznego rozwiązania dla małej ilości rozwiązań.
- przestrzeń nazw
brute
- nagłówek funkcji rozwiązującej
std::vector<std::vector<int>> generatePermutations(std::vector<int>& nums, int start)
- Reszta używanych funkcji:
std::vector<std::vector<int>> generatePermutations(std::vector<int>& nums, int start)
- rekurencyjnie przeszukuje przestrzeń rozwiązań wyszukując wszystkie rozwiązania. Ze zbyt dużą ilością punktów może przekroczyć stos wywołań funkcji (dla 13 puntów powitał mnie niebieski uśmieszek :) )std::vector<std::vector<int>> generateAllPermutations(int x)
- funkcja wywołującageneratePermutations()
.
- Algorytm wspinaczkowy:
- przestrzeń nazw
climb
- wersja algorytmu z wyborem najlepszego sąsiada:
funkcja rozwiązująca:std::vector<int> solve(mhe::DistanceMatrix distances, int loop_breaker = 1000)
przyjmuje argumentloop_breaker
określający maksymalną ilość iteracji głównej pętli algorytmu. - wersja algorytmu z wyborem losowego sąsiada:
funkcja rozwiązująca:std::vector<int> solveRandom(mhe::DistanceMatrix distances, int max_iterations = 10000)
także przyjmuje argumentloop_breaker
określający maksymalną ilość iteracji głównej pętli algorytmu. - Funkcje użwyane przez algorytm:
std::vector<int> getBestNeighbor(const std::vector<int>& solution, mhe::DistanceMatrix distances)
zwracająca najlepszego sąsiada rozwiązania lub wektor zerowy, jeśli rozwiązanie jest najlepsze w swoim sąsiedztwie.std::vector<int> getRandomNeighbor(std::vector<int> solution)
zwraca losowego sąsiada z sąsiedztwa podanego rozwiązania.
- przestrzeń nazw
- Algorytm Tabu:
- przestrzeń nazw
tabu
- funkcja rozwiązująca:
std::vector<int> solve(mhe::DistanceMatrix distances, int max_iter=1000, int max_tab_size=5)
argumentmax_iter
przyjmuje maksymalną ilość iteracji głównej pętli algorytmu, a argumentmax_tab_size
to wielkość tablicy pomocniczej przechowującej trasę algorytmu.
- przestrzeń nazw
- Algorytm symulowanego wyżarzania:
- przestrzeń nazw
ann
- funkcja rozwiązująca:
std::vector<int> solve(mhe::DistanceMatrix distances, double initial_temperature=25, int max_iterations = 1000)
initial_temperature
- określa początkową temperaturę układu
max_iterations
- określa maksymalną ilość iteracji głównej pętli algorytmu
- przestrzeń nazw
- Przestrzeń nazw
gen
- Główna funkcja algorytmu
std::vector<int> solve(int population_size, mhe::DistanceMatrix distances,int threshold,int max_iterations,const std::vector<std::string>& flags, bool debug=false)
population_size
- określa wielkość populacji w algorytmiedistances
- macierz dystansów problemuthreshold
- określa, ile może nastąpić epok bez zmiany najlepszego rozwiązania, potem przerywa główną pętle algorytmu (pierwszy warunek stopu)max_iterations
- maksymalna ilość epok, zostaw "-1" aby przypisać domyślną ilość epok (threshold * 20) (drugi warunek stopu)flags
- wektor flag typu string{funkcja selekcji, funkcja mutacji, funkcja krzyżowania}
- funkcje selekcji:
- "tournament" - selekcja turniejowa
- "wheel" - selekcja kołem ruletki
- funkcje mutacji:
- "inversion" - mutacja przez inwersję
- "rotation" - mutacja przez rotację
- funkcje krzyżowania:
- "order" - order crossover OX1
- "uniform" - uniform crossover
- funkcje selekcji:
debug
- funkcja w trybie debug - wypisuje wszystkich osobników populacji niektórych epok
- Funkcje krzyżowania - przyjmują jako argumenty dwa rozwiązania
std::vector<int> parent1, std::vector<int> parent2
i wykorzystują je jako rodziców do zwracanego rozwiązania. - Funkcje mutacji przyjmują rozwiązanie
std::vector<int> solution
i zwracają jego zmutowaną wersję - Funkcje selekcji przyjmują populację
const std::vector<std::vector<int>>& population
i macierz dystansówmhe::DistanceMatrix distances
i zwracają jedno rozwiązanie - Funkcja
int getBest(const std::vector<std::vector<int>>& population, mhe::DistanceMatrix distanceMatrix)
zwraca indeks najlepszego osobnika w populacji. - Funkcja
void show_all(mhe::DistanceMatrix distanceMatrix)
porównuje działanie różnych algorytmów i przedstawia ich rozwiązania.