|
|
|
@@ -5,6 +5,7 @@
|
|
|
|
|
#include <queue>
|
|
|
|
|
#include <random>
|
|
|
|
|
#include <thread>
|
|
|
|
|
|
|
|
|
|
#include <iostream>
|
|
|
|
|
|
|
|
|
|
Graph::Graph()
|
|
|
|
@@ -425,7 +426,7 @@ std::vector<unsigned> Graph::travellingSalesmanTabuSearch(Graph &graph, unsigned
|
|
|
|
|
{
|
|
|
|
|
// ALGORYTM wielawotkowy oparty na metaheurystyce tabu search
|
|
|
|
|
// Pomocniczy kod uruchamiajacy watki wlasciwego algorytmu w najbardziej optymalny sposob
|
|
|
|
|
// Implementacja: Jan Potocki 2019
|
|
|
|
|
// Implementacja: Jan Potocki 2019-2020
|
|
|
|
|
std::vector<unsigned> startVertexVector;
|
|
|
|
|
std::vector<std::thread> threadsVector;
|
|
|
|
|
|
|
|
|
@@ -491,15 +492,13 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
|
|
|
|
|
// ALGORYTM oparty na metaheurystyce tabu search z dywersyfikacja i sasiedztwem typu swap
|
|
|
|
|
// Rdzen przeznaczony do uruchamiania jako jeden watek
|
|
|
|
|
// Projekt i implementacja: Jan Potocki 2017
|
|
|
|
|
// (refactoring 2019)
|
|
|
|
|
// (refactoring 2019-2020)
|
|
|
|
|
Stopwatch onboardClock;
|
|
|
|
|
|
|
|
|
|
std::vector<unsigned> optimalRoute; // Tu bedziemy zapisywac optymalne (w danej chwili) rozwiazanie
|
|
|
|
|
int optimalRouteLength = -1; // -1 - bedziemy odtad uznawac, ze to jest nieskonczonosc ;-)
|
|
|
|
|
std::vector<unsigned> currentRoute; // Rozpatrywane rozwiazanie
|
|
|
|
|
|
|
|
|
|
// Wyznaczenie poczatkowego rozwiazania algorytmem zachlannym
|
|
|
|
|
//currentRoute = Graph::travellingSalesmanGreedy(graph);
|
|
|
|
|
currentRoute = startRoute;
|
|
|
|
|
|
|
|
|
|
// Inicjalizacja glownej petli...
|
|
|
|
@@ -517,7 +516,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);
|
|
|
|
@@ -564,15 +565,7 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
|
|
|
|
|
// ...jezeli niespelnione - pomijamy ruch
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(nextRouteLength == -1)
|
|
|
|
|
{
|
|
|
|
|
nextRouteLength = neighbourRouteLength;
|
|
|
|
|
nextRoute = neighbourRoute;
|
|
|
|
|
nextTabu.at(1) = i;
|
|
|
|
|
nextTabu.at(2) = j;
|
|
|
|
|
}
|
|
|
|
|
else if(nextRouteLength > neighbourRouteLength)
|
|
|
|
|
if(nextRouteLength == -1 || nextRouteLength > neighbourRouteLength)
|
|
|
|
|
{
|
|
|
|
|
nextRouteLength = neighbourRouteLength;
|
|
|
|
|
nextRoute = neighbourRoute;
|
|
|
|
@@ -606,7 +599,7 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
|
|
|
|
|
stopCounter = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Synchronizacja globalnie najlepszej trasy (1)
|
|
|
|
|
// Synchronizacja globalnie najlepszej trasy
|
|
|
|
|
globalOptimumMutex.lock();
|
|
|
|
|
if(globalOptimumLength == -1 || globalOptimumLength > nextRouteLength)
|
|
|
|
|
{
|
|
|
|
@@ -667,7 +660,7 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
|
|
|
|
|
// Intensyfikacja przeszukiwania przez skrócenie kadencji
|
|
|
|
|
// (jezeli w ostatnim przebiegu znaleziono nowe minimum)
|
|
|
|
|
currentRoute = optimalRoute;
|
|
|
|
|
currentTabuSteps = tabuSteps / 4;
|
|
|
|
|
currentTabuSteps = tabuSteps; /// 4;
|
|
|
|
|
intensification = false;
|
|
|
|
|
// PEA 2 Plus
|
|
|
|
|
// Jan Potocki 2019
|
|
|
|
@@ -679,18 +672,10 @@ 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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
}
|
|
|
|
|