|
@@ -560,16 +560,10 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
|
560
|
560
|
}
|
561
|
561
|
|
562
|
562
|
// Kryterium aspiracji...
|
563
|
|
- globalOptimumMutex.lock();
|
564
|
|
- if(tabu == true && neighbourRouteLength >= globalOptimumLength)
|
565
|
|
- {
|
566
|
|
- globalOptimumMutex.unlock();
|
567
|
|
-
|
|
563
|
+ if(tabu == true && neighbourRouteLength >= optimalRouteLength)
|
568
|
564
|
// ...jezeli niespelnione - pomijamy ruch
|
569
|
565
|
continue;
|
570
|
|
- }
|
571
|
|
- else
|
572
|
|
- globalOptimumMutex.unlock();
|
|
566
|
+
|
573
|
567
|
|
574
|
568
|
if(nextRouteLength == -1)
|
575
|
569
|
{
|
|
@@ -592,22 +586,17 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
|
592
|
586
|
// PEA 2 Plus
|
593
|
587
|
// Jan Potocki 2019
|
594
|
588
|
|
595
|
|
- globalOptimumMutex.lock();
|
596
|
|
- if(globalOptimumLength == -1)
|
|
589
|
+ if(optimalRouteLength == -1)
|
597
|
590
|
{
|
598
|
|
- globalOptimumLength = nextRouteLength;
|
599
|
|
- globalOptimum = nextRoute;
|
|
591
|
+ optimalRouteLength = nextRouteLength;
|
600
|
592
|
optimalRoute = nextRoute;
|
601
|
593
|
|
602
|
594
|
// Reset licznika
|
603
|
595
|
stopCounter = 0;
|
604
|
|
-
|
605
|
|
- std::cout << "Nowa najlepsza trasa: " << globalOptimumLength << std::endl;
|
606
|
596
|
}
|
607
|
|
- else if(globalOptimumLength > nextRouteLength)
|
|
597
|
+ else if(optimalRouteLength > nextRouteLength)
|
608
|
598
|
{
|
609
|
|
- globalOptimumLength = nextRouteLength;
|
610
|
|
- globalOptimum = nextRoute;
|
|
599
|
+ optimalRouteLength = nextRouteLength;
|
611
|
600
|
optimalRoute = nextRoute;
|
612
|
601
|
|
613
|
602
|
// Zaplanowanie intensyfikacji przy znalezieniu nowego optimum
|
|
@@ -615,6 +604,14 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
|
615
|
604
|
|
616
|
605
|
// Reset licznika
|
617
|
606
|
stopCounter = 0;
|
|
607
|
+ }
|
|
608
|
+
|
|
609
|
+ // Synchronizacja globalnie najlepszej trasy (1)
|
|
610
|
+ globalOptimumMutex.lock();
|
|
611
|
+ if(globalOptimumLength == -1 || globalOptimumLength > nextRouteLength)
|
|
612
|
+ {
|
|
613
|
+ globalOptimumLength = nextRouteLength;
|
|
614
|
+ globalOptimum = nextRoute;
|
618
|
615
|
|
619
|
616
|
std::cout << "Nowa najlepsza trasa: " << globalOptimumLength << std::endl;
|
620
|
617
|
}
|
|
@@ -680,6 +677,12 @@ void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps,
|
680
|
677
|
currentRoute = Graph::travellingSalesmanHybrid(graph);
|
681
|
678
|
currentTabuSteps = tabuSteps;
|
682
|
679
|
intensification = false;
|
|
680
|
+
|
|
681
|
+ // Synchronizacja globalnie najlepszej trasy (2)
|
|
682
|
+ globalOptimumMutex.lock();
|
|
683
|
+ optimalRouteLength = globalOptimumLength;
|
|
684
|
+ optimalRoute = globalOptimum;
|
|
685
|
+ globalOptimumMutex.unlock();
|
683
|
686
|
}
|
684
|
687
|
}
|
685
|
688
|
|