From 436c66c8facedd581c3d196eed16bc05eb0c89f9 Mon Sep 17 00:00:00 2001 From: Jan Potocki Date: Tue, 26 Nov 2019 18:50:23 +0100 Subject: [PATCH] Release v2.0 --- LICENSE | 9 ++++++++ README.md | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++ pea2plus.cpp | 2 +- 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 LICENSE create mode 100644 README.md diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4cb6fa5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,9 @@ +/* + * ------------------------------------------------------------ + * "THE BEERWARE/CIDERWARE LICENSE" (Revision 1): + * wrote this code. As long as you retain this + * notice, you can do whatever you want with this stuff. If we + * meet someday, and you think this stuff is worth it, you can + * buy me a beer (or preferably a cider) in return. + * ------------------------------------------------------------ +*/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..cc8dc60 --- /dev/null +++ b/README.md @@ -0,0 +1,59 @@ +# PEA 2 Plus – tabu search dla TSP +Rozwinięcie drugiego projektu na kurs Projektowanie efektywnych algorytmów na PWr w 2017 – implementacja algorytmu przeszukiwania lokalnego z zakazami (tabu search) dla problemu komiwojażera (TSP) dostosowana do pracy wielowątkowej oraz (dodatkowo) algorytmów z pierwszego projektu – przegląd zupełny (brute force), podział i ograniczenia (branch and bound). Program jest napisany w standardzie C++11 bez używania bibliotek specyficznych dla konkretnego systemu operacyjnego, powinno dać się go skompilować na Windowsie, chociaż sam nie próbowałem. + +__Elementy programu__ +* interfejs grafu – klasa abstrakcyjna Graph +* implementacja grafu w postaci macierzy sąsiedztwa (domyślnie używana) i listy sąsiedztwa – klasy ArrayGraph i ListGraph +* niezależny od platformy system do pomiaru czasu, bazujący na std::chrono z C++11 – klasa Stopwatch +* parsery plików w formatach FULL_MATRIX i EUC_2D z TSPLIB95 +* algorytmy przeglądu zupełnego (jednowątkowy) +* algorytm podziału i ograniczeń (jednowątkowy) +* algorytm tabu search (wielowątkowy, bazujący na std::thread z C++11) +* pomocnicze algorytmy na potrzeby tabu search: losowy, zachłanny oraz ich hybryda +* pętla do automatycznego wykonywania pomiarów dla określonych w stałej czasów pracy algorytmu tabu search + +__Charakterystyka tabu search:__ +* rozwiązanie początkowe generowane algorytmem zachłannym +* sąsiedztwo typu swap (zamiana wierzchołków miejscami) +* lista tabu przechowująca obydwa zamienione wierzchołki +* kryterium aspiracji omijające listę tabu, jeżeli zakazany ruch prowadzi do lepszego rozwiązania niż najlepsze znalezione dotychczas +* dwa rodzaje dywersyfikacji: + * intensyfikacja przeszukiwania po znalezieniu lepszego rozwiązania od dotychczasowego (restart od nowego rozwiązania ze zmniejszoną 4x kadencją na liście tabu) + * restart od nowego rozwiązania wygenerowanego algorytmem losowo-zachłannym (losowa część wierzchołków jest losowana, reszta wybierana zachłannie) po określonej liczbie iteracji bez poprawy – domyślnie 10 tysięcy +* kadencja na liście tabu dobierana automatycznie (liczba wierzchołków zaokrąglona w dół do najbliższej dziesiątki) lub konfigurowana ręcznie + +__Parametry wywołania programu:__ +* -t – liczba wątków tabu search (domyślnie 2) +* -l – użycie listowej reprezentacji grafu (zamiast macierzowej) +* -fmatrix – wczytanie pliku w formacie FULL_MATRIX przy uruchamianiu programu +* -feuc2d – wzytanie pliku w formacie EUC_2D przy ładowaniu programu + +__Osiągi tabu search na moim laptopie – 2 wątki:__ +(1x Intel Core i5-2520M @ 2.5 GHz, 8 GB RAM, macOS 10.13.6) +* ftv33.atsp (optimum 1286) + * po 30 sekundach za każdym razem optimum +* swiss42.tsp (optimum 1273) + * po 30 sekundach zwykle optimum lub więcej o około 20 (np. 1288) + * po 60 sekundach za każdym razem optimum +* ftv47.atsp (optimum 1776) + * po 5 minutach 1790, więcej o 14 od optimum – jeden test + * po 15 minutach 1798, więcej o 22 od optimum – jeden test +* berlin52.tsp (optimum 7542) + * po 5 minutach 7730, więcej o 188 od optimum – jeden test + * po 10 minutach 7673, więcej o 131 od optimum – jeden test + +__Osiągi tabu search na serwerze panamint.kcir.pwr.edu.pl – 64 wątki:__ +(4x AMD Opteron 6276 @ 2.3 GHz, 256 GB RAM, Debian Linux 9) +* ftv47.atsp (optimum 1776) + * po 5 minutach czasami optimum lub blisko optimum (np. 1782) + * po 15 minutach tak samo, ale większa szansa trafienia na optimum lub prawie dokładnie optimum (1777) + * po 20 minutach za każdym razem optimum +* berlin52.tsp (optimum 7542) + * po 5 minutach czasami optimum lub więcej o około 130 (np. 7679) + * po 10 minutach prawie za każdym razem optimum +* ftv70.atsp (optimum 1950) + * po 40 minutach 1972, więcej o 22 od optimum – jeden test + +Dane testowe pochodzą ze strony: +http://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/ +Poza ftv70 (kadencja 60), wszystkie testy zostały przeprowadzone z automatycznie ustawioną kadencją. diff --git a/pea2plus.cpp b/pea2plus.cpp index 473376c..3fd80bf 100755 --- a/pea2plus.cpp +++ b/pea2plus.cpp @@ -204,7 +204,7 @@ void parseTSPLIB_EUC_2D(const char *filename, Graph **graph) void banner() { - cout << "PEA Projekt 2 Plus v2.0ALPHA" << endl; + cout << "PEA Projekt 2 Plus v2.0" << endl; cout << "Jan Potocki 2017-2019" << endl; cout << "(beerware)" << endl; }