6 Commits

Author SHA1 Message Date
Jan Potocki 6cab940785 Fixed newline in output (TS) 2020-01-20 19:24:40 +01:00
Jan Potocki c10d296d82 Fixed TS crash when entire neighborhood is on tabu list 2020-01-20 19:23:47 +01:00
Jan Potocki 5d78916930 Added displaying timestamp for new optimal router 2020-01-15 19:43:00 +01:00
Jan Potocki b577fd6c13 New approach for global optimum sharing 2020-01-15 19:25:38 +01:00
Jan Potocki 74e1d0be8e Global shared optimum - almost ready 2020-01-15 19:04:22 +01:00
Jan Potocki 420ee4f275 Experimental: initial shared global optimum in TS 2020-01-15 18:22:38 +01:00
3 changed files with 34 additions and 31 deletions
+31 -30
View File
@@ -5,7 +5,6 @@
#include <queue>
#include <random>
#include <thread>
#include <iostream>
Graph::Graph()
@@ -429,12 +428,10 @@ std::vector<unsigned> Graph::travellingSalesmanTabuSearch(Graph &graph, unsigned
// Implementacja: Jan Potocki 2019
std::vector<unsigned> startVertexVector;
std::vector<std::thread> threadsVector;
std::vector<std::vector<unsigned>> resultsVector(threadsNumber);
std::vector<int> resultsLength(threadsNumber);
std::vector<unsigned> optimalResult;
int optimalResultIndex;
int optimalResultLength;
std::mutex globalOptimumMutex;
std::vector<unsigned> globalOptimum;
unsigned globalOptimumLength = -1;
std::random_device randomSrc;
std::default_random_engine randomGen(randomSrc());
@@ -479,32 +476,17 @@ std::vector<unsigned> 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(globalOptimum), std::ref(globalOptimumLength), std::ref(globalOptimumMutex)));
}
// Petla potwierdzajaca zakonczenie watkow
for(int i = 0; i < threadsNumber; i++)
threadsVector.at(i).join();
// Przegladanie wszystkich rozwiazan i wybor optymalnego
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);
return optimalResult;
return globalOptimum;
}
void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps, bool diversification, int iterationsToRestart, unsigned minStopTime, std::vector<unsigned> startRoute, std::vector<unsigned> &result, int &resultLength)
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)
{
// ALGORYTM oparty na metaheurystyce tabu search z dywersyfikacja i sasiedztwem typu swap
// Rdzen przeznaczony do uruchamiania jako jeden watek
@@ -535,7 +517,9 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
while(cheeseSupplied == true)
{
std::vector<unsigned> nextRoute;
std::vector<unsigned> nextRoute = currentRoute;
// ...na wszelki wypadek, gdyby cale sasiedztwo bylo na liscie tabu
// (zeby algorytm sie nie wywalil)
int nextRouteLength = -1;
std::vector<unsigned> nextTabu(3, 0);
@@ -582,6 +566,7 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
// ...jezeli niespelnione - pomijamy ruch
continue;
if(nextRouteLength == -1)
{
nextRouteLength = neighbourRouteLength;
@@ -623,13 +608,26 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
stopCounter = 0;
}
// Synchronizacja globalnie najlepszej trasy (1)
globalOptimumMutex.lock();
if(globalOptimumLength == -1 || globalOptimumLength > nextRouteLength)
{
globalOptimumLength = nextRouteLength;
globalOptimum = nextRoute;
onboardClock.stop();
std::cout << "Nowa najlepsza trasa: " << globalOptimumLength;
std::cout << " (w czasie " << onboardClock.read() << " s)" << 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);
@@ -683,13 +681,16 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
currentRoute = Graph::travellingSalesmanHybrid(graph);
currentTabuSteps = tabuSteps;
intensification = false;
// Synchronizacja globalnie najlepszej trasy (2)
globalOptimumMutex.lock();
optimalRouteLength = globalOptimumLength;
optimalRoute = globalOptimum;
globalOptimumMutex.unlock();
}
}
// Reset licznika iteracji przed restartem
stopCounter = 0;
}
result = optimalRoute;
resultLength = optimalRouteLength;
}
+2 -1
View File
@@ -1,6 +1,7 @@
#ifndef GRAPH_H
#define GRAPH_H
#include <vector>
#include <mutex>
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<unsigned> startRoute, std::vector<unsigned> &result, int &resultLength);
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
{
+1
View File
@@ -448,6 +448,7 @@ int main(int argc, char *argv[])
cout << route.at(i) << '\t' << length << '\t' << distFromStart << endl;
}
cout << endl;
cout << "Dlugosc trasy: " << distFromStart << endl;
cout << endl;
cout << "Czas wykonania algorytmu [s]: " << clock.read() << endl;