Advertisement
Guest User

Untitled

a guest
Dec 6th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.14 KB | None | 0 0
  1. int TSP::tabuSearchBasicSwap(int n, bool save)
  2. {
  3. //struktura sąsiednich scierzek
  4. struct swapList
  5. {
  6. int a;
  7. int b;
  8. int improvment;
  9. };
  10. //lista tabu
  11. int ** tabu;
  12. for (int i = 0; i < instance.getSize();i++) {
  13. tabu[i] = new int[instance.getSize()];
  14. for (int j = i + 1; j < instance.getSize();j++) {
  15. tabu[i][j] = 0;
  16. }
  17. }
  18. //wstępnie nalepsza ścierzka i jej koszt
  19. int* best = bbFastBestPath();
  20. int bestCost = instance.calculateCost(best);
  21.  
  22. //obecna scierzka
  23. int* current = bbFastBestPath();
  24. int currentCost = bestCost;
  25.  
  26.  
  27. //warunkiem stopu będzie ilość iteracji zadana w parametrze fubnkcji i domyślnie wynosząca 100
  28. while (n>0) {
  29. //krok 1
  30. //tworzenie sasiadow
  31. vector<swapList>neighbours;
  32. for(int i = 0 ; i < instance.getSize() ;i++)
  33. for (int j = i + 1 ; j < instance.getSize();j++) {
  34. swapList element;
  35. element.a = current[i];
  36. element.b = current[j];
  37. //ulepszenie wynosi nowy koszt odjąć stary
  38. element.improvment = swappedElementCost(i, j, current) - currentCost;
  39. neighbours.push_back(element);
  40. }
  41. cout << neighbours.size();
  42. for (int i = 0; i < neighbours.size(); i++) printf("[%3d,%3d : %2d]\n",neighbours[i].a, neighbours[i].b, neighbours[i].improvment);
  43.  
  44.  
  45. //krok 2
  46. //petla z wuybieranuiem sasiada:
  47. //najlepszy niezakazany, chyba że zakazany jest lepszy od best
  48.  
  49. //teraz należy znaleźć najmniejszy
  50. bool foundSwap = false;
  51.  
  52. //zmienna do akcji na sąsiedztwie
  53. int select;
  54. int indexOfBestImprovement=0;
  55. do {
  56. int bestNeighbour = neighbours[0].improvment;
  57. for (int i = 1; i < instance.getSize();i++)
  58. if (neighbours[i].improvment < bestNeighbour) {
  59. indexOfBestImprovement = i;
  60. bestNeighbour = neighbours[i].improvment;
  61. }
  62. //znalezlismy najmniejszy teraz sprawdzamy czy zgadza sie z kryterium aspiracji ponieważ jest to warunek nadrzędny nad listą tabu
  63. if (currentCost + neighbours[indexOfBestImprovement].improvment < bestCost) {
  64. select = 1;
  65. foundSwap = true;
  66. //jeżeli tabu zaprzecza to należy sprawdzic kryterium aspiracji
  67. //naszym kryterium
  68. }
  69. else if (tabu[neighbours[indexOfBestImprovement].a][neighbours[indexOfBestImprovement].b] < 1) {
  70. select = 2;
  71. foundSwap = true;
  72. //jeżeli kryterium aspiracji nie zatwierdza tej zmiany i tabu też się nie zgadza to szukamy kolejnego lokalnie najleopszego sąsiedztwa
  73. //czyli w kwesti implementacyjnej usuwamy ten element z listy i rozpartrujemy od nowa pętle do-while
  74. }
  75. else {
  76. neighbours.erase(neighbours.begin() + indexOfBestImprovement);
  77. }
  78. //mam zamiar nie doprowadzic do sytuacji gdy wszystkie swapy będą zakazane ponieważ kadencja zakazu będzie mniejsza od liczby elementów
  79. //czyli nie będzie sytuacji aby wszystkie ruchy na raz były zakazane
  80.  
  81. //w przeciwnym razie jednak należy to tutaj uwzględnić, zawsze należy jakiegoś sąsiada wybrać
  82. } while (!foundSwap);
  83.  
  84. //krok 3
  85. //aktualizacja
  86.  
  87. //posłużymy się naszym selectem poniewaaż gdy trzeba nadpisać best to również trzeba nadpisać current więc swich z case3m bez breaka będzie elegancko wyglądał
  88.  
  89. switch (select) {
  90. //1 oznacza że przebiło kryterium aspiracji dlatego warunek tabu nas nie interesuje, musimy nadpisać besty
  91. case 1:
  92. //przepisanie nowego besta
  93. for (int i = 0; i < instance.getSize();i++) best[i] = current[i];
  94.  
  95. //zamiana elementow
  96. int tmp = best[neighbours[indexOfBestImprovement].a];
  97. best[neighbours[indexOfBestImprovement].a] = best[neighbours[indexOfBestImprovement].b];
  98. best[neighbours[indexOfBestImprovement].b] = tmp;
  99.  
  100. //przypisanie najmniejszego kosztu
  101. bestCost = instance.calculateCost(best);
  102. //nadpisanie bestów oznacza ze current również będzie lepszy i przechodzimy do tego kroku, brak breaka sprawia że wykonujemy albo warunek 1 i 2 albo tylko 2
  103. case 2:
  104. //zamieniamy w currencie elementy tak jak dla besta
  105. int tmp = current[neighbours[indexOfBestImprovement].a];
  106. current[neighbours[indexOfBestImprovement].a] = current[neighbours[indexOfBestImprovement].b];
  107. current[neighbours[indexOfBestImprovement].b] = tmp;
  108.  
  109. //nadpisujemy chwilowy koszt
  110. currentCost = instance.calculateCost(current);
  111.  
  112. //nakładamy zakaz na zamiane tych 2 elementów na n/2(ale nie mniej niż jeden) ruchów NIE WIEM NA ILE NAKŁADAĆ
  113. //czyli implementacyjnie ustawiamy kolejne atrybuty na liście tabu;
  114. tabu[neighbours[indexOfBestImprovement].a][neighbours[indexOfBestImprovement].b] = n / 2 > 0 ? n / 2 : 1;
  115. tabu[neighbours[indexOfBestImprovement].b][neighbours[indexOfBestImprovement].a] = n / 2 > 0 ? n / 2 : 1;
  116.  
  117. break;
  118. //nie widzę opcji dojścia turtaj z innym warunkiem select dlategop dla pewności zatrzymajmy funkcje z kodem błędu
  119. default:
  120. return -1;
  121. break;
  122.  
  123. }
  124. //znaleźliśmy najmniejszy wykonaliśmy zamiane jeśli jakimś dziwnym trafem program się wywali to znaczy że wybór sąsiada szwankuje
  125. //po wyjkonaniu musimy zmniejszyć ilość interesujących nass iteracji
  126. n--;
  127. //i koniecznie zmniejszyć wartości listy tabu
  128. tabuDecrementation(tabu);
  129. }
  130.  
  131. return bestCost;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement