From 420ee4f27598b874d0a0d24c387cb665613eda75 Mon Sep 17 00:00:00 2001 From: Jan Potocki Date: Wed, 15 Jan 2020 18:22:38 +0100 Subject: [PATCH] Experimental: initial shared global optimum in TS --- Graph.cpp | 26 +++++++++++++++++--------- Graph.h | 3 ++- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/Graph.cpp b/Graph.cpp index 9673141..395188a 100755 --- a/Graph.cpp +++ b/Graph.cpp @@ -5,7 +5,6 @@ #include #include #include - #include Graph::Graph() @@ -440,6 +439,9 @@ std::vector Graph::travellingSalesmanTabuSearch(Graph &graph, unsigned std::default_random_engine randomGen(randomSrc()); std::uniform_int_distribution<> vertexDist(0, graph.vertexNumber - 1); + std::mutex globalOptimumMutex; + unsigned globalOptimum = -1; + // Petla uruchamiajaca watki for(int i = 0; i < threadsNumber; i++) { @@ -479,7 +481,7 @@ std::vector Graph::travellingSalesmanTabuSearch(Graph &graph, unsigned } // Uruchomienie watku - 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)))); + 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))); } // Petla potwierdzajaca zakonczenie watkow @@ -504,7 +506,7 @@ std::vector Graph::travellingSalesmanTabuSearch(Graph &graph, unsigned return optimalResult; } -void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps, bool diversification, int iterationsToRestart, unsigned minStopTime, std::vector startRoute, std::vector &result, int &resultLength) +void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps, bool diversification, int iterationsToRestart, unsigned minStopTime, std::vector startRoute, std::vector &result, int &resultLength, unsigned &globalOptimum, std::mutex &globalOptimumMutex) { // ALGORYTM oparty na metaheurystyce tabu search z dywersyfikacja i sasiedztwem typu swap // Rdzen przeznaczony do uruchamiania jako jeden watek @@ -603,17 +605,20 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps, // PEA 2 Plus // Jan Potocki 2019 - if(optimalRouteLength == -1) + globalOptimumMutex.lock(); + if(globalOptimum == -1) { - optimalRouteLength = nextRouteLength; + globalOptimum = nextRouteLength; optimalRoute = nextRoute; // Reset licznika stopCounter = 0; + + std::cout << "Nowa najlepsza trasa: " << globalOptimum << std::endl; } - else if(optimalRouteLength > nextRouteLength) + else if(globalOptimum > nextRouteLength) { - optimalRouteLength = nextRouteLength; + globalOptimum = nextRouteLength; optimalRoute = nextRoute; // Zaplanowanie intensyfikacji przy znalezieniu nowego optimum @@ -621,15 +626,18 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps, // Reset licznika stopCounter = 0; + + std::cout << "Nowa najlepsza trasa: " << globalOptimum << std::endl; } + globalOptimumMutex.unlock(); // Weryfikacja listy tabu... int tabuPos = 0; while(tabuPos < tabuArray.size()) - { + { // ...aktualizacja kadencji na liscie tabu tabuArray.at(tabuPos).at(0)--; - + //...usuniecie zerowych kadencji if(tabuArray.at(tabuPos).at(0) == 0) tabuArray.erase(tabuArray.begin() + tabuPos); diff --git a/Graph.h b/Graph.h index a4fd6aa..b952cf5 100755 --- a/Graph.h +++ b/Graph.h @@ -1,6 +1,7 @@ #ifndef GRAPH_H #define GRAPH_H #include +#include class Graph @@ -25,7 +26,7 @@ class Graph unsigned vertexNumber; private: - static void travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps, bool diversification, int iterationsToRestart, unsigned minStopTime, std::vector startRoute, std::vector &result, int &resultLength); + static void travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps, bool diversification, int iterationsToRestart, unsigned minStopTime, std::vector startRoute, std::vector &result, int &resultLength, unsigned &globalOptimum, std::mutex &globalOptimumMutex); class RouteComparison {