v2.0.2: new tabu auto-tenure, minor refactoring
This commit is contained in:
@@ -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.
|
||||
|
||||
+18
-19
@@ -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<float> 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;
|
||||
|
||||
Reference in New Issue
Block a user