New approach for global optimum sharing

This commit is contained in:
Jan Potocki
2020-01-15 19:25:38 +01:00
parent 74e1d0be8e
commit b577fd6c13
+20 -17
View File
@@ -560,16 +560,10 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
}
// Kryterium aspiracji...
globalOptimumMutex.lock();
if(tabu == true && neighbourRouteLength >= globalOptimumLength)
{
globalOptimumMutex.unlock();
if(tabu == true && neighbourRouteLength >= optimalRouteLength)
// ...jezeli niespelnione - pomijamy ruch
continue;
}
else
globalOptimumMutex.unlock();
if(nextRouteLength == -1)
{
@@ -592,22 +586,17 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
// PEA 2 Plus
// Jan Potocki 2019
globalOptimumMutex.lock();
if(globalOptimumLength == -1)
if(optimalRouteLength == -1)
{
globalOptimumLength = nextRouteLength;
globalOptimum = nextRoute;
optimalRouteLength = nextRouteLength;
optimalRoute = nextRoute;
// Reset licznika
stopCounter = 0;
std::cout << "Nowa najlepsza trasa: " << globalOptimumLength << std::endl;
}
else if(globalOptimumLength > nextRouteLength)
else if(optimalRouteLength > nextRouteLength)
{
globalOptimumLength = nextRouteLength;
globalOptimum = nextRoute;
optimalRouteLength = nextRouteLength;
optimalRoute = nextRoute;
// Zaplanowanie intensyfikacji przy znalezieniu nowego optimum
@@ -615,6 +604,14 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
// Reset licznika
stopCounter = 0;
}
// Synchronizacja globalnie najlepszej trasy (1)
globalOptimumMutex.lock();
if(globalOptimumLength == -1 || globalOptimumLength > nextRouteLength)
{
globalOptimumLength = nextRouteLength;
globalOptimum = nextRoute;
std::cout << "Nowa najlepsza trasa: " << globalOptimumLength << std::endl;
}
@@ -680,6 +677,12 @@ 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();
}
}