Pārlūkot izejas kodu

Global shared optimum - almost ready

Jan Potocki 5 gadus atpakaļ
vecāks
revīzija
74e1d0be8e
2 mainītis faili ar 24 papildinājumiem un 36 dzēšanām
  1. 23
    35
      Graph.cpp
  2. 1
    1
      Graph.h

+ 23
- 35
Graph.cpp Parādīt failu

428
     // Implementacja: Jan Potocki 2019
428
     // Implementacja: Jan Potocki 2019
429
     std::vector<unsigned> startVertexVector;
429
     std::vector<unsigned> startVertexVector;
430
     std::vector<std::thread> threadsVector;
430
     std::vector<std::thread> threadsVector;
431
-    std::vector<std::vector<unsigned>> resultsVector(threadsNumber);
432
 
431
 
433
-    std::vector<int> resultsLength(threadsNumber);
434
-    std::vector<unsigned> optimalResult;
435
-    int optimalResultIndex;
436
-    int optimalResultLength;
432
+    std::mutex globalOptimumMutex;
433
+    std::vector<unsigned> globalOptimum;
434
+    unsigned globalOptimumLength = -1;
437
 
435
 
438
     std::random_device randomSrc;
436
     std::random_device randomSrc;
439
     std::default_random_engine randomGen(randomSrc());
437
     std::default_random_engine randomGen(randomSrc());
440
     std::uniform_int_distribution<> vertexDist(0, graph.vertexNumber - 1);
438
     std::uniform_int_distribution<> vertexDist(0, graph.vertexNumber - 1);
441
 
439
 
442
-    std::mutex globalOptimumMutex;
443
-    unsigned globalOptimum = -1;
444
-
445
     // Petla uruchamiajaca watki
440
     // Petla uruchamiajaca watki
446
     for(int i = 0; i < threadsNumber; i++)
441
     for(int i = 0; i < threadsNumber; i++)
447
     {
442
     {
481
         }
476
         }
482
 
477
 
483
         // Uruchomienie watku
478
         // Uruchomienie watku
484
-        threadsVector.push_back(std::thread(Graph::travellingSalesmanTabuSearchEngine, std::ref(graph), tabuSteps, diversification, iterationsToRestart, minStopTime, startRoute, std::ref(resultsVector.at(i)), std::ref(resultsLength.at(i)), std::ref(globalOptimum), std::ref(globalOptimumMutex)));
479
+        threadsVector.push_back(std::thread(Graph::travellingSalesmanTabuSearchEngine, std::ref(graph), tabuSteps, diversification, iterationsToRestart, minStopTime, startRoute, std::ref(globalOptimum), std::ref(globalOptimumLength), std::ref(globalOptimumMutex)));
485
     }
480
     }
486
 
481
 
487
     // Petla potwierdzajaca zakonczenie watkow
482
     // Petla potwierdzajaca zakonczenie watkow
488
     for(int i = 0; i < threadsNumber; i++)
483
     for(int i = 0; i < threadsNumber; i++)
489
         threadsVector.at(i).join();
484
         threadsVector.at(i).join();
490
 
485
 
491
-    // Przegladanie wszystkich rozwiazan i wybor optymalnego
492
-    optimalResultIndex = 0;
493
-    optimalResultLength = resultsLength.at(0);
494
-
495
-    for(int i = 0; i < threadsNumber; i++)
496
-    {
497
-        if(resultsLength.at(i) < optimalResultLength)
498
-        {
499
-            optimalResultIndex = i;
500
-            optimalResultLength = resultsLength.at(i);
501
-        }
502
-    }
503
-
504
-    optimalResult = resultsVector.at(optimalResultIndex);
505
-
506
-    return optimalResult;
486
+    return globalOptimum;
507
 }
487
 }
508
 
488
 
509
-void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps, bool diversification, int iterationsToRestart, unsigned minStopTime, std::vector<unsigned> startRoute, std::vector<unsigned> &result, int &resultLength, unsigned &globalOptimum, std::mutex &globalOptimumMutex)
489
+void Graph::travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps, bool diversification, int iterationsToRestart, unsigned minStopTime, std::vector<unsigned> startRoute, std::vector<unsigned> &globalOptimum, unsigned &globalOptimumLength, std::mutex &globalOptimumMutex)
510
 {
490
 {
511
     // ALGORYTM oparty na metaheurystyce tabu search z dywersyfikacja i sasiedztwem typu swap
491
     // ALGORYTM oparty na metaheurystyce tabu search z dywersyfikacja i sasiedztwem typu swap
512
     // Rdzen przeznaczony do uruchamiania jako jeden watek
492
     // Rdzen przeznaczony do uruchamiania jako jeden watek
580
                     }
560
                     }
581
 
561
 
582
                     // Kryterium aspiracji...
562
                     // Kryterium aspiracji...
583
-                    if(tabu == true && neighbourRouteLength >= optimalRouteLength)
563
+                    globalOptimumMutex.lock();
564
+                    if(tabu == true && neighbourRouteLength >= globalOptimumLength)
565
+                    {
566
+                        globalOptimumMutex.unlock();
567
+
584
                         // ...jezeli niespelnione - pomijamy ruch
568
                         // ...jezeli niespelnione - pomijamy ruch
585
                         continue;
569
                         continue;
570
+                    }
571
+                    else
572
+                        globalOptimumMutex.unlock();
586
 
573
 
587
                     if(nextRouteLength == -1)
574
                     if(nextRouteLength == -1)
588
                     {
575
                     {
606
             // Jan Potocki 2019
593
             // Jan Potocki 2019
607
 
594
 
608
             globalOptimumMutex.lock();
595
             globalOptimumMutex.lock();
609
-            if(globalOptimum == -1)
596
+            if(globalOptimumLength == -1)
610
             {
597
             {
611
-                globalOptimum = nextRouteLength;
598
+                globalOptimumLength = nextRouteLength;
599
+                globalOptimum = nextRoute;
612
                 optimalRoute = nextRoute;
600
                 optimalRoute = nextRoute;
613
 
601
 
614
                 // Reset licznika
602
                 // Reset licznika
615
                 stopCounter = 0;
603
                 stopCounter = 0;
616
 
604
 
617
-                std::cout << "Nowa najlepsza trasa: " << globalOptimum << std::endl;
605
+                std::cout << "Nowa najlepsza trasa: " << globalOptimumLength << std::endl;
618
             }
606
             }
619
-            else if(globalOptimum > nextRouteLength)
607
+            else if(globalOptimumLength > nextRouteLength)
620
             {
608
             {
621
-                globalOptimum = nextRouteLength;
609
+                globalOptimumLength = nextRouteLength;
610
+                globalOptimum = nextRoute;
622
                 optimalRoute = nextRoute;
611
                 optimalRoute = nextRoute;
623
 
612
 
624
                 // Zaplanowanie intensyfikacji przy znalezieniu nowego optimum
613
                 // Zaplanowanie intensyfikacji przy znalezieniu nowego optimum
627
                 // Reset licznika
616
                 // Reset licznika
628
                 stopCounter = 0;
617
                 stopCounter = 0;
629
 
618
 
630
-                std::cout << "Nowa najlepsza trasa: " << globalOptimum << std::endl;
619
+                std::cout << "Nowa najlepsza trasa: " << globalOptimumLength << std::endl;
631
             }
620
             }
632
             globalOptimumMutex.unlock();
621
             globalOptimumMutex.unlock();
633
 
622
 
698
         stopCounter = 0;
687
         stopCounter = 0;
699
     }
688
     }
700
 
689
 
701
-    result = optimalRoute;
702
-    resultLength = optimalRouteLength;
690
+std::cout << std::endl;
703
 }
691
 }

+ 1
- 1
Graph.h Parādīt failu

26
         unsigned vertexNumber;
26
         unsigned vertexNumber;
27
 
27
 
28
     private:
28
     private:
29
-        static void travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps, bool diversification, int iterationsToRestart, unsigned minStopTime, std::vector<unsigned> startRoute, std::vector<unsigned> &result, int &resultLength, unsigned &globalOptimum, std::mutex &globalOptimumMutex);
29
+        static void travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps, bool diversification, int iterationsToRestart, unsigned minStopTime, std::vector<unsigned> startRoute, std::vector<unsigned> &globalOptimum, unsigned &globalOptimumLength, std::mutex &globalOptimumMutex);
30
 
30
 
31
         class RouteComparison
31
         class RouteComparison
32
         {
32
         {

Notiek ielāde…
Atcelt
Saglabāt