Global shared optimum - almost ready

This commit is contained in:
Jan Potocki
2020-01-15 19:04:22 +01:00
parent 420ee4f275
commit 74e1d0be8e
2 changed files with 24 additions and 36 deletions
+23 -35
View File
@@ -428,20 +428,15 @@ std::vector<unsigned> Graph::travellingSalesmanTabuSearch(Graph &graph, unsigned
// Implementacja: Jan Potocki 2019 // Implementacja: Jan Potocki 2019
std::vector<unsigned> startVertexVector; std::vector<unsigned> startVertexVector;
std::vector<std::thread> threadsVector; std::vector<std::thread> threadsVector;
std::vector<std::vector<unsigned>> resultsVector(threadsNumber);
std::vector<int> resultsLength(threadsNumber); std::mutex globalOptimumMutex;
std::vector<unsigned> optimalResult; std::vector<unsigned> globalOptimum;
int optimalResultIndex; unsigned globalOptimumLength = -1;
int optimalResultLength;
std::random_device randomSrc; std::random_device randomSrc;
std::default_random_engine randomGen(randomSrc()); std::default_random_engine randomGen(randomSrc());
std::uniform_int_distribution<> vertexDist(0, graph.vertexNumber - 1); std::uniform_int_distribution<> vertexDist(0, graph.vertexNumber - 1);
std::mutex globalOptimumMutex;
unsigned globalOptimum = -1;
// Petla uruchamiajaca watki // Petla uruchamiajaca watki
for(int i = 0; i < threadsNumber; i++) for(int i = 0; i < threadsNumber; i++)
{ {
@@ -481,32 +476,17 @@ std::vector<unsigned> Graph::travellingSalesmanTabuSearch(Graph &graph, unsigned
} }
// Uruchomienie watku // 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)), std::ref(globalOptimum), std::ref(globalOptimumMutex))); threadsVector.push_back(std::thread(Graph::travellingSalesmanTabuSearchEngine, std::ref(graph), tabuSteps, diversification, iterationsToRestart, minStopTime, startRoute, std::ref(globalOptimum), std::ref(globalOptimumLength), std::ref(globalOptimumMutex)));
} }
// Petla potwierdzajaca zakonczenie watkow // Petla potwierdzajaca zakonczenie watkow
for(int i = 0; i < threadsNumber; i++) for(int i = 0; i < threadsNumber; i++)
threadsVector.at(i).join(); threadsVector.at(i).join();
// Przegladanie wszystkich rozwiazan i wybor optymalnego return globalOptimum;
optimalResultIndex = 0;
optimalResultLength = resultsLength.at(0);
for(int i = 0; i < threadsNumber; i++)
{
if(resultsLength.at(i) < optimalResultLength)
{
optimalResultIndex = i;
optimalResultLength = resultsLength.at(i);
}
} }
optimalResult = resultsVector.at(optimalResultIndex); 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)
return optimalResult;
}
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)
{ {
// ALGORYTM oparty na metaheurystyce tabu search z dywersyfikacja i sasiedztwem typu swap // ALGORYTM oparty na metaheurystyce tabu search z dywersyfikacja i sasiedztwem typu swap
// Rdzen przeznaczony do uruchamiania jako jeden watek // Rdzen przeznaczony do uruchamiania jako jeden watek
@@ -580,9 +560,16 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
} }
// Kryterium aspiracji... // Kryterium aspiracji...
if(tabu == true && neighbourRouteLength >= optimalRouteLength) globalOptimumMutex.lock();
if(tabu == true && neighbourRouteLength >= globalOptimumLength)
{
globalOptimumMutex.unlock();
// ...jezeli niespelnione - pomijamy ruch // ...jezeli niespelnione - pomijamy ruch
continue; continue;
}
else
globalOptimumMutex.unlock();
if(nextRouteLength == -1) if(nextRouteLength == -1)
{ {
@@ -606,19 +593,21 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
// Jan Potocki 2019 // Jan Potocki 2019
globalOptimumMutex.lock(); globalOptimumMutex.lock();
if(globalOptimum == -1) if(globalOptimumLength == -1)
{ {
globalOptimum = nextRouteLength; globalOptimumLength = nextRouteLength;
globalOptimum = nextRoute;
optimalRoute = nextRoute; optimalRoute = nextRoute;
// Reset licznika // Reset licznika
stopCounter = 0; stopCounter = 0;
std::cout << "Nowa najlepsza trasa: " << globalOptimum << std::endl; std::cout << "Nowa najlepsza trasa: " << globalOptimumLength << std::endl;
} }
else if(globalOptimum > nextRouteLength) else if(globalOptimumLength > nextRouteLength)
{ {
globalOptimum = nextRouteLength; globalOptimumLength = nextRouteLength;
globalOptimum = nextRoute;
optimalRoute = nextRoute; optimalRoute = nextRoute;
// Zaplanowanie intensyfikacji przy znalezieniu nowego optimum // Zaplanowanie intensyfikacji przy znalezieniu nowego optimum
@@ -627,7 +616,7 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
// Reset licznika // Reset licznika
stopCounter = 0; stopCounter = 0;
std::cout << "Nowa najlepsza trasa: " << globalOptimum << std::endl; std::cout << "Nowa najlepsza trasa: " << globalOptimumLength << std::endl;
} }
globalOptimumMutex.unlock(); globalOptimumMutex.unlock();
@@ -698,6 +687,5 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
stopCounter = 0; stopCounter = 0;
} }
result = optimalRoute; std::cout << std::endl;
resultLength = optimalRouteLength;
} }
+1 -1
View File
@@ -26,7 +26,7 @@ class Graph
unsigned vertexNumber; unsigned vertexNumber;
private: private:
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); 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);
class RouteComparison class RouteComparison
{ {