|
@@ -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);
|