Global shared optimum - almost ready
This commit is contained in:
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user