Pārlūkot izejas kodu

Experimental: initial shared global optimum in TS

Jan Potocki 5 gadus atpakaļ
vecāks
revīzija
420ee4f275
2 mainītis faili ar 19 papildinājumiem un 10 dzēšanām
  1. 17
    9
      Graph.cpp
  2. 2
    1
      Graph.h

+ 17
- 9
Graph.cpp Parādīt failu

5
 #include <queue>
5
 #include <queue>
6
 #include <random>
6
 #include <random>
7
 #include <thread>
7
 #include <thread>
8
-
9
 #include <iostream>
8
 #include <iostream>
10
 
9
 
11
 Graph::Graph()
10
 Graph::Graph()
440
     std::default_random_engine randomGen(randomSrc());
439
     std::default_random_engine randomGen(randomSrc());
441
     std::uniform_int_distribution<> vertexDist(0, graph.vertexNumber - 1);
440
     std::uniform_int_distribution<> vertexDist(0, graph.vertexNumber - 1);
442
 
441
 
442
+    std::mutex globalOptimumMutex;
443
+    unsigned globalOptimum = -1;
444
+
443
     // Petla uruchamiajaca watki
445
     // Petla uruchamiajaca watki
444
     for(int i = 0; i < threadsNumber; i++)
446
     for(int i = 0; i < threadsNumber; i++)
445
     {
447
     {
479
         }
481
         }
480
 
482
 
481
         // Uruchomienie watku
483
         // 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))));
484
+        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)), std::ref(globalOptimum), std::ref(globalOptimumMutex)));
483
     }
485
     }
484
 
486
 
485
     // Petla potwierdzajaca zakonczenie watkow
487
     // Petla potwierdzajaca zakonczenie watkow
504
     return optimalResult;
506
     return optimalResult;
505
 }
507
 }
506
 
508
 
507
-void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps, bool diversification, int iterationsToRestart, unsigned minStopTime, std::vector<unsigned> startRoute, std::vector<unsigned> &result, int &resultLength)
509
+void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps, bool diversification, int iterationsToRestart, unsigned minStopTime, std::vector<unsigned> startRoute, std::vector<unsigned> &result, int &resultLength, unsigned &globalOptimum, std::mutex &globalOptimumMutex)
508
 {
510
 {
509
     // ALGORYTM oparty na metaheurystyce tabu search z dywersyfikacja i sasiedztwem typu swap
511
     // ALGORYTM oparty na metaheurystyce tabu search z dywersyfikacja i sasiedztwem typu swap
510
     // Rdzen przeznaczony do uruchamiania jako jeden watek
512
     // Rdzen przeznaczony do uruchamiania jako jeden watek
603
             // PEA 2 Plus
605
             // PEA 2 Plus
604
             // Jan Potocki 2019
606
             // Jan Potocki 2019
605
 
607
 
606
-            if(optimalRouteLength == -1)
608
+            globalOptimumMutex.lock();
609
+            if(globalOptimum == -1)
607
             {
610
             {
608
-                optimalRouteLength = nextRouteLength;
611
+                globalOptimum = nextRouteLength;
609
                 optimalRoute = nextRoute;
612
                 optimalRoute = nextRoute;
610
 
613
 
611
                 // Reset licznika
614
                 // Reset licznika
612
                 stopCounter = 0;
615
                 stopCounter = 0;
616
+
617
+                std::cout << "Nowa najlepsza trasa: " << globalOptimum << std::endl;
613
             }
618
             }
614
-            else if(optimalRouteLength > nextRouteLength)
619
+            else if(globalOptimum > nextRouteLength)
615
             {
620
             {
616
-                optimalRouteLength = nextRouteLength;
621
+                globalOptimum = nextRouteLength;
617
                 optimalRoute = nextRoute;
622
                 optimalRoute = nextRoute;
618
 
623
 
619
                 // Zaplanowanie intensyfikacji przy znalezieniu nowego optimum
624
                 // Zaplanowanie intensyfikacji przy znalezieniu nowego optimum
621
 
626
 
622
                 // Reset licznika
627
                 // Reset licznika
623
                 stopCounter = 0;
628
                 stopCounter = 0;
629
+
630
+                std::cout << "Nowa najlepsza trasa: " << globalOptimum << std::endl;
624
             }
631
             }
632
+            globalOptimumMutex.unlock();
625
 
633
 
626
             // Weryfikacja listy tabu...
634
             // Weryfikacja listy tabu...
627
             int tabuPos = 0;
635
             int tabuPos = 0;
628
             while(tabuPos < tabuArray.size())
636
             while(tabuPos < tabuArray.size())
629
-            {   
637
+            {
630
                 // ...aktualizacja kadencji na liscie tabu
638
                 // ...aktualizacja kadencji na liscie tabu
631
                 tabuArray.at(tabuPos).at(0)--;
639
                 tabuArray.at(tabuPos).at(0)--;
632
-                
640
+
633
                 //...usuniecie zerowych kadencji
641
                 //...usuniecie zerowych kadencji
634
                 if(tabuArray.at(tabuPos).at(0) == 0)
642
                 if(tabuArray.at(tabuPos).at(0) == 0)
635
                     tabuArray.erase(tabuArray.begin() + tabuPos);
643
                     tabuArray.erase(tabuArray.begin() + tabuPos);

+ 2
- 1
Graph.h Parādīt failu

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> &result, int &resultLength, unsigned &globalOptimum, std::mutex &globalOptimumMutex);
29
 
30
 
30
         class RouteComparison
31
         class RouteComparison
31
         {
32
         {

Notiek ielāde…
Atcelt
Saglabāt