diff --git a/Graph.cpp b/Graph.cpp index 8c7770b..fc83a9d 100755 --- a/Graph.cpp +++ b/Graph.cpp @@ -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(); } }