Parcourir la source

New approach for global optimum sharing

Jan Potocki il y a 5 ans
Parent
révision
b577fd6c13
1 fichiers modifiés avec 20 ajouts et 17 suppressions
  1. 20
    17
      Graph.cpp

+ 20
- 17
Graph.cpp Voir le fichier

@@ -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
 

Loading…
Annuler
Enregistrer