瀏覽代碼

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

Jan Potocki 5 年之前
父節點
當前提交
29e58ee5ad
共有 2 個檔案被更改,包括 22 行新增20 行删除
  1. 4
    1
      README.md
  2. 18
    19
      pea2plus.cpp

+ 4
- 1
README.md 查看文件

@@ -27,7 +27,7 @@ __Charakterystyka tabu search:__
27 27
 * dwa rodzaje dywersyfikacji:
28 28
   * intensyfikacja przeszukiwania po znalezieniu lepszego rozwiązania od dotychczasowego (restart od nowego rozwiązania ze zmniejszoną 4x kadencją na liście tabu)
29 29
   * 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
30
-* kadencja na liście tabu dobierana automatycznie (liczba wierzchołków zaokrąglona w dół do najbliższej dziesiątki) lub konfigurowana ręcznie
30
+* 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
31 31
 * warunkiem zatrzymania algorytmu jest skonfigurowana liczba sekund (domyślnie 60)
32 32
 
33 33
 __Parametry wywołania programu:__
@@ -65,3 +65,6 @@ __Osiągi tabu search na serwerze panamint.kcir.pwr.edu.pl – 64 wątki:__
65 65
 Dane testowe pochodzą ze strony:  
66 66
 http://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/  
67 67
 Poza ftv70 (kadencja 60), wszystkie testy zostały przeprowadzone z automatycznie ustawioną kadencją.
68
+
69
+UWAGA:  
70
+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
pea2plus.cpp 查看文件

@@ -119,8 +119,8 @@ void parseTSPLIB_FULL_MATRIX(const char *filename, Graph **graph)
119 119
 
120 120
 void parseTSPLIB_EUC_2D(const char *filename, Graph **graph)
121 121
 {
122
-  // Parser plikow EUC_2D z TSPLIB
123
-  // Implementacja: Jan Potocki 2017
122
+    // Parser plikow EUC_2D z TSPLIB
123
+    // Implementacja: Jan Potocki 2017
124 124
     string fileInput;
125 125
     vector<float> xCoord, yCoord;
126 126
     ifstream salesmanDataFile;
@@ -202,9 +202,22 @@ void parseTSPLIB_EUC_2D(const char *filename, Graph **graph)
202 202
     return;
203 203
 }
204 204
 
205
+unsigned autoTabuLength(Graph &graph)
206
+{
207
+    unsigned computedTabuLength;
208
+
209
+    computedTabuLength = (2 * graph.getVertexNumber() / 10) * 10;
210
+    if(computedTabuLength == 0)
211
+        computedTabuLength = 10;
212
+
213
+    // PEA 2 Plus
214
+    // Jan Potocki 2019
215
+    return computedTabuLength;
216
+}
217
+
205 218
 void banner()
206 219
 {
207
-    cout << "PEA Projekt 2 Plus v2.0.1" << endl;
220
+    cout << "PEA Projekt 2 Plus v2.0.2" << endl;
208 221
     cout << "Jan Potocki 2017-2019" << endl;
209 222
     cout << "(beerware)" << endl;
210 223
 }
@@ -400,17 +413,9 @@ int main(int argc, char *argv[])
400 413
                     {
401 414
                         unsigned effectiveTabuLength;
402 415
                         if(tabuLength == 0)
403
-                        {
404
-                            effectiveTabuLength = (graph->getVertexNumber() / 10) * 10;
405
-                            if(effectiveTabuLength == 0)
406
-                              effectiveTabuLength = 10;
407
-                              // PEA 2 Plus
408
-                              // Jan Potocki 2019
409
-                        }
416
+                            effectiveTabuLength = autoTabuLength(*graph);
410 417
                         else
411
-                        {
412 418
                             effectiveTabuLength = tabuLength;
413
-                        }
414 419
 
415 420
                         if(tabuLength == 0)
416 421
                             cout << "Kadencja: " << effectiveTabuLength << " (auto)" << endl;
@@ -524,15 +529,9 @@ int main(int argc, char *argv[])
524 529
                 {
525 530
                     unsigned effectiveTabuLength;
526 531
                     if(tabuLength == 0)
527
-                    {
528
-                        effectiveTabuLength = (graph->getVertexNumber() / 10) * 10;
529
-                        if(effectiveTabuLength == 0)
530
-                          effectiveTabuLength = 10;
531
-                    }
532
+                        effectiveTabuLength = autoTabuLength(*graph);
532 533
                     else
533
-                    {
534 534
                         effectiveTabuLength = tabuLength;
535
-                    }
536 535
 
537 536
                     int measureResult = -1;
538 537
                     int measureResultDiv = -1;

Loading…
取消
儲存