Advertisement
Guest User

Untitled

a guest
Jan 17th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.71 KB | None | 0 0
  1. using System;
  2.  
  3. namespace NudnyProjektZCiekawegoPrzedmiotu
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. int d = 10;
  10. int N = 20;
  11.  
  12. int[] pomocna = new int[N];
  13.  
  14. double fi1 = 0.01;
  15. double fi2 = 2;
  16. double S = 0;
  17.  
  18. double ograniczenie = 15;
  19.  
  20. double[,,] X = new double[10000, N, d];
  21. double[,] poprzednieX = new double[N, d];
  22. double[,] V = new double[N, d];
  23. double[] fx = new double[N];
  24. double[] fxw = new double[N];
  25. double[,] p = new double[N, d];
  26. double[] g = new double[d];
  27. double[] pbest = new double[N];
  28. int[] epoki = new int[3];
  29. double gbest = 0;
  30. double gwaga = 0;
  31. int e = 1;
  32.  
  33. int warunek = 0;
  34.  
  35. double[] wartosc = new double[d];
  36. double[] waga = new double[d];
  37.  
  38. Random liczba = new Random();
  39.  
  40. wyzerujTabliceJednowym(pbest, N);
  41.  
  42. wartosc[0] = 5;
  43. wartosc[1] = 10;
  44. wartosc[2] = 7;
  45. wartosc[3] = 3;
  46. wartosc[4] = 12;
  47. wartosc[5] = 15;
  48. wartosc[6] = 8;
  49. wartosc[7] = 4;
  50. wartosc[8] = 18;
  51. wartosc[9] = 13;
  52.  
  53. waga[0] = 12;
  54. waga[1] = 5;
  55. waga[2] = 9;
  56. waga[3] = 1;
  57. waga[4] = 5;
  58. waga[5] = 13;
  59. waga[6] = 2;
  60. waga[7] = 18;
  61. waga[8] = 23;
  62. waga[9] = 10;
  63.  
  64. wszystkieOpcje(wartosc, waga, ograniczenie, N, d, liczba);
  65.  
  66. //Inicjalizacja
  67.  
  68. inicjalizacjaX(X, d, N, liczba);
  69. inicjalizacjaV(V, d, N, liczba);
  70.  
  71. //Epoki
  72.  
  73. do
  74. {
  75. wyzerujTabliceJednowym(fx, N);
  76. wyzerujTabliceJednowym(fxw, N);
  77.  
  78. //Liczenie dla kazdej czastki wartosc fx
  79.  
  80. for (int i = 0; i < N; i++)
  81. {
  82. liczenieWartosciFunkcji(wartosc, fx, X, d, i, e);
  83. liczenieWartosciFunkcji(waga, fxw, X, d, i, e);
  84.  
  85. if (fxw[i] <= ograniczenie)
  86. {
  87. if (fx[i] > pbest[i])
  88. {
  89. pbest[i] = fx[i];
  90. for (int j = 0; j < d; j++)
  91. {
  92. p[i, j] = X[e, i, j];
  93. }
  94. }
  95.  
  96. if (fx[i] > gbest)
  97. {
  98. gbest = fx[i];
  99. for (int j = 0; j < d; j++)
  100. {
  101. g[j] = X[e, i, j];
  102. gwaga = fxw[i];
  103. }
  104. }
  105. }
  106. }
  107.  
  108. //Aktualizacja predkosci i pozycji czastki
  109.  
  110. wyzerujTabliceJednowym(fxw, N);
  111.  
  112. for (int i = 0; i < N; i++)
  113. {
  114. aktualizacjaCzastki(V, X, p, g, S, i, e, fi1, fi2, d, liczba);
  115. liczenieWartosciFunkcji(waga, fxw, X, d, i, e);
  116.  
  117. if (fxw[i] > ograniczenie)
  118. {
  119. for (int j = 0; j < d; j++)
  120. {
  121. X[e, i, j] = X[e - 1, i, j];
  122. }
  123. }
  124. }
  125.  
  126. //Console.WriteLine("Epoka " + (e));
  127. //wypiszWektoryTrzy(X, d, e, N);
  128. e++;
  129.  
  130. //Warunek stopu - sprawdzanie, czy wszystkie czastki osiagnely taka sama pozycje
  131.  
  132. if (e > N)
  133. {
  134. int pomocnaTabeli = 0;
  135. for (int i = 0; i < N; i++)
  136. {
  137. int pomocnaJ = 0;
  138. for (int j = 0; j < N; j++)
  139. {
  140. if (i != j)
  141. {
  142. int pomocnaD = 0;
  143. for (int k = 0; k < d; k++)
  144. {
  145. if (X[e, i, k] == X[e, j, k])
  146. {
  147. pomocnaD++;
  148. }
  149. }
  150. if (pomocnaD == d)
  151. {
  152. pomocnaJ++;
  153. }
  154. }
  155. }
  156. if (pomocnaJ == (N - 1))
  157. {
  158. pomocnaTabeli++;
  159. }
  160. }
  161.  
  162. if (pomocnaTabeli == N)
  163. {
  164. warunek = 1;
  165. }
  166. }
  167.  
  168. if (e == 10000)
  169. {
  170. warunek = 1;
  171. }
  172.  
  173. //DODAC TEN DRUGI WARUNEK, GDZIE PRZEZ TE 3 EPOKI <<POD RZAD>> NIE MA ZMIAN
  174.  
  175. if(e > 3)
  176. {
  177. int pomN = 0;
  178. for(int i = 0; i < N; i++)
  179. {
  180. int pomD = 0;
  181. for(int j = 0; j < d; j++)
  182. {
  183. if(X[e - 2, i, j] == X[e - 1, i, j] && X[e - 2, i, j] == X[e, i, j] && X[e - 1, i, j] == X[e, i, j])
  184. {
  185. pomD++;
  186. }
  187. }
  188.  
  189. if(pomD == d)
  190. {
  191. pomN++;
  192. }
  193. }
  194.  
  195. if(pomN == N)
  196. {
  197. warunek = 1;
  198. }
  199. }
  200.  
  201. } while (warunek == 0);
  202.  
  203.  
  204. Console.WriteLine();
  205. Console.WriteLine("Epok: " + e);
  206. Console.WriteLine("Gbest: " + gbest);
  207. Console.WriteLine("Waga: " + gwaga);
  208. Console.WriteLine("Itemki: ");
  209. for (int i = 0; i < d; i++)
  210. {
  211. Console.Write(g[i] + " ");
  212. }
  213.  
  214. Console.ReadKey();
  215. }
  216.  
  217. static void inicjalizacjaX(double[,,] X, int d, int N, Random liczba)
  218. {
  219. for (int i = 0; i < N; i++)
  220. {
  221. for (int j = 0; j < d; j++)
  222. {
  223. X[0, i, j] = 0;
  224. }
  225. }
  226. }
  227.  
  228. static void inicjalizacjaV(double[,] V, int d, int N, Random liczba)
  229. {
  230. for (int i = 0; i < N; i++)
  231. {
  232. for (int j = 0; j < d; j++)
  233. {
  234. double losowaPredkosc = liczba.NextDouble() * 1;
  235. V[i, j] = losowaPredkosc;
  236. }
  237. }
  238. }
  239.  
  240. static void wyzerujTabliceJednowym(double[] tablica, int N)
  241. {
  242. for (int i = 0; i < N; i++)
  243. {
  244. tablica[i] = 0;
  245. }
  246. }
  247.  
  248. static void liczenieWartosciFunkcji(double[] parametr, double[] fx, double[,,] X, int d, int i, int e)
  249. {
  250. for (int j = 0; j < d; j++)
  251. {
  252. fx[i] += parametr[j] * X[e, i, j];
  253. }
  254. }
  255.  
  256. static void aktualizacjaCzastki(double[,] V, double[,,] X, double[,] p, double[] g, double S, int i, int e, double fi1, double fi2, int d, Random liczba)
  257. {
  258. for (int j = 0; j < d; j++)
  259. {
  260. double U1 = liczba.NextDouble() * 1;
  261. U1 = U1 * fi1;
  262. double U2 = liczba.NextDouble() * 1;
  263. U2 = U2 * fi2;
  264. V[i, j] = V[i, j] + U1 * (p[i, j] - X[e, i, j]) + U2 * (g[j] - X[e, i, j]);
  265.  
  266. S = 1 / (1 + Math.Exp((-1) * V[i, j]));
  267. //Console.WriteLine("V = " + V[i, j]);
  268. //Console.WriteLine("S = " + S);
  269. //Console.WriteLine();
  270. double randomowaLiczba = liczba.NextDouble() * 1;
  271. if (randomowaLiczba <= S)
  272. {
  273. X[e + 1, i, j] = 1;
  274. }
  275. else
  276. X[e + 1, i, j] = 0;
  277.  
  278. S = 0;
  279. }
  280. //Console.WriteLine();
  281. }
  282.  
  283. static void wszystkieOpcje(double[] wartosc, double[] waga, double ograniczenie, int N, int d, Random liczba)
  284. {
  285. int d2 = Convert.ToInt32(Math.Pow(2, d));
  286. int [] wszystkieKombinacjeDec = new int[d2];
  287. string[] wszystkieKombinacjeBin = new string[d2];
  288. char[] pomocniczaChar = new char[d];
  289. int[,] wszystkieKombinacjeInt = new int[d2, d];
  290. double[] fx = new double[d2];
  291. double[] fwx = new double[d2];
  292. double maxWartosc = 0;
  293. int maxIndex = 0;
  294.  
  295. for (int i = 0; i < d2; i++)
  296. {
  297. wszystkieKombinacjeDec[i] = i;
  298. wszystkieKombinacjeBin[i] = Convert.ToString(wszystkieKombinacjeDec[i], 2);
  299. pomocniczaChar = wszystkieKombinacjeBin[i].ToCharArray();
  300.  
  301. if(pomocniczaChar.Length < d)
  302. {
  303. int roznica = d - pomocniczaChar.Length;
  304.  
  305. for(int k = 0; k < roznica; k++)
  306. {
  307. wszystkieKombinacjeInt[i, k] = 0;
  308. }
  309.  
  310. int pom = 0;
  311. for(int k = roznica; k < d; k++)
  312. {
  313. wszystkieKombinacjeInt[i, k] = pomocniczaChar[pom];
  314. pom++;
  315. }
  316. }
  317.  
  318. else
  319. {
  320. for (int j = 0; j < d; j++)
  321. {
  322. wszystkieKombinacjeInt[i, j] = pomocniczaChar[j];
  323. }
  324. }
  325. }
  326.  
  327. for (int i = 0; i < d2; i++)
  328. {
  329. for (int j = 0; j < d; j++)
  330. {
  331. if (wszystkieKombinacjeInt[i, j] == 49)
  332. {
  333. wszystkieKombinacjeInt[i, j] = 1;
  334. }
  335.  
  336. if (wszystkieKombinacjeInt[i, j] == 48)
  337. {
  338. wszystkieKombinacjeInt[i, j] = 0;
  339. }
  340. }
  341. }
  342.  
  343. for(int i = 0; i < d2; i++)
  344. {
  345. for (int j = 0; j < d; j++)
  346. {
  347. fx[i] += wartosc[j] * wszystkieKombinacjeInt[i, j];
  348. fwx[i] += waga[j] * wszystkieKombinacjeInt[i, j];
  349. }
  350.  
  351. if(fx[i] > maxWartosc && fwx[i] <= ograniczenie)
  352. {
  353. maxWartosc = fx[i];
  354. maxIndex = i;
  355. }
  356. }
  357.  
  358. for (int i = 0; i < d2; i++)
  359. {
  360. if(fwx[i] <= ograniczenie)
  361. {
  362. for (int j = 0; j < d; j++)
  363. {
  364. Console.Write(wszystkieKombinacjeInt[i, j] + " ");
  365. }
  366. Console.Write(" Wartosc = " + fx[i] + "; Waga = " + fwx[i] + "; ");
  367.  
  368. if (i == maxIndex)
  369. {
  370. Console.Write("<-- NAJLEPSZE ROZWIAZANIE");
  371. }
  372. Console.WriteLine();
  373. }
  374. }
  375. }
  376.  
  377. //Wypisywanie
  378.  
  379. static void wypiszWektoryDwu(double[,] wektor, int d, int N)
  380. {
  381. for (int i = 0; i < N; i++)
  382. {
  383. for (int j = 0; j < d; j++)
  384. {
  385. Console.Write(wektor[i, j] + " ");
  386. }
  387. Console.WriteLine();
  388. }
  389. Console.WriteLine();
  390. }
  391.  
  392. static void wypiszWektoryTrzy(double[,,] wektor, int d, int e, int N)
  393. {
  394. for (int i = 0; i < N; i++)
  395. {
  396. for (int j = 0; j < d; j++)
  397. {
  398. Console.Write(wektor[e, i, j] + " ");
  399. }
  400. Console.WriteLine();
  401. }
  402. Console.WriteLine();
  403. }
  404.  
  405. static void wypiszWartoscFunkcji(double[] fx, int N)
  406. {
  407. Console.WriteLine();
  408. for (int i = 0; i < N; i++)
  409. {
  410. Console.WriteLine(i + ". = " + fx[i]);
  411. }
  412. }
  413.  
  414. }
  415. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement