Advertisement
Guest User

Untitled

a guest
Dec 15th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.23 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <random>
  4. #include <cstdlib>
  5. #include <iterator>
  6. #include <ctime>
  7. #include "Sign.h"
  8. #include "Edge.h"
  9. #include <random>
  10.  
  11. std::vector<Sign> Sig;
  12. std::vector<Edge> Wierz;
  13. int iloscWierzcholkow = 0;
  14. int iloscKrawedzi = 0;
  15. float T = 1000000.0;
  16. float kara = 1000000.0;
  17. int *LosowaPermutacja = new int[16];
  18. float sumaLosowej = 0.0;
  19. float fi = 0.99;
  20.  
  21.  
  22. void Data(const std::string& a)
  23. {
  24. Sign s;
  25. Edge w;
  26. std::ifstream plik;
  27. plik.open(a.c_str());
  28. if (plik.good())
  29. {
  30. plik >> iloscWierzcholkow;
  31. for (int i = 0; i < iloscWierzcholkow; i++)
  32. {
  33. plik >> s;
  34. Sig.push_back(s);
  35. }
  36. plik >> iloscKrawedzi;
  37. for (int i = 0; i < iloscKrawedzi; i++)
  38. {
  39. plik >> w;
  40. Wierz.push_back(w);
  41. }
  42. }
  43. else
  44. {
  45. std::cout << "Brak pliku" << std::endl;
  46. }
  47. plik.close();
  48. }
  49.  
  50. void PrintWczytaneDane()
  51. {
  52. for (int i = 0; i < Wierz.size(); i++)
  53. {
  54. std::cout << Wierz[i].pierwszy;
  55. std::cout << " - ";
  56. std::cout << Wierz[i].drugi;
  57. std::cout << " waga = ";
  58. std::cout << Wierz[i].waga << std::endl;
  59. }
  60. }
  61.  
  62. int LosujWierzcholek()
  63. {
  64. int wybor = 0;
  65. int* tmpTab = new int[iloscWierzcholkow];
  66. for (int i = 0; i < iloscWierzcholkow; i++)
  67. {
  68. tmpTab[i] = Sig[i].liczba;
  69. }
  70. wybor = (rand() % iloscWierzcholkow - 1);
  71. return tmpTab[wybor];
  72. }
  73.  
  74. void LosujPermutacje(bool czyZapisac)
  75. {
  76. int wylosowanyWierzcholek = 0;
  77. int *Odwiedzone = new int[iloscWierzcholkow];
  78. int licznikTablicyOdwiedzonych = 0;
  79. long float suma = 0.0;
  80. int losowaPermutacja = 0;
  81.  
  82. do {
  83. wylosowanyWierzcholek = LosujWierzcholek();
  84. for (int i = 0; i < iloscWierzcholkow; i++)
  85. {
  86. if (Odwiedzone[i] == wylosowanyWierzcholek)
  87. {
  88. break;
  89. }
  90. if (i + 1 == iloscWierzcholkow)
  91. {
  92. Odwiedzone[licznikTablicyOdwiedzonych] = wylosowanyWierzcholek;
  93. licznikTablicyOdwiedzonych++;
  94. }
  95. }
  96. } while (licznikTablicyOdwiedzonych != 16);
  97. for (int i = 0; i < iloscWierzcholkow; i++)
  98. {
  99. for (int j = 0; j < Wierz.size(); j++)
  100. {
  101. if (i != iloscWierzcholkow - 1)
  102. {
  103. //sumujemy wagi krawedzi miedzy elementami
  104. if ((Odwiedzone[i] == Wierz[j].pierwszy && Odwiedzone[i + 1] == Wierz[j].drugi) || (Odwiedzone[i] == Wierz[j].drugi && Odwiedzone[i + 1] == Wierz[j].pierwszy))
  105. {
  106. suma += Wierz[j].waga;
  107. break;
  108. }
  109. else if (j + 1 == Wierz.size())
  110. {
  111. suma += kara;
  112. }
  113. }
  114. else if (i == iloscWierzcholkow - 1)
  115. {
  116. //sumujemy wagi elementow ostatniego z pierwszym
  117. if ((Odwiedzone[i] == Wierz[j].pierwszy && Odwiedzone[0] == Wierz[j].drugi) || (Odwiedzone[i] == Wierz[j].drugi && Odwiedzone[0] == Wierz[j].pierwszy))
  118. {
  119. suma += Wierz[j].waga;
  120. break;
  121. }
  122. else if (j + 1== Wierz.size())
  123. {
  124. suma += kara;
  125. }
  126. }
  127. }
  128. }
  129. if (czyZapisac)
  130. {
  131. for (int i = 0; i < iloscWierzcholkow; i++)
  132. {
  133. LosowaPermutacja[i] = Odwiedzone[i];
  134. }
  135. sumaLosowej = suma;
  136. }
  137. //PERMUTACJE NA EKRAN
  138. //std::cout << std::endl;
  139. //for (int i = 0; i < iloscWierzcholkow; i++)
  140. //{
  141. // std::cout << Odwiedzone[i] << " ";
  142. //}
  143. //printf("Suma: %.0f\n", suma);//wyswietlamy duze liczby bez e do potegi
  144. }
  145.  
  146. void PrintLosowaPermutacja()
  147. {
  148. std::cout << std::endl << "Wylosowano: ";
  149. for (int i = 0; i < iloscWierzcholkow; i++)
  150. {
  151. std::cout << LosowaPermutacja[i] << " ";
  152. }
  153. printf("Suma: %.0f\n", sumaLosowej);//wyswietlamy duze liczby bez e do potegi
  154. }
  155.  
  156. float RandomFloat(float min, float max)
  157. {
  158. return (max - min) * ((((float)rand()) / (float)RAND_MAX)) + min;
  159. }
  160.  
  161. bool PrzestawWierzcholki()
  162. {
  163. int tmpPierwszy = 0;
  164. int tmpDrugi = 0;
  165. float tmpSuma = sumaLosowej;
  166. float roznica = 0.0;
  167. int pierwszy = 0;
  168. int drugi = 0;
  169. float prawdopodobienstwoAkceptacji = 0.0;
  170. float prawdopodobienstwo = 0.0;
  171. bool status = false;
  172.  
  173. //Losujemy dwa wierzcholki do przestawienia
  174.  
  175. pierwszy = (rand() % iloscWierzcholkow - 1);
  176. do
  177. {
  178. drugi = (rand() % iloscWierzcholkow - 1);
  179. } while (drugi==pierwszy);
  180.  
  181. std::cout << std::endl << "Wybrano do przestawienia: " << pierwszy +1<< " Wartosc: " << LosowaPermutacja[pierwszy] << " i " << drugi +1<< " Wartosc: " << LosowaPermutacja[drugi] << std::endl;
  182. tmpPierwszy = LosowaPermutacja[pierwszy];
  183. tmpDrugi = LosowaPermutacja[drugi];
  184. LosowaPermutacja[pierwszy] = LosowaPermutacja[drugi];
  185. LosowaPermutacja[drugi] = tmpPierwszy;
  186.  
  187. //Liczymy nowa sume
  188. sumaLosowej = 0.0;
  189. for (int i = 0; i < iloscWierzcholkow; i++)
  190. {
  191. for (int j = 0; j < Wierz.size(); j++)
  192. {
  193. if (i != iloscWierzcholkow - 1)
  194. {
  195. //sumujemy wagi krawedzi miedzy elementami
  196. if ((LosowaPermutacja[i] == Wierz[j].pierwszy && LosowaPermutacja[i + 1] == Wierz[j].drugi) || (LosowaPermutacja[i] == Wierz[j].drugi && LosowaPermutacja[i + 1] == Wierz[j].pierwszy))
  197. {
  198. sumaLosowej += Wierz[j].waga;
  199. break;
  200. }
  201. else if (j + 1 == Wierz.size())
  202. {
  203. sumaLosowej += kara;
  204. }
  205. }
  206. else if (i == iloscWierzcholkow - 1)
  207. {
  208. //sumujemy wagi elementow ostatniego z pierwszym
  209. if ((LosowaPermutacja[i] == Wierz[j].pierwszy && LosowaPermutacja[0] == Wierz[j].drugi) || (LosowaPermutacja[i] == Wierz[j].drugi && LosowaPermutacja[0] == Wierz[j].pierwszy))
  210. {
  211. sumaLosowej += Wierz[j].waga;
  212. break;
  213. }
  214. else if (j + 1 == Wierz.size())
  215. {
  216. sumaLosowej += kara;
  217. }
  218. }
  219. }
  220. }
  221.  
  222. //Liczymy roznice sum krawedzi
  223. roznica = sumaLosowej - tmpSuma;
  224. printf("Roznica: %.0f\n", roznica); //wyswietlamy duze liczby bez e do potegi
  225.  
  226. //Liczymy prawdopodobienstwo dla przestawienia
  227. prawdopodobienstwo = pow(exp(1.0), ((-1.0) * (roznica / T)));
  228. std::cout <<"Prawdopodobienstwo przestawienia: " <<prawdopodobienstwo <<std::endl;
  229.  
  230. //Liczymy Prawdopodobienstwo akceptacji
  231. prawdopodobienstwoAkceptacji = RandomFloat(0.0, 1.0);
  232. std::cout << "Prawdopodobienstwo akceptacji: " << prawdopodobienstwoAkceptacji << std::endl;
  233.  
  234. if ((roznica < 0) || (prawdopodobienstwoAkceptacji <= prawdopodobienstwo))
  235. {
  236. //jesli akceptujemy to zostawiamy
  237.  
  238. T = fi * T;
  239. std::cout << "Temperatura: " << T << std::endl;
  240. return true;
  241. }
  242. else
  243. {
  244. //Jesli nie akceptujemy to przywracamy stan poprzedni
  245. LosowaPermutacja[pierwszy] = tmpPierwszy;
  246. LosowaPermutacja[drugi] = tmpDrugi;
  247. sumaLosowej = tmpSuma;
  248.  
  249. T = fi * T;
  250. std::cout << "Temperatura: " << T << std::endl;
  251. return false;
  252. }
  253. }
  254.  
  255.  
  256. int main()
  257. {
  258. srand(time(NULL));
  259. int losowa = 0;
  260. int i = 0;
  261. Data("plik.txt"); // Wczytujemy pliik
  262. PrintWczytaneDane();// Wczytany plik na ekran
  263. int j = 0;
  264. /*do {*/
  265. i = 0;
  266. j++;
  267. for (int i = 0; i < 1000; i++)
  268. {
  269. losowa = std::rand() % 999 + 1;
  270. if (i == losowa)LosujPermutacje(true); // Losujemy 1000 permutacji z krawedzi i liczymy sume krawedzi
  271. else LosujPermutacje(false);
  272. }
  273.  
  274. PrintLosowaPermutacja();
  275.  
  276. do {
  277. i++;
  278. if (PrzestawWierzcholki())
  279. {
  280. std::cout << std::endl << "------------------------------AKCEPTACJA ITERACJA: "<<i<<"------------------------------" << std::endl;
  281. PrintLosowaPermutacja();
  282. }
  283. else
  284. {
  285. std::cout << std::endl << "----------------------------BRAK AKCEPTACJI ITERACJA: " << i << "---------------------------" << std::endl;
  286. PrintLosowaPermutacja();
  287. }
  288. } while (sumaLosowej > 3000);
  289. PrintLosowaPermutacja();
  290. //} while (j != 100);
  291. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement