Advertisement
Guest User

Untitled

a guest
Jun 24th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.34 KB | None | 0 0
  1. #include <fstream>
  2. #include <iostream>
  3. #include <vector>
  4. #include <cstdlib>
  5. #include <time.h>
  6. #include <string>
  7. #include <algorithm>
  8. #include <ctime>
  9. using namespace std;
  10.  
  11. int main() {
  12. srand(time(NULL));
  13.  
  14. cout << "Porownanie algorytmow WalkSAT i GSAT\n\n";
  15. int ilosc_zmiennych, ilosc_implicentow, min_zmiennych, max_zmiennych;
  16.  
  17. if(!ifstream("funkcja.txt")) {
  18. cout << "Nie znaleziono pliku funkcja.txt, generowanie.\n";
  19. ofstream plik("funkcja.txt");
  20. if(!plik) {
  21. cout << "Nie mozna utworzyc pliku.";
  22. }
  23. else {
  24. cout << "Podaj maksymalna liczbe zmiennych: ";
  25. cin >> ilosc_zmiennych;
  26. cout << "Podaj liczbe implicentow: ";
  27. cin >> ilosc_implicentow;
  28. cout << "Podaj minimalna liczbe zmiennych w implicencie: ";
  29. cin >> min_zmiennych;
  30. cout << "Podaj maksymalna liczbe zmiennych w implicencie (maksimum " << ilosc_zmiennych << "): ";
  31. cin >> max_zmiennych;
  32.  
  33. vector <int> zmienne;
  34. for (size_t i = 0; i < ilosc_zmiennych; i++) {
  35. zmienne.push_back(i);
  36. }
  37. for (int i = 0; i < ilosc_implicentow; i++) {
  38. plik << "( ";
  39. int ile = rand() % (max_zmiennych - min_zmiennych + 1) + min_zmiennych;
  40. int* bufor = new int[ile];
  41. for (int j = 0; j < ile; j++) {
  42. int zmienna = rand() % zmienne.size();
  43. if (rand() % 2) {
  44. plik << "x" << zmienne[zmienna];
  45. }
  46. else {
  47. plik << "~x" << zmienne[zmienna];
  48. }
  49. bufor[j] = zmienne[zmienna];
  50. zmienne.erase(zmienne.begin() + zmienna);
  51. if (j != ile-1) {
  52. plik << " v ";
  53. }
  54. }
  55. for (int j = 0; j < ile; j++) {
  56. zmienne.push_back(bufor[j]);
  57. }
  58. delete[] bufor;
  59. plik << " )";
  60. if (i != ilosc_implicentow-1) {
  61. plik << " ^ ";
  62. }
  63. }
  64. plik.close();
  65. cout << "Wygenerowano.\n\n";
  66. }
  67. }
  68.  
  69. ifstream plik("funkcja.txt");
  70. if(plik) {
  71. vector <vector <vector <int>>> funkcja;
  72. vector <int> zmienne, wartosci_zmiennych;
  73. string wyraz, a, b;
  74. while (plik >> a) {
  75. if (a == "(") {
  76. vector <vector <int>> implicent;
  77. while (plik >> b) {
  78. if (b == ")") {
  79. funkcja.push_back(implicent);
  80. vector <vector <int>>().swap(implicent);
  81. break;
  82. }
  83. else if (b[0] == 'x') {
  84. implicent.push_back(vector <int> { atoi(b.substr(1).c_str()), 1 });
  85. if(find(zmienne.begin(), zmienne.end(), atoi(b.substr(1).c_str())) == zmienne.end()) {
  86. zmienne.push_back(atoi(b.substr(1).c_str()));
  87. wartosci_zmiennych.push_back(0);
  88. }
  89. }
  90. else if (b[0] == '~') {
  91. implicent.push_back(vector <int> { atoi(b.substr(2).c_str()), 0 });
  92. if(find(zmienne.begin(), zmienne.end(), atoi(b.substr(2).c_str())) == zmienne .end()) {
  93. zmienne.push_back(atoi(b.substr(2).c_str()));
  94. wartosci_zmiennych.push_back(0);
  95. }
  96. }
  97. }
  98. }
  99. }
  100. cout << "Zaladowano funkcje z pliku funkcja.txt, funkcja zawiera " << funkcja.size() << " implicentow oraz " << zmienne.size() << " roznych zmiennych.\n";
  101. //cout << "Zaczynam od ukladu zmiennych:\n";
  102. int czas_poddania_sie;
  103. cout << "Podaj czas, po ktorym algorytmy maja wystartowac ponownie, z nowym losowym przyporzadkowaniem (w sekundach): ";
  104. cin >> czas_poddania_sie;
  105. for (int i = 0; i < zmienne.size(); i++) {
  106. wartosci_zmiennych[i] = rand() % 2;
  107. //cout << "x" << zmienne[i] << " = " << wartosci_zmiennych[i];
  108. //if ((i+1) % 3 == 0) cout << endl;
  109. //else cout << "\t\t";
  110. }
  111. //cout << endl;
  112.  
  113. //WalkSAT
  114. cout << "\nRozwiazywanie problemu metoda WalkSAT...";
  115. clock_t poczatek_walksata = clock();
  116. clock_t ostatnie_losowowanie = clock();
  117. int losowan_walksata = 1;
  118. int walksat_iteracje = 0;
  119. int ilosc_prawdziwych;
  120. bool* czy_implicent_prawdziwy = new bool[funkcja.size()]();
  121. while(ilosc_prawdziwych != funkcja.size()) {
  122. if ((double(clock() - ostatnie_losowowanie) / CLOCKS_PER_SEC) > czas_poddania_sie) {
  123. losowan_walksata++;
  124. for (int i = 0; i < zmienne.size(); i++) {
  125. wartosci_zmiennych[i] = rand() % 2;
  126. }
  127. ostatnie_losowowanie = clock();
  128. }
  129. ilosc_prawdziwych = 0;
  130.  
  131. for (int i = 0; i < funkcja.size(); i++) {
  132. czy_implicent_prawdziwy[i] = false;
  133. for (int j = 0; j < funkcja[i].size(); j++) {
  134. int index_obecnej_zmiennej = distance(zmienne.begin(), find(zmienne.begin(), zmienne.end(), funkcja[i][j][0]));
  135. if (wartosci_zmiennych[index_obecnej_zmiennej] == funkcja[i][j][1]) {
  136. //cout << "x" << funkcja[i][j][0] << " == " << wartosci_zmiennych[index_obecnej_zmiennej] << endl;
  137. czy_implicent_prawdziwy[i] = true;
  138. ilosc_prawdziwych++;
  139. break;
  140. }
  141. }
  142.  
  143. }
  144.  
  145. for(int i = 0; i < funkcja.size(); i++) {
  146. //cout << "implicent nr " << i+1 << " zwraca " << czy_implicent_prawdziwy[i] << endl;
  147. }
  148.  
  149. if (ilosc_prawdziwych == funkcja.size()) {
  150. clock_t koniec_walksata = clock();
  151. double czas_walksata = double(koniec_walksata - poczatek_walksata) / CLOCKS_PER_SEC;
  152. cout << "\n\nWalkSAT zakonczyl dzialanie sukcesem.\nDokonano " << walksat_iteracje << " iteracji w czasie " << czas_walksata*1000 << " milisekund, korzystajac z ponownego losowania " << losowan_walksata-1 << " raz(y).\nUzyskane rozwiazanie:\n";
  153. for (int i = 0; i < zmienne.size(); i++) {
  154. cout << "x" << zmienne[i] << " = " << wartosci_zmiennych[i];
  155. if ((i+1) % 4 == 0) cout << endl;
  156. else cout << "\t\t";
  157. }
  158. cout << endl;
  159. }
  160. else {
  161. int wybrany_implicent = rand() % (funkcja.size() - ilosc_prawdziwych);
  162. int obecny_implicent = 0;
  163. for (int i = 0; i < funkcja.size(); i++) {
  164. if (czy_implicent_prawdziwy[i]) continue;
  165. if (obecny_implicent == wybrany_implicent) {
  166. int wybrana_zmienna = rand() % funkcja[i].size();
  167. int index_wybranej_zmiennej = distance(zmienne.begin(), find(zmienne.begin(), zmienne.end(), funkcja[i][wybrana_zmienna][0]));
  168. wartosci_zmiennych[index_wybranej_zmiennej] = !wartosci_zmiennych[index_wybranej_zmiennej];
  169. //cout << "zamieniam zmienna x" << funkcja[i][wybrana_zmienna][0] << endl;
  170. walksat_iteracje++;
  171. break;
  172. }
  173. else obecny_implicent++;
  174. }
  175. }
  176.  
  177. }
  178.  
  179. cout << endl;
  180. //GSAT
  181. cout << "Rozwiazywanie problemu metoda GSAT...";
  182. clock_t poczatek_gsata = clock();
  183. ostatnie_losowowanie = clock();
  184. int losowan_gsata = 1;
  185. for (int i = 0; i < zmienne.size(); i++) {
  186. wartosci_zmiennych[i] = rand() % 2;
  187. }
  188. ilosc_prawdziwych = 0;
  189. int gsat_iteracje = 0;
  190. int index_wybranej_zmiennej = 0;
  191. int rekord_prawdziwych_implicentow = 0;
  192. int* ilosc_prawdziwych_dla = new int[zmienne.size()]();
  193. while(ilosc_prawdziwych != funkcja.size()) {
  194. if ((double(clock() - ostatnie_losowowanie) / CLOCKS_PER_SEC) > czas_poddania_sie) {
  195. losowan_gsata++;
  196. for (int i = 0; i < zmienne.size(); i++) {
  197. wartosci_zmiennych[i] = rand() % 2;
  198. }
  199. ostatnie_losowowanie = clock();
  200. }
  201. ilosc_prawdziwych = 0;
  202.  
  203. for (int i = 0; i < funkcja.size(); i++) {
  204. czy_implicent_prawdziwy[i] = false;
  205. for (int j = 0; j < funkcja[i].size(); j++) {
  206. int index_obecnej_zmiennej = distance(zmienne.begin(), find(zmienne.begin(), zmienne.end(), funkcja[i][j][0]));
  207. if (wartosci_zmiennych[index_obecnej_zmiennej] == funkcja[i][j][1]) {
  208. czy_implicent_prawdziwy[i] = true;
  209. ilosc_prawdziwych++;
  210. break;
  211. }
  212. }
  213.  
  214. }
  215.  
  216. if (ilosc_prawdziwych == funkcja.size()) {
  217. clock_t koniec_gsata = clock();
  218. double czas_gsata = double(koniec_gsata - poczatek_gsata) / CLOCKS_PER_SEC;
  219. cout << "\n\nGSAT zakonczyl dzialanie sukcesem.\nDokonano " << gsat_iteracje << " iteracji w czasie " << czas_gsata*1000 << " milisekund, korzystajac z ponownego losowania " << losowan_gsata-1 << " raz(y).\nUzyskane rozwiazanie:\n";
  220. for (int i = 0; i < zmienne.size(); i++) {
  221. cout << "x" << zmienne[i] << " = " << wartosci_zmiennych[i];
  222. if ((i+1) % 4 == 0) cout << endl;
  223. else cout << "\t\t";
  224. }
  225. cout << endl;
  226. }
  227. else {
  228. for (int i = 0; i < zmienne.size(); i++) {
  229. wartosci_zmiennych[i] = !wartosci_zmiennych[i];
  230. ilosc_prawdziwych_dla[i] = 0;
  231. for (int j = 0; j < funkcja.size(); j++) {
  232. for (int k = 0; k < funkcja[j].size(); k++) {
  233. int index_obecnej_zmiennej = distance(zmienne.begin(), find(zmienne.begin(), zmienne.end(), funkcja[j][k][0]));
  234. if (wartosci_zmiennych[index_obecnej_zmiennej] == funkcja[j][k][1]) {
  235. ilosc_prawdziwych_dla[i]++;
  236. break;
  237. }
  238. }
  239. }
  240. if (ilosc_prawdziwych_dla[i] > rekord_prawdziwych_implicentow) {
  241. rekord_prawdziwych_implicentow = ilosc_prawdziwych_dla[i];
  242. index_wybranej_zmiennej = i;
  243. }
  244. wartosci_zmiennych[i] = !wartosci_zmiennych[i];
  245. }
  246. wartosci_zmiennych[index_wybranej_zmiennej] = !wartosci_zmiennych[index_wybranej_zmiennej];
  247. gsat_iteracje++;
  248. }
  249.  
  250. }
  251.  
  252. }
  253.  
  254. return 0;
  255. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement