v2.0.2: new tabu auto-tenure, minor refactoring
This commit is contained in:
@@ -27,7 +27,7 @@ __Charakterystyka tabu search:__
|
|||||||
* dwa rodzaje dywersyfikacji:
|
* 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)
|
* 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
|
* 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)
|
* warunkiem zatrzymania algorytmu jest skonfigurowana liczba sekund (domyślnie 60)
|
||||||
|
|
||||||
__Parametry wywołania programu:__
|
__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:
|
Dane testowe pochodzą ze strony:
|
||||||
http://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/
|
http://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/
|
||||||
Poza ftv70 (kadencja 60), wszystkie testy zostały przeprowadzone z automatycznie ustawioną kadencją.
|
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
@@ -202,9 +202,22 @@ void parseTSPLIB_EUC_2D(const char *filename, Graph **graph)
|
|||||||
return;
|
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()
|
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 << "Jan Potocki 2017-2019" << endl;
|
||||||
cout << "(beerware)" << endl;
|
cout << "(beerware)" << endl;
|
||||||
}
|
}
|
||||||
@@ -400,17 +413,9 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
unsigned effectiveTabuLength;
|
unsigned effectiveTabuLength;
|
||||||
if(tabuLength == 0)
|
if(tabuLength == 0)
|
||||||
{
|
effectiveTabuLength = autoTabuLength(*graph);
|
||||||
effectiveTabuLength = (graph->getVertexNumber() / 10) * 10;
|
|
||||||
if(effectiveTabuLength == 0)
|
|
||||||
effectiveTabuLength = 10;
|
|
||||||
// PEA 2 Plus
|
|
||||||
// Jan Potocki 2019
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
effectiveTabuLength = tabuLength;
|
effectiveTabuLength = tabuLength;
|
||||||
}
|
|
||||||
|
|
||||||
if(tabuLength == 0)
|
if(tabuLength == 0)
|
||||||
cout << "Kadencja: " << effectiveTabuLength << " (auto)" << endl;
|
cout << "Kadencja: " << effectiveTabuLength << " (auto)" << endl;
|
||||||
@@ -524,15 +529,9 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
unsigned effectiveTabuLength;
|
unsigned effectiveTabuLength;
|
||||||
if(tabuLength == 0)
|
if(tabuLength == 0)
|
||||||
{
|
effectiveTabuLength = autoTabuLength(*graph);
|
||||||
effectiveTabuLength = (graph->getVertexNumber() / 10) * 10;
|
|
||||||
if(effectiveTabuLength == 0)
|
|
||||||
effectiveTabuLength = 10;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
effectiveTabuLength = tabuLength;
|
effectiveTabuLength = tabuLength;
|
||||||
}
|
|
||||||
|
|
||||||
int measureResult = -1;
|
int measureResult = -1;
|
||||||
int measureResultDiv = -1;
|
int measureResultDiv = -1;
|
||||||
|
|||||||
Reference in New Issue
Block a user