Преглед изворни кода

Semi global shared optimum (without thread sync)

Jan Potocki пре 5 година
родитељ
комит
babb720caa
2 измењених фајлова са 26 додато и 32 уклоњено
  1. 24
    31
      Graph.cpp
  2. 2
    1
      Graph.h

+ 24
- 31
Graph.cpp Прегледај датотеку

426
 {
426
 {
427
     // ALGORYTM wielawotkowy oparty na metaheurystyce tabu search
427
     // ALGORYTM wielawotkowy oparty na metaheurystyce tabu search
428
     // Pomocniczy kod uruchamiajacy watki wlasciwego algorytmu w najbardziej optymalny sposob
428
     // Pomocniczy kod uruchamiajacy watki wlasciwego algorytmu w najbardziej optymalny sposob
429
-    // Implementacja: Jan Potocki 2019
429
+    // Implementacja: Jan Potocki 2019-2020
430
     std::vector<unsigned> startVertexVector;
430
     std::vector<unsigned> startVertexVector;
431
     std::vector<std::thread> threadsVector;
431
     std::vector<std::thread> threadsVector;
432
-    std::vector<std::vector<unsigned>> resultsVector(threadsNumber);
433
 
432
 
434
-    std::vector<int> resultsLength(threadsNumber);
435
-    std::vector<unsigned> optimalResult;
436
-    int optimalResultIndex;
437
-    int optimalResultLength;
433
+    std::mutex globalOptimumMutex;
434
+    std::vector<unsigned> globalOptimum;
435
+    unsigned globalOptimumLength = -1;
438
 
436
 
439
     std::random_device randomSrc;
437
     std::random_device randomSrc;
440
     std::default_random_engine randomGen(randomSrc());
438
     std::default_random_engine randomGen(randomSrc());
479
         }
477
         }
480
 
478
 
481
         // Uruchomienie watku
479
         // Uruchomienie watku
482
-        threadsVector.push_back(std::thread(Graph::travellingSalesmanTabuSearchEngine, std::ref(graph), tabuSteps, diversification, iterationsToRestart, minStopTime, startRoute, std::ref(resultsVector.at(i)), std::ref(resultsLength.at(i))));
480
+        threadsVector.push_back(std::thread(Graph::travellingSalesmanTabuSearchEngine, std::ref(graph), tabuSteps, diversification, iterationsToRestart, minStopTime, startRoute, std::ref(globalOptimum), std::ref(globalOptimumLength), std::ref(globalOptimumMutex)));
483
     }
481
     }
484
 
482
 
485
     // Petla potwierdzajaca zakonczenie watkow
483
     // Petla potwierdzajaca zakonczenie watkow
486
     for(int i = 0; i < threadsNumber; i++)
484
     for(int i = 0; i < threadsNumber; i++)
487
         threadsVector.at(i).join();
485
         threadsVector.at(i).join();
488
 
486
 
489
-    // Przegladanie wszystkich rozwiazan i wybor optymalnego
490
-    optimalResultIndex = 0;
491
-    optimalResultLength = resultsLength.at(0);
492
-
493
-    for(int i = 0; i < threadsNumber; i++)
494
-    {
495
-        if(resultsLength.at(i) < optimalResultLength)
496
-        {
497
-            optimalResultIndex = i;
498
-            optimalResultLength = resultsLength.at(i);
499
-        }
500
-    }
501
-
502
-    optimalResult = resultsVector.at(optimalResultIndex);
503
-
504
-    return optimalResult;
487
+    return globalOptimum;
505
 }
488
 }
506
 
489
 
507
-void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps, bool diversification, int iterationsToRestart, unsigned minStopTime, std::vector<unsigned> startRoute, std::vector<unsigned> &result, int &resultLength)
490
+void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps, bool diversification, int iterationsToRestart, unsigned minStopTime, std::vector<unsigned> startRoute, std::vector<unsigned> &globalOptimum, unsigned &globalOptimumLength, std::mutex &globalOptimumMutex)
508
 {
491
 {
509
     // ALGORYTM oparty na metaheurystyce tabu search z dywersyfikacja i sasiedztwem typu swap
492
     // ALGORYTM oparty na metaheurystyce tabu search z dywersyfikacja i sasiedztwem typu swap
510
     // Rdzen przeznaczony do uruchamiania jako jeden watek
493
     // Rdzen przeznaczony do uruchamiania jako jeden watek
511
     // Projekt i implementacja: Jan Potocki 2017
494
     // Projekt i implementacja: Jan Potocki 2017
512
-    // (refactoring 2019)
495
+    // (refactoring 2019-2020)
513
     Stopwatch onboardClock;
496
     Stopwatch onboardClock;
514
 
497
 
515
     std::vector<unsigned> optimalRoute;     // Tu bedziemy zapisywac optymalne (w danej chwili) rozwiazanie
498
     std::vector<unsigned> optimalRoute;     // Tu bedziemy zapisywac optymalne (w danej chwili) rozwiazanie
516
     int optimalRouteLength = -1;            // -1 - bedziemy odtad uznawac, ze to jest nieskonczonosc ;-)
499
     int optimalRouteLength = -1;            // -1 - bedziemy odtad uznawac, ze to jest nieskonczonosc ;-)
517
     std::vector<unsigned> currentRoute;     // Rozpatrywane rozwiazanie
500
     std::vector<unsigned> currentRoute;     // Rozpatrywane rozwiazanie
518
 
501
 
519
-    // Wyznaczenie poczatkowego rozwiazania algorytmem zachlannym
520
-    //currentRoute = Graph::travellingSalesmanGreedy(graph);
521
     currentRoute = startRoute;
502
     currentRoute = startRoute;
522
 
503
 
523
     // Inicjalizacja glownej petli...
504
     // Inicjalizacja glownej petli...
623
                 stopCounter = 0;
604
                 stopCounter = 0;
624
             }
605
             }
625
 
606
 
607
+            // Synchronizacja globalnie najlepszej trasy
608
+            globalOptimumMutex.lock();
609
+            if(globalOptimumLength == -1 || globalOptimumLength > nextRouteLength)
610
+            {
611
+                globalOptimumLength = nextRouteLength;
612
+                globalOptimum = nextRoute;
613
+
614
+                onboardClock.stop();
615
+                std::cout << "Nowa najlepsza trasa: " << globalOptimumLength;
616
+                std::cout << " (w czasie " << onboardClock.read() << " s)" << std::endl;
617
+            }
618
+            globalOptimumMutex.unlock();
619
+
626
             // Weryfikacja listy tabu...
620
             // Weryfikacja listy tabu...
627
             int tabuPos = 0;
621
             int tabuPos = 0;
628
             while(tabuPos < tabuArray.size())
622
             while(tabuPos < tabuArray.size())
629
-            {   
623
+            {
630
                 // ...aktualizacja kadencji na liscie tabu
624
                 // ...aktualizacja kadencji na liscie tabu
631
                 tabuArray.at(tabuPos).at(0)--;
625
                 tabuArray.at(tabuPos).at(0)--;
632
-                
626
+
633
                 //...usuniecie zerowych kadencji
627
                 //...usuniecie zerowych kadencji
634
                 if(tabuArray.at(tabuPos).at(0) == 0)
628
                 if(tabuArray.at(tabuPos).at(0) == 0)
635
                     tabuArray.erase(tabuArray.begin() + tabuPos);
629
                     tabuArray.erase(tabuArray.begin() + tabuPos);
690
         stopCounter = 0;
684
         stopCounter = 0;
691
     }
685
     }
692
 
686
 
693
-    result = optimalRoute;
694
-    resultLength = optimalRouteLength;
687
+    std::cout << std::endl;
695
 }
688
 }

+ 2
- 1
Graph.h Прегледај датотеку

1
 #ifndef GRAPH_H
1
 #ifndef GRAPH_H
2
 #define GRAPH_H
2
 #define GRAPH_H
3
 #include <vector>
3
 #include <vector>
4
+#include <mutex>
4
 
5
 
5
 
6
 
6
 class Graph
7
 class Graph
25
         unsigned vertexNumber;
26
         unsigned vertexNumber;
26
 
27
 
27
     private:
28
     private:
28
-        static void travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps, bool diversification, int iterationsToRestart, unsigned minStopTime, std::vector<unsigned> startRoute, std::vector<unsigned> &result, int &resultLength);
29
+        static void travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps, bool diversification, int iterationsToRestart, unsigned minStopTime, std::vector<unsigned> startRoute, std::vector<unsigned> &globalOptimum, unsigned &globalOptimumLength, std::mutex &globalOptimumMutex);
29
 
30
 
30
         class RouteComparison
31
         class RouteComparison
31
         {
32
         {

Loading…
Откажи
Сачувај