v2.0.2: new tabu auto-tenure, minor refactoring

This commit is contained in:
Jan Potocki
2019-12-04 12:58:55 +01:00
parent 292cd76b9f
commit 29e58ee5ad
2 changed files with 22 additions and 20 deletions
+4 -1
View File
@@ -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.
+16 -17
View File
@@ -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;