Sfoglia il codice sorgente

Experimental: initial shared global optimum in TS

Jan Potocki 5 anni fa
parent
commit
420ee4f275
2 ha cambiato i file con 19 aggiunte e 10 eliminazioni
  1. 17
    9
      Graph.cpp
  2. 2
    1
      Graph.h

+ 17
- 9
Graph.cpp Vedi File

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

+ 2
- 1
Graph.h Vedi File

@@ -1,6 +1,7 @@
1 1
 #ifndef GRAPH_H
2 2
 #define GRAPH_H
3 3
 #include <vector>
4
+#include <mutex>
4 5
 
5 6
 
6 7
 class Graph
@@ -25,7 +26,7 @@ class Graph
25 26
         unsigned vertexNumber;
26 27
 
27 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 31
         class RouteComparison
31 32
         {

Loading…
Annulla
Salva