Code cleanup

This commit is contained in:
Jan Potocki
2019-11-18 19:37:10 +01:00
parent 526749deed
commit 9f02651088
2 changed files with 34 additions and 12 deletions
+23 -9
View File
@@ -250,12 +250,7 @@ std::vector<unsigned> Graph::travellingSalesmanGreedy(Graph &graph, unsigned sta
// Implementacja: Jan Potocki 2017 // Implementacja: Jan Potocki 2017
std::vector<unsigned> route; std::vector<unsigned> route;
// std::random_device randomSrc; // Przypisanie wierzcholka startowego
// std::default_random_engine randomGen(randomSrc());
// std::uniform_int_distribution<> vertexDist(0, graph.vertexNumber - 1);
// Losowanie wierzcholka startowego
//route.push_back(vertexDist(randomGen));
route.push_back(startVertex); route.push_back(startVertex);
for(int i = 0; i < graph.vertexNumber - 1; i++) for(int i = 0; i < graph.vertexNumber - 1; i++)
@@ -370,6 +365,8 @@ std::vector<unsigned> Graph::travellingSalesmanHybrid(Graph &graph)
// Znalezienie najkrotszej mozliwej jeszcze do uzycia krawedzi // Znalezienie najkrotszej mozliwej jeszcze do uzycia krawedzi
unsigned consideredLength = graph.getWeight(route.back(), j); unsigned consideredLength = graph.getWeight(route.back(), j);
// PEA 2 Plus
// Jan Potocki 2019
if(minEdge == -1) if(minEdge == -1)
{ {
minEdge = consideredLength; minEdge = consideredLength;
@@ -433,6 +430,7 @@ std::vector<unsigned> Graph::travellingSalesmanTabuSearch(Graph &graph, unsigned
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<std::vector<unsigned>> resultsVector(threadsNumber);
std::vector<int> resultsLength(threadsNumber); std::vector<int> resultsLength(threadsNumber);
std::vector<unsigned> optimalResult; std::vector<unsigned> optimalResult;
int optimalResultIndex; int optimalResultIndex;
@@ -442,14 +440,18 @@ std::vector<unsigned> Graph::travellingSalesmanTabuSearch(Graph &graph, unsigned
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);
// Petla uruchamiajaca watki
for(int i = 0; i < threadsNumber; i++) for(int i = 0; i < threadsNumber; i++)
{ {
// Generowanie startowego rozwiazania...
std::vector<unsigned> startRoute; std::vector<unsigned> startRoute;
unsigned startVertex; unsigned startVertex;
bool startVertexUsed; bool startVertexUsed;
if(i < graph.vertexNumber) if(i < graph.vertexNumber)
{ {
// ...dopoki ma to sens - algorytmem zachlannym z innym wierzcholkiem startowym
// (dla kazdego watku)
do do
{ {
startVertex = vertexDist(randomGen); startVertex = vertexDist(randomGen);
@@ -465,20 +467,26 @@ std::vector<unsigned> Graph::travellingSalesmanTabuSearch(Graph &graph, unsigned
} }
} while(startVertexUsed == true); } while(startVertexUsed == true);
// PEA 2 Plus
// Jan Potocki 2019
startVertexVector.push_back(startVertex); startVertexVector.push_back(startVertex);
startRoute = Graph::travellingSalesmanGreedy(graph, startVertex); startRoute = Graph::travellingSalesmanGreedy(graph, startVertex);
} }
else else
{ {
// ...jezeli wszystkie wierzcholki sa juz wykorzystane - w pelni losowo
startRoute = Graph::travellingSalesmanRandom(graph); startRoute = Graph::travellingSalesmanRandom(graph);
} }
// 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))));
} }
// 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
optimalResultIndex = 0; optimalResultIndex = 0;
optimalResultLength = resultsLength.at(0); optimalResultLength = resultsLength.at(0);
@@ -592,6 +600,8 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
} }
currentRoute = nextRoute; currentRoute = nextRoute;
// PEA 2 Plus
// Jan Potocki 2019
if(optimalRouteLength == -1) if(optimalRouteLength == -1)
{ {
@@ -606,7 +616,7 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
optimalRouteLength = nextRouteLength; optimalRouteLength = nextRouteLength;
optimalRoute = nextRoute; optimalRoute = nextRoute;
// Zaplanowanie intensyfikacji // Zaplanowanie intensyfikacji przy znalezieniu nowego optimum
intensification = true; intensification = true;
// Reset licznika // Reset licznika
@@ -658,14 +668,18 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
{ {
if(intensification == true) if(intensification == true)
{ {
// Intensyfikacja przeszukiwania przy ostatnim minimum // Intensyfikacja przeszukiwania przez skrócenie kadencji
// (jezeli w ostatnim przebiegu znaleziono nowe minimum)
currentRoute = optimalRoute; currentRoute = optimalRoute;
currentTabuSteps = tabuSteps / 4; currentTabuSteps = tabuSteps / 4;
intensification = false; intensification = false;
// PEA 2 Plus
// Jan Potocki 2019
} }
else else
{ {
// Algorytm hybrydowy losowo-zachlanny // W innym przypadku wlasciwa dywersyfikacja przez wygenerowanie nowego
// rozwiazania startowego algorytmem hybrydowym losowo-zachlannym
currentRoute = Graph::travellingSalesmanHybrid(graph); currentRoute = Graph::travellingSalesmanHybrid(graph);
currentTabuSteps = tabuSteps; currentTabuSteps = tabuSteps;
intensification = false; intensification = false;
+11 -3
View File
@@ -40,7 +40,8 @@ unsigned tabuThreadsNumber = 2;
void parseTSPLIB_FULL_MATRIX(const char *filename, Graph **graph) void parseTSPLIB_FULL_MATRIX(const char *filename, Graph **graph)
{ {
// Jan Potocki 2017 // Parser plikow FULL_MATRIX z TSPLIB
// Implementacja: Jan Potocki 2017
string fileInput; string fileInput;
ifstream salesmanDataFile; ifstream salesmanDataFile;
@@ -105,7 +106,8 @@ void parseTSPLIB_FULL_MATRIX(const char *filename, Graph **graph)
void parseTSPLIB_EUC_2D(const char *filename, Graph **graph) void parseTSPLIB_EUC_2D(const char *filename, Graph **graph)
{ {
// Jan Potocki 2017 // Parser plikow EUC_2D z TSPLIB
// Implementacja: Jan Potocki 2017
string fileInput; string fileInput;
vector<float> xCoord, yCoord; vector<float> xCoord, yCoord;
ifstream salesmanDataFile; ifstream salesmanDataFile;
@@ -241,6 +243,8 @@ int main(int argc, char *argv[])
cout << endl; cout << endl;
cout << "-h" << "\t\t\t" << "wyswietlenie pomocy (opisu parametrow)" << endl; cout << "-h" << "\t\t\t" << "wyswietlenie pomocy (opisu parametrow)" << endl;
return 0; return 0;
// PEA 2 Plus
// Jan Potocki 2019
} }
else else
{ {
@@ -299,7 +303,7 @@ int main(int argc, char *argv[])
if(graph != NULL) if(graph != NULL)
graph->displayGraph(); graph->displayGraph();
else else
cout << "Brak wygenerowanych danych" << endl; cout << "+++ MELON MELON MELON +++ Brak zaladowanych danych +++" << endl;
cout << endl; cout << endl;
} }
break; break;
@@ -385,6 +389,8 @@ int main(int argc, char *argv[])
effectiveTabuLength = (graph->getVertexNumber() / 10) * 10; effectiveTabuLength = (graph->getVertexNumber() / 10) * 10;
if(effectiveTabuLength == 0) if(effectiveTabuLength == 0)
effectiveTabuLength = 10; effectiveTabuLength = 10;
// PEA 2 Plus
// Jan Potocki 2019
} }
else else
{ {
@@ -591,6 +597,7 @@ int main(int argc, char *argv[])
break; break;
case 8: case 8:
{ {
// PEA 2 Plus
// Jan Potocki 2019 // Jan Potocki 2019
string filename; string filename;
@@ -602,6 +609,7 @@ int main(int argc, char *argv[])
break; break;
case 9: case 9:
{ {
// PEA 2 Plus
// Jan Potocki 2019 // Jan Potocki 2019
string filename; string filename;