From 29e58ee5ad6b4bca9e5aa6eeb1d1f60c40b7c1dd Mon Sep 17 00:00:00 2001 From: Jan Potocki Date: Wed, 4 Dec 2019 12:58:55 +0100 Subject: [PATCH] v2.0.2: new tabu auto-tenure, minor refactoring --- README.md | 5 ++++- pea2plus.cpp | 37 ++++++++++++++++++------------------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index be8276b..b4f668a 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ __Charakterystyka tabu search:__ * 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 +* kadencja na liście tabu dobierana automatycznie (dwukrotność liczby wierzchołków zaokrąglona w dół do najbliższej dziesiątki) lub konfigurowana ręcznie * warunkiem zatrzymania algorytmu jest skonfigurowana liczba sekund (domyślnie 60) __Parametry wywołania programu:__ @@ -65,3 +65,6 @@ __Osiągi tabu search na serwerze panamint.kcir.pwr.edu.pl – 64 wątki:__ 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ą. + +UWAGA: +Opisane wyżej osiągi zostały zmierzone na wcześniejszej wersji z błędnie aktualizowaną listą tabu, po poprawce (v2.0.2) rezultaty są ciut lepsze - na panamincie optimum dla berlin52.tsp prawie zawsze zostaje trafione po 5 minutach zamiast 10, z drugiej strony 15 minut dalej nie wystarcza, żeby za każdym razem trafić optimum ftv47.atsp. Po przeprowadzeniu wszystkich testów jeszcze raz zaktualizuję powyższe sekcje, póki co zostawiam z tym komentarzem. diff --git a/pea2plus.cpp b/pea2plus.cpp index 94f91e0..a8079be 100755 --- a/pea2plus.cpp +++ b/pea2plus.cpp @@ -119,8 +119,8 @@ void parseTSPLIB_FULL_MATRIX(const char *filename, Graph **graph) void parseTSPLIB_EUC_2D(const char *filename, Graph **graph) { - // Parser plikow EUC_2D z TSPLIB - // Implementacja: Jan Potocki 2017 + // Parser plikow EUC_2D z TSPLIB + // Implementacja: Jan Potocki 2017 string fileInput; vector xCoord, yCoord; ifstream salesmanDataFile; @@ -202,9 +202,22 @@ void parseTSPLIB_EUC_2D(const char *filename, Graph **graph) return; } +unsigned autoTabuLength(Graph &graph) +{ + unsigned computedTabuLength; + + computedTabuLength = (2 * graph.getVertexNumber() / 10) * 10; + if(computedTabuLength == 0) + computedTabuLength = 10; + + // PEA 2 Plus + // Jan Potocki 2019 + return computedTabuLength; +} + void banner() { - cout << "PEA Projekt 2 Plus v2.0.1" << endl; + cout << "PEA Projekt 2 Plus v2.0.2" << endl; cout << "Jan Potocki 2017-2019" << endl; cout << "(beerware)" << endl; } @@ -400,17 +413,9 @@ int main(int argc, char *argv[]) { unsigned effectiveTabuLength; if(tabuLength == 0) - { - effectiveTabuLength = (graph->getVertexNumber() / 10) * 10; - if(effectiveTabuLength == 0) - effectiveTabuLength = 10; - // PEA 2 Plus - // Jan Potocki 2019 - } + effectiveTabuLength = autoTabuLength(*graph); else - { effectiveTabuLength = tabuLength; - } if(tabuLength == 0) cout << "Kadencja: " << effectiveTabuLength << " (auto)" << endl; @@ -524,15 +529,9 @@ int main(int argc, char *argv[]) { unsigned effectiveTabuLength; if(tabuLength == 0) - { - effectiveTabuLength = (graph->getVertexNumber() / 10) * 10; - if(effectiveTabuLength == 0) - effectiveTabuLength = 10; - } + effectiveTabuLength = autoTabuLength(*graph); else - { effectiveTabuLength = tabuLength; - } int measureResult = -1; int measureResultDiv = -1;