Advertisement
Guest User

Untitled

a guest
May 21st, 2018
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 65.55 KB | None | 0 0
  1. using OxyPlot;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Windows;
  8. using System.Windows.Controls;
  9. using System.Windows.Data;
  10. using System.Windows.Documents;
  11. using System.Windows.Input;
  12. using System.Windows.Media;
  13. using System.Windows.Media.Imaging;
  14. using System.Windows.Navigation;
  15. using System.Windows.Shapes;
  16.  
  17. namespace inzynierka_kowalczyk
  18. {
  19. /// <summary>
  20. /// Interaction logic for MainWindow.xaml
  21. /// </summary>
  22. ///
  23. public static class MyStaticValues
  24. {
  25. public static int liczbaInstancji { get; set; }
  26. }
  27.  
  28. public partial class MainWindow : Window
  29. {
  30.  
  31. static Random r = new Random();
  32. Random mutacjeRandom;
  33. Random krzyzowanieRandom;
  34. Random krzyzowka;
  35.  
  36. public static string krzyzowanie = "";
  37. public static string mutacje = "";
  38. public static string selekcje = "";
  39.  
  40. public static int liczbaOsobnikow = 0;
  41. public static int liczbaPrac = 0;
  42. public static int liczbaMaszyn = 0;
  43. public static int liczbaGeneracji = 0;
  44. public static float mutacjeProcent = 0;
  45. public static float krzyzowanieProcent = 0;
  46. public static int liczniktablicyMutacji = 0;
  47. public static int liczniktablicyKrzyzowania = 0;
  48. public static int sumaFunkcjiCeluMinimalizacja = 0;
  49.  
  50. public int[,] tablicaFunkcjiCelu;
  51.  
  52. Osobnik pierwszyOsobnik;
  53.  
  54. Chromosom[] osobnikGlowny = new Chromosom[liczbaOsobnikow];
  55. Chromosom[] mutacjePotomkowie;
  56. Chromosom[] krzyzowaniePotomkowie;
  57. Chromosom[] nowaGeneracjaBezFCelu;
  58.  
  59. Osobnik[] tabRodzicow;
  60. Osobnik[] nowaGeneracja;
  61. Osobnik[] tabPoSelekcji;
  62.  
  63. public MainWindow()
  64. {
  65. InitializeComponent();
  66. }
  67.  
  68. private void adjacentTwoJobExchange_Click(object sender, RoutedEventArgs e)
  69. {
  70. mutacje = "adjacentTwoJobExchange";
  71. wybranaMutacja.Text = "Adjacent Two-Job Exchange";
  72. }
  73.  
  74. public static Chromosom adjacentTwoJobExchangeMethod(Chromosom ck)
  75. {
  76. int index = r.Next(0, liczbaPrac);
  77. Chromosom kromosom = new Chromosom();
  78. kromosom.liczbaPrac = ck.liczbaPrac;
  79. kromosom.zadanie = ck.zadanie;
  80. for (int i = 0; i < liczbaPrac; i++)
  81. {
  82. if (i == index)
  83. {
  84. if (index == 0)
  85. {
  86. Praca temp = new Praca();
  87. temp.liczbaMaszyn = kromosom.zadanie[index].liczbaMaszyn;
  88. temp.rnd = kromosom.zadanie[index].rnd;
  89. temp.zadania = kromosom.zadanie[index].zadania;
  90.  
  91. kromosom.zadanie[index].liczbaMaszyn = kromosom.zadanie[index + 1].liczbaMaszyn;
  92. kromosom.zadanie[index].rnd = kromosom.zadanie[index + 1].rnd;
  93. kromosom.zadanie[index].zadania = kromosom.zadanie[index + 1].zadania;
  94.  
  95. kromosom.zadanie[index + 1].liczbaMaszyn = temp.liczbaMaszyn;
  96. kromosom.zadanie[index + 1].rnd = temp.rnd;
  97. kromosom.zadanie[index + 1].zadania = temp.zadania;
  98. }
  99. else
  100. {
  101. Praca temp = new Praca();
  102. temp.liczbaMaszyn = kromosom.zadanie[index].liczbaMaszyn;
  103. temp.rnd = kromosom.zadanie[index].rnd;
  104. temp.zadania = kromosom.zadanie[index].zadania;
  105.  
  106. kromosom.zadanie[index].liczbaMaszyn = kromosom.zadanie[index - 1].liczbaMaszyn;
  107. kromosom.zadanie[index].rnd = kromosom.zadanie[index - 1].rnd;
  108. kromosom.zadanie[index].zadania = kromosom.zadanie[index - 1].zadania;
  109.  
  110. kromosom.zadanie[index - 1].liczbaMaszyn = temp.liczbaMaszyn;
  111. kromosom.zadanie[index - 1].rnd = temp.rnd;
  112. kromosom.zadanie[index - 1].zadania = temp.zadania;
  113. }
  114. }
  115. }
  116. return kromosom;
  117. }
  118.  
  119. private void positionBasedMutation_Click(object sender, RoutedEventArgs e)
  120. {
  121. mutacje = "positionBasedMutation";
  122. wybranaMutacja.Text = "Position Based Mutation";
  123. }
  124.  
  125. public static Chromosom positionBasedMutationMethod(Chromosom ck)
  126. {
  127. int indexPierwszy;
  128. indexPierwszy = r.Next(0, liczbaPrac - 1);
  129. int indexDrugi;
  130. do
  131. {
  132. indexDrugi = r.Next(0, liczbaPrac);
  133. } while ((indexDrugi < indexPierwszy) || (indexDrugi == indexPierwszy));
  134.  
  135. Praca[] praca = new Praca[liczbaPrac];
  136. for (int i = 0; i < praca.Length; i++)
  137. {
  138. praca[i] = new Praca();
  139. praca[i].rnd = r;
  140. praca[i].liczbaMaszyn = liczbaMaszyn;
  141. praca[i].pracaTworzenie(0);
  142. }
  143. Chromosom kromosom = new Chromosom();
  144. kromosom.liczbaPrac = liczbaPrac;
  145. kromosom.zadanie = praca;
  146.  
  147. for (int i = 0; i < liczbaPrac; i++)
  148. {
  149. if (i == indexPierwszy)
  150. {
  151. kromosom.zadanie[i].liczbaMaszyn = ck.zadanie[indexDrugi].liczbaMaszyn;
  152. kromosom.zadanie[i].rnd = ck.zadanie[indexDrugi].rnd;
  153. kromosom.zadanie[i].zadania = ck.zadanie[indexDrugi].zadania;
  154. }
  155. else if (i > indexPierwszy && i > indexDrugi)
  156. {
  157. kromosom.zadanie[i].liczbaMaszyn = ck.zadanie[i].liczbaMaszyn;
  158. kromosom.zadanie[i].rnd = ck.zadanie[i].rnd;
  159. kromosom.zadanie[i].zadania = ck.zadanie[i].zadania;
  160. }
  161. else if (i > indexPierwszy)
  162. {
  163. kromosom.zadanie[i].liczbaMaszyn = ck.zadanie[i - 1].liczbaMaszyn;
  164. kromosom.zadanie[i].rnd = ck.zadanie[i - 1].rnd;
  165. kromosom.zadanie[i].zadania = ck.zadanie[i - 1].zadania;
  166. }
  167. else
  168. {
  169. kromosom.zadanie[i].liczbaMaszyn = ck.zadanie[i].liczbaMaszyn;
  170. kromosom.zadanie[i].rnd = ck.zadanie[i].rnd;
  171. kromosom.zadanie[i].zadania = ck.zadanie[i].zadania;
  172. }
  173. }
  174. return kromosom;
  175. }
  176.  
  177. private void orderBasedMutation_Click(object sender, RoutedEventArgs e)
  178. {
  179. mutacje = "orderBasedMutation";
  180. wybranaMutacja.Text = "Order Based Mutation";
  181. }
  182.  
  183. public static Chromosom orderBasedMutationMethod(Chromosom ck)
  184. {
  185. int indexPierwszy = r.Next(0, liczbaPrac);
  186. int indexDrugi;
  187. do
  188. {
  189. indexDrugi = r.Next(0, liczbaPrac);
  190. } while (indexDrugi == indexPierwszy);
  191.  
  192. Chromosom kromosom = new Chromosom();
  193. kromosom.liczbaPrac = ck.liczbaPrac;
  194. kromosom.zadanie = ck.zadanie;
  195.  
  196. Praca temp = new Praca();
  197. temp.liczbaMaszyn = kromosom.zadanie[indexPierwszy].liczbaMaszyn;
  198. temp.rnd = kromosom.zadanie[indexPierwszy].rnd;
  199. temp.zadania = kromosom.zadanie[indexPierwszy].zadania;
  200.  
  201. kromosom.zadanie[indexPierwszy].liczbaMaszyn = kromosom.zadanie[indexDrugi].liczbaMaszyn;
  202. kromosom.zadanie[indexPierwszy].rnd = kromosom.zadanie[indexDrugi].rnd;
  203. kromosom.zadanie[indexPierwszy].zadania = kromosom.zadanie[indexDrugi].zadania;
  204.  
  205. kromosom.zadanie[indexDrugi].liczbaMaszyn = temp.liczbaMaszyn;
  206. kromosom.zadanie[indexDrugi].rnd = temp.rnd;
  207. kromosom.zadanie[indexDrugi].zadania = temp.zadania;
  208.  
  209. return kromosom;
  210. }
  211.  
  212. private void onePointCrossover_Click(object sender, RoutedEventArgs e)
  213. {
  214. krzyzowanie = "onePointCrossover";
  215. wybraneKrzyzowanie.Text = "One Point Crossover";
  216. }
  217.  
  218. public static Chromosom onePointCrossoverMethod(Chromosom osobnik1, Chromosom osobnik2)
  219. {
  220. int gdzieKrzyzowanie = r.Next(1, liczbaPrac);
  221.  
  222. Praca[] praca = new Praca[liczbaPrac];
  223. for (int i = 0; i < praca.Length; i++)
  224. {
  225. praca[i] = new Praca();
  226. praca[i].rnd = osobnik1.zadanie[i].rnd;
  227. praca[i].liczbaMaszyn = osobnik1.zadanie[i].liczbaMaszyn;
  228. Zadanie[] zad = new Zadanie[liczbaMaszyn];
  229. for (int j = 0; j < zad.Length; j++)
  230. {
  231. Zadanie temp = new Zadanie();
  232. temp.nr_maszyny = osobnik1.zadanie[i].zadania[j].nr_maszyny;
  233. temp.czas = osobnik1.zadanie[i].zadania[j].czas;
  234. zad[j] = temp;
  235. }
  236. praca[i].zadania = zad;
  237. }
  238. Chromosom potomek = new Chromosom();
  239. potomek.liczbaPrac = liczbaPrac;
  240. potomek.zadanie = praca;
  241.  
  242. for (int i = 0; i < liczbaPrac; i++)
  243. {
  244. if (i < gdzieKrzyzowanie)
  245. {
  246. for (int z = 0; z < liczbaPrac; z++)
  247. {
  248. if (czyTaSamaPraca(potomek.zadanie[z], osobnik2.zadanie[i]))
  249. {
  250. Praca temp = new Praca();
  251. temp.liczbaMaszyn = potomek.zadanie[z].liczbaMaszyn;
  252. temp.rnd = potomek.zadanie[z].rnd;
  253. temp.zadania = potomek.zadanie[z].zadania;
  254.  
  255. potomek.zadanie[z].liczbaMaszyn = potomek.zadanie[i].liczbaMaszyn;
  256. potomek.zadanie[z].rnd = potomek.zadanie[i].rnd;
  257. potomek.zadanie[z].zadania = potomek.zadanie[i].zadania;
  258.  
  259. potomek.zadanie[i].liczbaMaszyn = temp.liczbaMaszyn;
  260. potomek.zadanie[i].rnd = temp.rnd;
  261. potomek.zadanie[i].zadania = temp.zadania;
  262. }
  263. }
  264. }
  265. }
  266.  
  267. return potomek;
  268. }
  269.  
  270. private void twoPointCrossover_Click(object sender, RoutedEventArgs e)
  271. {
  272. krzyzowanie = "twoPointCrossover";
  273. wybraneKrzyzowanie.Text = "Two Point Crossover";
  274. }
  275.  
  276. public static Chromosom twoPointCrossoverMethod(Chromosom osobnik1, Chromosom osobnik2)
  277. {
  278. Random random = new Random();
  279. int gdzieKrzyzowanieDol = 1/*random.Next(1, liczbaPrac-1)*/;
  280. int gdzieKrzyzowanieGora;
  281. do
  282. {
  283. gdzieKrzyzowanieGora = 4/*random.Next(1, liczbaPrac)*/;
  284. } while (gdzieKrzyzowanieGora < gdzieKrzyzowanieDol);
  285.  
  286.  
  287. Praca[] praca = new Praca[liczbaPrac];
  288. for (int i = 0; i < praca.Length; i++)
  289. {
  290. praca[i] = new Praca();
  291. praca[i].rnd = osobnik1.zadanie[i].rnd;
  292. praca[i].liczbaMaszyn = osobnik1.zadanie[i].liczbaMaszyn;
  293. Zadanie[] zad = new Zadanie[liczbaMaszyn];
  294. for (int j = 0; j < zad.Length; j++)
  295. {
  296. Zadanie temp = new Zadanie();
  297. temp.nr_maszyny = osobnik1.zadanie[i].zadania[j].nr_maszyny;
  298. temp.czas = osobnik1.zadanie[i].zadania[j].czas;
  299. zad[j] = temp;
  300. }
  301. praca[i].zadania = zad;
  302. }
  303. Chromosom potomek = new Chromosom();
  304. potomek.liczbaPrac = liczbaPrac;
  305. potomek.zadanie = praca;
  306.  
  307. for (int i = 0; i < liczbaPrac; i++)
  308. {
  309. if (i < gdzieKrzyzowanieDol || i >= gdzieKrzyzowanieGora)
  310. {
  311. for (int z = 0; z < liczbaPrac; z++)
  312. {
  313. if (czyTaSamaPraca(potomek.zadanie[z], osobnik2.zadanie[i]))
  314. {
  315. Praca temp = new Praca();
  316. temp.liczbaMaszyn = potomek.zadanie[z].liczbaMaszyn;
  317. temp.rnd = potomek.zadanie[z].rnd;
  318. temp.zadania = potomek.zadanie[z].zadania;
  319.  
  320. potomek.zadanie[z].liczbaMaszyn = potomek.zadanie[i].liczbaMaszyn;
  321. potomek.zadanie[z].rnd = potomek.zadanie[i].rnd;
  322. potomek.zadanie[z].zadania = potomek.zadanie[i].zadania;
  323.  
  324. potomek.zadanie[i].liczbaMaszyn = temp.liczbaMaszyn;
  325. potomek.zadanie[i].rnd = temp.rnd;
  326. potomek.zadanie[i].zadania = temp.zadania;
  327. }
  328. }
  329. }
  330. }
  331.  
  332. return potomek;
  333. }
  334.  
  335. private void selekcjaTurniejowa_Click(object sender, RoutedEventArgs e)
  336. {
  337. selekcje = "selekcjaTurniejowa";
  338. wybraneSelekcja.Text = "Selekcja turniejowa";
  339. }
  340.  
  341. private void selekcjaRankingowa_Click(object sender, RoutedEventArgs e)
  342. {
  343. selekcje = "selekcjaRankingowa";
  344. wybraneSelekcja.Text = "Selekcja rankingowa";
  345. }
  346.  
  347. private void selekcjaElitarna_Click(object sender, RoutedEventArgs e)
  348. {
  349. selekcje = "selekcjaElitarna";
  350. wybraneSelekcja.Text = "Selekcja elitarna";
  351. }
  352.  
  353. private void quit_Click(object sender, RoutedEventArgs e)
  354. {
  355. this.Close();
  356. }
  357.  
  358. private void buttonWczytajDane_Click(object sender, RoutedEventArgs e)
  359. {
  360. liczbaOsobnikow = Int32.Parse(liczbaOsobnikowWczytaj.Text);
  361. liczbaPrac = Int32.Parse(liczbaPracWczytaj.Text);
  362. liczbaMaszyn = Int32.Parse(liczbaMaszynWczytaj.Text);
  363. liczbaGeneracji = Int32.Parse(liczbaGeneracjiWczytaj.Text);
  364. parametryWypisz.Text = "Liczba Osobnikow = " + liczbaOsobnikow + "\n" + "Liczba Prac = " + liczbaPrac + "\n" + "Liczba Maszyn = " + liczbaMaszyn + "\n" + "Liczba Generacji = " + liczbaGeneracji + "\n";
  365. }
  366.  
  367. private void generujPopulacje_Click(object sender, RoutedEventArgs e)
  368. {
  369. Random random = new Random();
  370. Chromosom[] osobnik = new Chromosom[liczbaOsobnikow];
  371.  
  372. for (int a = 0; a < liczbaOsobnikow; a++)
  373. {
  374. if (a == 0)
  375. {
  376. Praca[] praca = new Praca[liczbaPrac];
  377. for (int i = 0; i < praca.Length; i++)
  378. {
  379. praca[i] = new Praca();
  380. praca[i].rnd = random;
  381. praca[i].liczbaMaszyn = liczbaMaszyn;
  382. praca[i].pracaTworzenie();
  383. }
  384. Chromosom chromek = new Chromosom();
  385. chromek.liczbaPrac = liczbaPrac;
  386. chromek.zadanie = praca;
  387. osobnik[a] = chromek;
  388. for (int i = 0; i < praca.Length; i++)
  389. {
  390. for (int b = 0; b < 2000; b++)
  391. {
  392. int rA, rB;
  393. rA = random.Next(0, liczbaMaszyn);
  394. rB = random.Next(0, liczbaMaszyn);
  395. zamiana(ref osobnik[a].zadanie[i].zadania[rA], ref osobnik[a].zadanie[i].zadania[rB]);
  396. }
  397. osobnik[a].zadanie[i] = naprawa(osobnik[0].zadanie[i]);
  398. }
  399. }
  400. else
  401. {
  402. Praca[] praca = new Praca[liczbaPrac];
  403. for (int i = 0; i < praca.Length; i++)
  404. {
  405. praca[i] = new Praca();
  406. praca[i].rnd = osobnik[0].zadanie[i].rnd;
  407. praca[i].liczbaMaszyn = osobnik[0].zadanie[i].liczbaMaszyn;
  408. Zadanie[] zad = new Zadanie[liczbaMaszyn];
  409. for (int j = 0; j < zad.Length; j++)
  410. {
  411. Zadanie temp = new Zadanie();
  412. temp.nr_maszyny = osobnik[0].zadanie[i].zadania[j].nr_maszyny;
  413. temp.czas = osobnik[0].zadanie[i].zadania[j].czas;
  414. zad[j] = temp;
  415. }
  416. praca[i].zadania = zad;
  417. }
  418. Chromosom chromek = new Chromosom();
  419. chromek.liczbaPrac = liczbaPrac;
  420. chromek.zadanie = praca;
  421. osobnik[a] = chromek;
  422. }
  423. }
  424.  
  425. //Mieszanie prac kazdego chromosomu do stworzenie populacji
  426. for (int r = 1; r < liczbaOsobnikow; r++)
  427. {
  428. for (int a = 0; a < 200; a++)
  429. {
  430. int rA, rB;
  431. rA = random.Next(0, liczbaPrac);
  432. rB = random.Next(0, liczbaPrac);
  433. tasowanie(ref osobnik[r].zadanie[rA], ref osobnik[r].zadanie[rB]);
  434. }
  435. }
  436.  
  437. osobnikGlowny = osobnik;
  438. generacja.Text = "";
  439. }
  440.  
  441. private void wczytajPopulacje_Click(object sender, RoutedEventArgs e)
  442. {
  443. System.IO.StreamReader file = new System.IO.StreamReader(@"C:\Users\kowal\Desktop\generacjaStartowa.txt");
  444.  
  445. liczbaOsobnikow = Int32.Parse(file.ReadLine());
  446. liczbaPrac = Int32.Parse(file.ReadLine());
  447. liczbaMaszyn = Int32.Parse(file.ReadLine());
  448. liczbaGeneracji = Int32.Parse(file.ReadLine());
  449. MyStaticValues.liczbaInstancji = liczbaGeneracji;
  450.  
  451. Random random = new Random();
  452. Chromosom[] osobnik = new Chromosom[liczbaOsobnikow];
  453. for (int r = 0; r < liczbaOsobnikow; r++)
  454. {
  455. Praca[] praca = new Praca[liczbaPrac];
  456. for (int i = 0; i < praca.Length; i++)
  457. {
  458. praca[i] = new Praca();
  459. praca[i].rnd = random;
  460. praca[i].liczbaMaszyn = liczbaMaszyn;
  461. praca[i].pracaTworzenie();
  462. }
  463. Chromosom chromek = new Chromosom();
  464. chromek.liczbaPrac = liczbaPrac;
  465. chromek.zadanie = praca;
  466. osobnik[r] = chromek;
  467. }
  468.  
  469.  
  470. for (int a = 0; a < liczbaOsobnikow; a++)
  471. {
  472. for (int i = 0; i < liczbaPrac; i++)
  473. {
  474. for (int s = 0; s < liczbaMaszyn; s++)
  475. {
  476. Chromosom chr = new Chromosom();
  477. osobnik[a].zadanie[i].zadania[s].nr_maszyny = Int32.Parse(file.ReadLine());
  478. osobnik[a].zadanie[i].zadania[s].czas = Int32.Parse(file.ReadLine());
  479. }
  480. }
  481. }
  482. osobnikGlowny = osobnik;
  483. file.Close();
  484. }
  485.  
  486. public void wczytajPopulacjeRodzicow(string co)
  487. {
  488. string plik = "";
  489. plik = co;
  490. System.IO.StreamReader file = new System.IO.StreamReader(@"C:\Users\kowal\Desktop\" + plik);
  491. //generacjaPoGeneracji.txt
  492. liczbaOsobnikow = Int32.Parse(file.ReadLine());
  493. liczbaPrac = Int32.Parse(file.ReadLine());
  494. liczbaMaszyn = Int32.Parse(file.ReadLine());
  495. liczbaGeneracji = Int32.Parse(file.ReadLine());
  496. MyStaticValues.liczbaInstancji = liczbaGeneracji;
  497.  
  498. Random random = new Random();
  499. Chromosom[] osobnik = new Chromosom[liczbaOsobnikow];
  500. for (int r = 0; r < liczbaOsobnikow; r++)
  501. {
  502. Praca[] praca = new Praca[liczbaPrac];
  503. for (int i = 0; i < praca.Length; i++)
  504. {
  505. praca[i] = new Praca();
  506. praca[i].rnd = random;
  507. praca[i].liczbaMaszyn = liczbaMaszyn;
  508. praca[i].pracaTworzenie();
  509. }
  510. Chromosom chromek = new Chromosom();
  511. chromek.liczbaPrac = liczbaPrac;
  512. chromek.zadanie = praca;
  513. osobnik[r] = chromek;
  514. }
  515.  
  516.  
  517. for (int a = 0; a < liczbaOsobnikow; a++)
  518. {
  519. for (int i = 0; i < liczbaPrac; i++)
  520. {
  521. for (int s = 0; s < liczbaMaszyn; s++)
  522. {
  523. Chromosom chr = new Chromosom();
  524. osobnik[a].zadanie[i].zadania[s].nr_maszyny = Int32.Parse(file.ReadLine());
  525. osobnik[a].zadanie[i].zadania[s].czas = Int32.Parse(file.ReadLine());
  526. }
  527. }
  528. }
  529. osobnikGlowny = osobnik;
  530. file.Close();
  531. }
  532.  
  533. public void zapiszPopulacjeRodzicow()
  534. {
  535. System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Users\kowal\Desktop\generacjapogeneracji.txt");
  536. file.WriteLine(liczbaOsobnikow);
  537. file.WriteLine(liczbaPrac);
  538. file.WriteLine(liczbaMaszyn);
  539. file.WriteLine(liczbaGeneracji);
  540.  
  541. for (int a = 0; a < liczbaOsobnikow; a++)
  542. {
  543. for (int i = 0; i < liczbaPrac; i++)
  544. {
  545. for (int s = 0; s < liczbaMaszyn; s++)
  546. {
  547. file.WriteLine(tabPoSelekcji[a].chr.zadanie[i].zadania[s].nr_maszyny);
  548. file.WriteLine(tabPoSelekcji[a].chr.zadanie[i].zadania[s].czas);
  549. }
  550. }
  551. }
  552. file.Close();
  553. }
  554.  
  555. public void wyczyscZapiszPopulacjeRodzicow()
  556. {
  557. System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Users\kowal\Desktop\generacjapogeneracji.txt");
  558. file.WriteLine();
  559. file.Close();
  560. }
  561.  
  562. private void wyczyscTekst_Click(object sender, RoutedEventArgs e)
  563. {
  564. generacja.Text = "";
  565. generacjaMutacji.Text = "";
  566. }
  567.  
  568. private void zapiszPopulacje_Click(object sender, RoutedEventArgs e)
  569. {
  570. System.IO.StreamWriter f = new System.IO.StreamWriter(@"C:\Users\kowal\Desktop\generacjaStartowa.txt");
  571. f.WriteLine(liczbaOsobnikow);
  572. f.WriteLine(liczbaPrac);
  573. f.WriteLine(liczbaMaszyn);
  574. f.WriteLine(liczbaGeneracji);
  575.  
  576. for (int a = 0; a < liczbaOsobnikow; a++)
  577. {
  578. for (int i = 0; i < liczbaPrac; i++)
  579. {
  580. for (int s = 0; s < liczbaMaszyn; s++)
  581. {
  582. f.WriteLine(osobnikGlowny[a].zadanie[i].zadania[s].nr_maszyny);
  583. f.WriteLine(osobnikGlowny[a].zadanie[i].zadania[s].czas);
  584. }
  585. }
  586. }
  587. f.Close();
  588. }
  589.  
  590. private void wyswietlPopulacje_Click(object sender, RoutedEventArgs e)
  591. {
  592. for (int a = 0; a < liczbaOsobnikow; a++)
  593. {
  594. parametryWypisz.Text = "Liczba Osobnikow = " + liczbaOsobnikow + "\n" + "Liczba Prac = " + liczbaPrac + "\n" + "Liczba Maszyn = " + liczbaMaszyn + "\n" + "Liczba Generacji = " + liczbaGeneracji + "\n";
  595. generacja.Text += "Chromosom nr" + (a + 1);
  596. generacja.Text += "\n";
  597. generacja.Text += "\t";
  598. for (int i = 0; i < liczbaMaszyn; i++)
  599. {
  600. generacja.Text += "S" + (i + 1) + "\t";
  601.  
  602. }
  603. generacja.Text += "\n";
  604. for (int i = 0; i < liczbaPrac; i++)
  605. {
  606. generacja.Text += "J" + (i + 1) + "\t";
  607. for (int s = 0; s < liczbaMaszyn; s++)
  608. {
  609. if (osobnikGlowny[a].zadanie[i].zadania[s].czas == 0)
  610. {
  611. generacja.Text += "- \t";
  612. }
  613. else
  614. {
  615. generacja.Text += osobnikGlowny[a].zadanie[i].zadania[s].ToString() + "\t";
  616. }
  617.  
  618. }
  619. generacja.Text += "\n";
  620.  
  621. }
  622. generacja.Text += "\n";
  623. generacja.Text += "\n";
  624. }
  625. }
  626.  
  627. public static void zamiana(ref Zadanie a, ref Zadanie b)
  628. {
  629. Zadanie temp = new Zadanie();
  630. temp.nr_maszyny = a.nr_maszyny;
  631. temp.czas = a.czas;
  632. a.nr_maszyny = b.nr_maszyny;
  633. a.czas = b.czas;
  634. b.nr_maszyny = temp.nr_maszyny;
  635. b.czas = temp.czas;
  636. }
  637.  
  638. public void tasowanie(ref Praca praca1, ref Praca praca2)
  639. {
  640.  
  641. Praca temp = new Praca();
  642. temp.liczbaMaszyn = praca1.liczbaMaszyn;
  643. temp.rnd = praca1.rnd;
  644. temp.zadania = praca1.zadania;
  645.  
  646. praca1.liczbaMaszyn = praca2.liczbaMaszyn;
  647. praca1.rnd = praca2.rnd;
  648. praca1.zadania = praca2.zadania;
  649.  
  650. praca2.liczbaMaszyn = temp.liczbaMaszyn;
  651. praca2.rnd = temp.rnd;
  652. praca2.zadania = temp.zadania;
  653.  
  654. }
  655.  
  656. public static bool czyTaSamaPraca(Praca pr1, Praca pr2)
  657. {
  658. bool wynik = false;
  659. for (int i = 0; i < liczbaMaszyn; i++)
  660. {
  661. if ((pr1.zadania[i].nr_maszyny == pr2.zadania[i].nr_maszyny) && (pr1.zadania[i].czas == pr2.zadania[i].czas))
  662. {
  663. wynik = true;
  664. }
  665. else
  666. {
  667. wynik = false;
  668. break;
  669. }
  670. }
  671. return wynik;
  672.  
  673.  
  674. }
  675.  
  676. public static Praca naprawa(Praca praca)
  677. {
  678. int count = 0;
  679. Praca p = new Praca();
  680. p.rnd = praca.rnd;
  681. p.liczbaMaszyn = praca.liczbaMaszyn;
  682. p.zadania = praca.zadania;
  683. for (int i = 0; i < p.zadania.Length; i++)
  684. {
  685. if (p.zadania[i].czas != 0)
  686. {
  687. p.zadania[count].nr_maszyny = p.zadania[i].nr_maszyny;
  688. p.zadania[count].czas = p.zadania[i].czas;
  689. count++;
  690. }
  691. }
  692.  
  693. while (count < p.zadania.Length)
  694. {
  695. p.zadania[count].nr_maszyny = 0;
  696. p.zadania[count].czas = 0;
  697. count++;
  698. }
  699.  
  700. return p;
  701.  
  702. }
  703.  
  704. public int fCelu(int nr_osobnika, Chromosom[] ch)
  705. {
  706. generacja.Text = "";
  707. int fCelu = 0;
  708. int o = nr_osobnika;
  709. Maszyna[] maszyny = new Maszyna[liczbaMaszyn];
  710. for (int q = 0; q < liczbaMaszyn; q++)
  711. {
  712. maszyny[q] = new Maszyna();
  713. maszyny[q].czas = 0;
  714. }
  715.  
  716. for (int j = 0; j < liczbaPrac; j++)
  717. {
  718. for (int z = 0; z < liczbaMaszyn; z++)
  719. {
  720. if (ch[o].zadanie[j].zadania[z].czas == 0)
  721. {
  722. }
  723. else if (j == 0)
  724. {
  725. if (z == 0)
  726. {
  727. maszyny[ch[o].zadanie[j].zadania[z].nr_maszyny - 1].czas += ch[o].zadanie[j].zadania[z].czas;
  728. }
  729. else
  730. {
  731. maszyny[ch[o].zadanie[j].zadania[z].nr_maszyny - 1].czas += ch[o].zadanie[j].zadania[z].czas + maszyny[ch[o].zadanie[j].zadania[z - 1].nr_maszyny - 1].czas;
  732. }
  733.  
  734. }
  735. else
  736. {
  737. if (z == 0)
  738. {
  739. maszyny[ch[o].zadanie[j].zadania[z].nr_maszyny - 1].czas += ch[o].zadanie[j].zadania[z].czas;
  740. }
  741. else if (maszyny[ch[o].zadanie[j].zadania[z].nr_maszyny - 1].czas < maszyny[ch[o].zadanie[j].zadania[z - 1].nr_maszyny - 1].czas)
  742. {
  743. maszyny[ch[o].zadanie[j].zadania[z].nr_maszyny - 1].czas = maszyny[ch[o].zadanie[j].zadania[z - 1].nr_maszyny - 1].czas + ch[o].zadanie[j].zadania[z].czas;
  744. }
  745. else
  746. {
  747. maszyny[ch[o].zadanie[j].zadania[z].nr_maszyny - 1].czas += ch[o].zadanie[j].zadania[z].czas;
  748. }
  749. }
  750. }
  751. }
  752.  
  753.  
  754.  
  755.  
  756. for (int i = 0; i < liczbaMaszyn; i++)
  757. {
  758. if (i == 0)
  759. {
  760. fCelu = maszyny[i].czas;
  761. }
  762. else if (maszyny[i].czas > fCelu)
  763. {
  764. fCelu = maszyny[i].czas;
  765. }
  766. else
  767. {
  768. continue;
  769. }
  770.  
  771. }
  772. return fCelu;
  773. }
  774.  
  775. public class Maszyna
  776. {
  777. public int czas { get; set; }
  778. }
  779.  
  780. public class Zadanie
  781. {
  782. public int nr_maszyny { get; set; }
  783. public int czas { get; set; }
  784.  
  785. public override string ToString()
  786. {
  787. return this.nr_maszyny + "(" + czas + ") ";
  788. }
  789. }
  790.  
  791. public class Praca
  792. {
  793. public Random rnd { get; set; }
  794. public int liczbaMaszyn { get; set; }
  795. public Zadanie[] zadania { get; set; }
  796. public void pracaTworzenie()
  797. {
  798. this.zadania = new Zadanie[this.liczbaMaszyn];
  799. for (int i = 0; i < zadania.Length; i++)
  800. {
  801. this.zadania[i] = new Zadanie();
  802. this.zadania[i].nr_maszyny = i + 1;
  803. this.zadania[i].czas = rnd.Next(0, 11);
  804. }
  805. }
  806. public void pracaTworzenie(int a)
  807. {
  808. this.zadania = new Zadanie[this.liczbaMaszyn];
  809. for (int i = 0; i < zadania.Length; i++)
  810. {
  811. this.zadania[i] = new Zadanie();
  812. this.zadania[i].nr_maszyny = a;
  813. this.zadania[i].czas = a;
  814. }
  815. }
  816. }
  817.  
  818. public class Chromosom
  819. {
  820. public int liczbaPrac { get; set; }
  821. public Praca[] zadanie { get; set; }
  822. }
  823.  
  824. public class Osobnik
  825. {
  826. public Chromosom chr { get; set; }
  827. public int funkcjaCelu { get; set; }
  828.  
  829. public override string ToString()
  830. {
  831. return this.funkcjaCelu + " ";
  832. }
  833. }
  834.  
  835. public class Ranking : Osobnik
  836. {
  837. public float ranga { get; set; }
  838. public float prawdopodobienstwo { get; set; }
  839. public float poczatekPrzedzialu { get; set; }
  840. public float koniecPrzedzialu { get; set; }
  841. }
  842.  
  843. private void startAlgorytmu_Click(object sender, RoutedEventArgs e)
  844. {
  845. generacja.Text = "";
  846. generacjaMutacji.Text = "";
  847. pierwszyOsobnik = new Osobnik();
  848. mutacjeRandom = new Random();
  849. krzyzowanieRandom = new Random();
  850. krzyzowka = new Random();
  851. tablicaFunkcjiCelu = new int[liczbaGeneracji, 2];
  852. wyczyscZapiszFCelu();
  853. pierwszyNajlepszyDoPlikuCzystka();
  854. zapisywanieDanychDoOpisuCzystka();
  855.  
  856. for (int generacjaInt = 1; generacjaInt < liczbaGeneracji + 1; generacjaInt++)
  857. {
  858. generacjaMutacji.Text = "";
  859.  
  860. if (generacjaInt == 1)
  861. {
  862. wczytajPopulacjeRodzicow("generacjaStartowa.txt");
  863. }
  864. else
  865. {
  866. wczytajPopulacjeRodzicow("generacjaPoGeneracji.txt");
  867. }
  868.  
  869. //..........................Tworzenie tablicy potomkow z mutacji bez fcelu..........................
  870. mutacjePotomkowie = new Chromosom[liczbaOsobnikow];
  871. for (int r = 0; r < liczbaOsobnikow; r++)
  872. {
  873. Praca[] praca = new Praca[liczbaPrac];
  874. for (int i = 0; i < praca.Length; i++)
  875. {
  876. praca[i] = new Praca();
  877. praca[i].rnd = krzyzowka;
  878. praca[i].liczbaMaszyn = liczbaMaszyn;
  879. praca[i].pracaTworzenie(0);
  880. }
  881. Chromosom chromek = new Chromosom();
  882. chromek.liczbaPrac = liczbaPrac;
  883. chromek.zadanie = praca;
  884.  
  885. mutacjePotomkowie[r] = chromek;
  886. }
  887.  
  888. //..........................Tworzenie tablicy potomkow z krzyzowania bez fcelu..........................
  889. krzyzowaniePotomkowie = new Chromosom[liczbaOsobnikow];
  890. for (int r = 0; r < liczbaOsobnikow; r++)
  891. {
  892. Praca[] praca = new Praca[liczbaPrac];
  893. for (int i = 0; i < praca.Length; i++)
  894. {
  895. praca[i] = new Praca();
  896. praca[i].rnd = krzyzowka;
  897. praca[i].liczbaMaszyn = liczbaMaszyn;
  898. praca[i].pracaTworzenie(0);
  899. }
  900. Chromosom chromek = new Chromosom();
  901. chromek.liczbaPrac = liczbaPrac;
  902. chromek.zadanie = praca;
  903.  
  904. krzyzowaniePotomkowie[r] = chromek;
  905. }
  906.  
  907. //..........................Tworzenie tablicy rodzicow z fcelu..........................
  908. tabRodzicow = new Osobnik[liczbaOsobnikow];
  909. for (int b = 0; b < liczbaOsobnikow; b++)
  910. {
  911. Osobnik os = new Osobnik();
  912. os.chr = osobnikGlowny[b];
  913. os.funkcjaCelu = fCelu(b, osobnikGlowny);
  914. tabRodzicow[b] = os;
  915. }
  916. if (generacjaInt == 1)
  917. {
  918. tabRodzicow = tabRodzicow.OrderBy(si => si.funkcjaCelu).ToArray();
  919. pierwszyOsobnik.chr = tabRodzicow[0].chr;
  920. pierwszyOsobnik.funkcjaCelu = tabRodzicow[0].funkcjaCelu;
  921. }
  922.  
  923.  
  924. //..........................Krzyzowanie..........................
  925. for (int g = 0; g < liczbaOsobnikow; g++)
  926. {
  927. if (krzyzowanieRandom.Next(0, 1001) < (int)(krzyzowanieProcent * 10))
  928. {
  929. int partnerKrzyzowania;
  930. do
  931. {
  932. partnerKrzyzowania = krzyzowka.Next(0, liczbaOsobnikow);
  933. } while (partnerKrzyzowania == g);
  934. krzyzowania(osobnikGlowny[g], osobnikGlowny[partnerKrzyzowania]);
  935. }
  936. }
  937.  
  938. //..........................Naprawa krzyzowania..........................
  939. for (int t = 0; t < krzyzowaniePotomkowie.Length; t++)
  940. {
  941. for (int y = 0; y < liczbaPrac; y++)
  942. {
  943. if (krzyzowaniePotomkowie[t].zadanie[y] != null)
  944. {
  945. krzyzowaniePotomkowie[t].zadanie[y] = naprawa(krzyzowaniePotomkowie[t].zadanie[y]);
  946. }
  947. }
  948.  
  949. }
  950.  
  951. //..........................Wczytywanie wczesniejszej tablicy z rodzicami..........................
  952. if (generacjaInt == 1)
  953. {
  954. wczytajPopulacjeRodzicow("generacjaStartowa.txt");
  955. }
  956. else
  957. {
  958. wczytajPopulacjeRodzicow("generacjaPoGeneracji.txt");
  959. }
  960.  
  961. //..........................Mutacje..........................
  962. for (int f = 0; f < liczbaOsobnikow; f++)
  963. {
  964. if (mutacjeRandom.Next(0, 1001) < (int)(mutacjeProcent * 10))
  965. {
  966. mutacja(osobnikGlowny[f]);
  967. }
  968. }
  969.  
  970. //..........................Naprawa mutacji..........................
  971. for (int j = 0; j < mutacjePotomkowie.Length; j++)
  972. {
  973. for (int k = 0; k < liczbaPrac; k++)
  974. {
  975. mutacjePotomkowie[j].zadanie[k] = naprawa(mutacjePotomkowie[j].zadanie[k]);
  976. }
  977.  
  978. }
  979.  
  980. //..........................Wczytywanie wczesniejszej tablicy z rodzicami..........................
  981. if (generacjaInt == 1)
  982. {
  983. wczytajPopulacjeRodzicow("generacjaStartowa.txt");
  984. }
  985. else
  986. {
  987. wczytajPopulacjeRodzicow("generacjaPoGeneracji.txt");
  988. }
  989.  
  990. //..........................Tworzenie tablicy Mutacja + Krzyzowanie + Rodzice bez fcelu..........................
  991. nowaGeneracjaBezFCelu = new Chromosom[liczniktablicyMutacji + liczbaOsobnikow + liczniktablicyKrzyzowania];
  992. for (int l = 0; l < (liczniktablicyMutacji + liczbaOsobnikow + liczniktablicyKrzyzowania); l++)
  993. {
  994. if (l < liczbaOsobnikow)
  995. {
  996. Chromosom os = new Chromosom();
  997. os.liczbaPrac = osobnikGlowny[l].liczbaPrac;
  998. os.zadanie = osobnikGlowny[l].zadanie;
  999. nowaGeneracjaBezFCelu[l] = os;
  1000.  
  1001. }
  1002.  
  1003. else if (l < (liczbaOsobnikow + liczniktablicyKrzyzowania))
  1004. {
  1005. Chromosom os = new Chromosom();
  1006. os.liczbaPrac = krzyzowaniePotomkowie[l - liczbaOsobnikow].liczbaPrac;
  1007. os.zadanie = krzyzowaniePotomkowie[l - liczbaOsobnikow].zadanie;
  1008. nowaGeneracjaBezFCelu[l] = os;
  1009. }
  1010.  
  1011. else
  1012. {
  1013. Chromosom os = new Chromosom();
  1014. os.liczbaPrac = mutacjePotomkowie[l - liczbaOsobnikow - liczniktablicyKrzyzowania].liczbaPrac;
  1015. os.zadanie = mutacjePotomkowie[l - liczbaOsobnikow - liczniktablicyKrzyzowania].zadanie;
  1016. nowaGeneracjaBezFCelu[l] = os;
  1017. }
  1018. }
  1019.  
  1020. //..........................Tworzenie tablicy Mutacja + Krzyzowanie + Rodzice z fcelu..........................
  1021. nowaGeneracja = new Osobnik[liczniktablicyMutacji + liczbaOsobnikow + liczniktablicyKrzyzowania];
  1022. for (int m = 0; m < (liczniktablicyMutacji + liczbaOsobnikow + liczniktablicyKrzyzowania); m++)
  1023. {
  1024. Osobnik o = new Osobnik();
  1025. o.chr = nowaGeneracjaBezFCelu[m];
  1026. o.funkcjaCelu = fCelu(m, nowaGeneracjaBezFCelu);
  1027. nowaGeneracja[m] = o;
  1028. }
  1029.  
  1030. //..........................Tworzenie tablicy dla osobnikow po selekcji..........................
  1031. tabPoSelekcji = new Osobnik[liczbaOsobnikow];
  1032. for (int n = 0; n < liczbaOsobnikow; n++)
  1033. {
  1034. Osobnik o = new Osobnik();
  1035. o.chr = null;
  1036. o.funkcjaCelu = 0;
  1037. tabPoSelekcji[n] = o;
  1038. }
  1039.  
  1040. //..........................Selekcja..........................
  1041. selekcja(nowaGeneracja);
  1042.  
  1043. if (selekcje == "selekcjaElitarna")
  1044. {
  1045. tabRodzicow = tabRodzicow.OrderBy(si => si.funkcjaCelu).ToArray();
  1046. tabPoSelekcji[0].chr = tabRodzicow[0].chr;
  1047. tabPoSelekcji[0].funkcjaCelu = tabRodzicow[0].funkcjaCelu;
  1048. }
  1049.  
  1050. //..........................Zapisanie najlepszej wart f celu do tablicy..........................
  1051. if (generacjaInt == 1)
  1052. {
  1053. tablicaFunkcjiCelu[(generacjaInt - 1), 0] = generacjaInt - 1;
  1054. int wartosc = najlepszyZNowejGeneracji(tabRodzicow).funkcjaCelu;
  1055. tablicaFunkcjiCelu[(generacjaInt - 1), 1] = wartosc;
  1056. }
  1057. else
  1058. {
  1059. tablicaFunkcjiCelu[(generacjaInt - 1), 0] = generacjaInt - 1;
  1060. int wartosc = najlepszyZNowejGeneracji(tabPoSelekcji).funkcjaCelu;
  1061. tablicaFunkcjiCelu[(generacjaInt - 1), 1] = wartosc;
  1062. }
  1063.  
  1064. //..........................Czystki..........................
  1065. zapiszPopulacjeRodzicow();
  1066. liczniktablicyMutacji = 0;
  1067. liczniktablicyKrzyzowania = 0;
  1068.  
  1069. }
  1070. zapiszFCelu();
  1071. wyswietlPierwszyWCalosci();
  1072. pierwszyNajlepszyDoPliku();
  1073. wyswietlOstatniWCalosci();
  1074. generacjaMutacji.Text += "Najlepszy osobnik: \n" + "wartosc funkcji celu: " + najlepszyZNowejGeneracji(tabPoSelekcji).ToString() + "\n" + "iteracja: " + iteracjaNajlepszego() + "\n" + "najlepszy chromosom: ";
  1075. wypisywanieKolejnosciPrac(najlepszyZNowejGeneracji(tabPoSelekcji));
  1076. zapisywanieDanychDoOpisu(najlepszyZNowejGeneracji(tabPoSelekcji));
  1077. wyczyscZapiszPopulacjeRodzicow();
  1078.  
  1079. }
  1080.  
  1081. public Osobnik najlepszy()
  1082. {
  1083. Osobnik naj = new Osobnik();
  1084. naj.chr = tabRodzicow[0].chr;
  1085. naj.funkcjaCelu = fCelu(0, osobnikGlowny);
  1086. for (int i = 1; i < liczbaOsobnikow; i++)
  1087. {
  1088. if (naj.funkcjaCelu > tabRodzicow[i].funkcjaCelu)
  1089. {
  1090. naj.chr = tabRodzicow[i].chr;
  1091. naj.funkcjaCelu = fCelu(i, osobnikGlowny);
  1092. }
  1093. }
  1094.  
  1095. return naj;
  1096. }
  1097.  
  1098. public Osobnik najlepszyZNowejGeneracji(Osobnik[] osek)
  1099. {
  1100. Osobnik naj = new Osobnik();
  1101. naj.chr = osek[0].chr;
  1102. naj.funkcjaCelu = osek[0].funkcjaCelu;
  1103. for (int i = 1; i < osek.Length; i++)
  1104. {
  1105. if (naj.funkcjaCelu > osek[i].funkcjaCelu)
  1106. {
  1107. naj.chr = osek[i].chr;
  1108. naj.funkcjaCelu = osek[i].funkcjaCelu;
  1109. }
  1110. }
  1111.  
  1112. return naj;
  1113. }
  1114.  
  1115. public Osobnik[] najlepszyTablica(Osobnik[] duzaTab)
  1116. {
  1117. Osobnik[] naj = new Osobnik[liczbaOsobnikow];
  1118. for (int n = 0; n < liczbaOsobnikow; n++)
  1119. {
  1120. Osobnik o = new Osobnik();
  1121. o.chr = null;
  1122. o.funkcjaCelu = 0;
  1123. naj[n] = o;
  1124. }
  1125.  
  1126. Osobnik[] najSorted = new Osobnik[duzaTab.Length];
  1127. for (int o = 0; o < duzaTab.Length; o++)
  1128. {
  1129. Osobnik osobniczek = new Osobnik();
  1130. osobniczek.chr = null;
  1131. osobniczek.funkcjaCelu = 0;
  1132. najSorted[o] = osobniczek;
  1133. }
  1134. //..........................Sortowanie tablicy..........................
  1135. najSorted = duzaTab.OrderBy(si => si.funkcjaCelu).ToArray();
  1136. //..........................Wybor najlepszych..........................
  1137. for (int p = 0; p < liczbaOsobnikow; p++)
  1138. {
  1139. naj[p] = najSorted[p];
  1140. }
  1141.  
  1142. return naj;
  1143. }
  1144.  
  1145. public void mutacja(Chromosom os)
  1146. {
  1147.  
  1148. switch (mutacje)
  1149. {
  1150. case "adjacentTwoJobExchange":
  1151. mutacjePotomkowie[liczniktablicyMutacji] = adjacentTwoJobExchangeMethod(os);
  1152. liczniktablicyMutacji++;
  1153. break;
  1154. case "positionBasedMutation":
  1155. mutacjePotomkowie[liczniktablicyMutacji] = positionBasedMutationMethod(os);
  1156. liczniktablicyMutacji++;
  1157. break;
  1158. case "orderBasedMutation":
  1159. mutacjePotomkowie[liczniktablicyMutacji] = orderBasedMutationMethod(os);
  1160. liczniktablicyMutacji++;
  1161. break;
  1162. default:
  1163. break;
  1164. }
  1165. }
  1166.  
  1167. public void krzyzowania(Chromosom os1, Chromosom os2)
  1168. {
  1169. switch (krzyzowanie)
  1170. {
  1171. case "onePointCrossover":
  1172. krzyzowaniePotomkowie[liczniktablicyKrzyzowania] = onePointCrossoverMethod(os1, os2);
  1173. liczniktablicyKrzyzowania++;
  1174. break;
  1175. case "twoPointCrossover":
  1176. krzyzowaniePotomkowie[liczniktablicyKrzyzowania] = twoPointCrossoverMethod(os1, os2);
  1177. liczniktablicyKrzyzowania++;
  1178. break;
  1179. default:
  1180. break;
  1181. }
  1182. }
  1183.  
  1184. public void selekcja(Osobnik[] os)
  1185. {
  1186.  
  1187. switch (selekcje)
  1188. {
  1189. case "selekcjaTurniejowa":
  1190. tabPoSelekcji = selekcjaTurniejowaMethod(os);
  1191. break;
  1192. case "selekcjaElitarna":
  1193. tabPoSelekcji = selekcjaElitarnaMethod(os);
  1194. break;
  1195. case "selekcjaRankingowa":
  1196. tabPoSelekcji = selekcjaRankingowaMethod(os);
  1197. break;
  1198. default:
  1199. break;
  1200. }
  1201. }
  1202.  
  1203. public Osobnik[] selekcjaRankingowaMethod(Osobnik[] osek)
  1204. {
  1205. Random randomik = new Random();
  1206. Ranking[] tablica = new Ranking[osek.Length];
  1207. float prawd = 0;
  1208. int sumaRang = 0;
  1209.  
  1210. Chromosom[] tablicaDoZwrotuChromosom = new Chromosom[liczbaOsobnikow];
  1211. for (int r = 0; r < liczbaOsobnikow; r++)
  1212. {
  1213. Praca[] praca = new Praca[liczbaPrac];
  1214. for (int z = 0; z < praca.Length; z++)
  1215. {
  1216. praca[z] = new Praca();
  1217. praca[z].rnd = krzyzowka;
  1218. praca[z].liczbaMaszyn = liczbaMaszyn;
  1219. praca[z].pracaTworzenie(0);
  1220. }
  1221. Chromosom chromek = new Chromosom();
  1222. chromek.liczbaPrac = liczbaPrac;
  1223. chromek.zadanie = praca;
  1224.  
  1225. tablicaDoZwrotuChromosom[r] = chromek;
  1226. }
  1227.  
  1228. Osobnik[] tablicaDoZwrotuOsobnik = new Osobnik[liczbaOsobnikow];
  1229. for (int b = 0; b < liczbaOsobnikow; b++)
  1230. {
  1231. Osobnik os = new Osobnik();
  1232. os.chr = tablicaDoZwrotuChromosom[b];
  1233. os.funkcjaCelu = fCelu(b, tablicaDoZwrotuChromosom);
  1234. tablicaDoZwrotuOsobnik[b] = os;
  1235. }
  1236.  
  1237. osek = osek.OrderBy(si => si.funkcjaCelu).ToArray();
  1238.  
  1239. for (int o = 0; o < osek.Length; o++)
  1240. {
  1241. sumaRang += osek.Length - o;
  1242. }
  1243.  
  1244. for (int i = 0; i < osek.Length; i++)
  1245. {
  1246. Ranking kr = new Ranking();
  1247. kr.chr = osek[i].chr;
  1248. kr.funkcjaCelu = osek[i].funkcjaCelu;
  1249. kr.ranga = osek.Length - i;
  1250. float zmienna = (float)kr.ranga / (float)sumaRang;
  1251. zmienna *= 100;
  1252. kr.prawdopodobienstwo = zmienna;
  1253. if (i == 0)
  1254. {
  1255. kr.poczatekPrzedzialu = 0;
  1256. kr.koniecPrzedzialu = kr.poczatekPrzedzialu + kr.prawdopodobienstwo;
  1257. }
  1258. else
  1259. {
  1260. kr.poczatekPrzedzialu = tablica[i - 1].koniecPrzedzialu;
  1261. kr.koniecPrzedzialu = kr.poczatekPrzedzialu + kr.prawdopodobienstwo;
  1262. }
  1263. tablica[i] = kr;
  1264. }
  1265.  
  1266. for (int k = 0; k < liczbaOsobnikow; k++)
  1267. {
  1268. prawd = randomik.Next(0, (int)tablica[osek.Length - 1].koniecPrzedzialu);
  1269. for (int l = 0; l < osek.Length; l++)
  1270. {
  1271. if (tablica[l].poczatekPrzedzialu <= prawd && tablica[l].koniecPrzedzialu >= prawd)
  1272. {
  1273. tablicaDoZwrotuOsobnik[k].chr = tablica[l].chr;
  1274. tablicaDoZwrotuOsobnik[k].funkcjaCelu = tablica[l].funkcjaCelu;
  1275. break;
  1276. }
  1277. }
  1278. }
  1279.  
  1280. return tablicaDoZwrotuOsobnik;
  1281. }
  1282.  
  1283. public Osobnik[] selekcjaElitarnaMethod(Osobnik[] osek)
  1284. {
  1285. Random randomik = new Random();
  1286. Ranking[] tablica = new Ranking[osek.Length];
  1287. int sumaRang = 0;
  1288.  
  1289. Chromosom[] tablicaDoZwrotuChromosom = new Chromosom[liczbaOsobnikow];
  1290. for (int r = 0; r < liczbaOsobnikow; r++)
  1291. {
  1292. Praca[] praca = new Praca[liczbaPrac];
  1293. for (int z = 0; z < praca.Length; z++)
  1294. {
  1295. praca[z] = new Praca();
  1296. praca[z].rnd = krzyzowka;
  1297. praca[z].liczbaMaszyn = liczbaMaszyn;
  1298. praca[z].pracaTworzenie(0);
  1299. }
  1300. Chromosom chromek = new Chromosom();
  1301. chromek.liczbaPrac = liczbaPrac;
  1302. chromek.zadanie = praca;
  1303.  
  1304. tablicaDoZwrotuChromosom[r] = chromek;
  1305. }
  1306.  
  1307. Osobnik[] tablicaDoZwrotuOsobnik = new Osobnik[liczbaOsobnikow];
  1308. for (int b = 0; b < liczbaOsobnikow; b++)
  1309. {
  1310. Osobnik os = new Osobnik();
  1311. os.chr = tablicaDoZwrotuChromosom[b];
  1312. os.funkcjaCelu = fCelu(b, tablicaDoZwrotuChromosom);
  1313. tablicaDoZwrotuOsobnik[b] = os;
  1314. }
  1315.  
  1316. osek = osek.OrderBy(si => si.funkcjaCelu).ToArray();
  1317.  
  1318. for (int o = 0; o < osek.Length; o++)
  1319. {
  1320. sumaRang += osek.Length - o;
  1321. }
  1322.  
  1323. for (int i = 0; i < osek.Length; i++)
  1324. {
  1325. Ranking kr = new Ranking();
  1326. kr.chr = osek[i].chr;
  1327. kr.funkcjaCelu = osek[i].funkcjaCelu;
  1328. kr.ranga = osek.Length - i;
  1329. float zmienna = (float)kr.ranga / (float)sumaRang;
  1330. zmienna *= 100;
  1331. kr.prawdopodobienstwo = zmienna;
  1332. if (i == 0)
  1333. {
  1334. kr.poczatekPrzedzialu = 0;
  1335. kr.koniecPrzedzialu = kr.poczatekPrzedzialu + kr.prawdopodobienstwo;
  1336. }
  1337. else
  1338. {
  1339. kr.poczatekPrzedzialu = tablica[i - 1].koniecPrzedzialu;
  1340. kr.koniecPrzedzialu = kr.poczatekPrzedzialu + kr.prawdopodobienstwo;
  1341. }
  1342. tablica[i] = kr;
  1343. }
  1344.  
  1345. for (int i = 1; i < liczbaOsobnikow; i++)
  1346. {
  1347. int ktory = randomik.Next(0, liczbaOsobnikow);
  1348. tablicaDoZwrotuOsobnik[i].chr = tablica[ktory].chr;
  1349. tablicaDoZwrotuOsobnik[i].funkcjaCelu = osek[ktory].funkcjaCelu;
  1350. }
  1351. return tablicaDoZwrotuOsobnik;
  1352. }
  1353.  
  1354. public Osobnik[] selekcjaTurniejowaMethod(Osobnik[] osek)
  1355. {
  1356. int liczbaUczestnikowTurnieju = 0;
  1357. if (liczbaOsobnikow == 5)
  1358. {
  1359. liczbaUczestnikowTurnieju = liczbaOsobnikow / 2;
  1360. }
  1361. else if (liczbaOsobnikow == 10)
  1362. {
  1363. liczbaUczestnikowTurnieju = liczbaOsobnikow / 5;
  1364. }
  1365. else if (liczbaOsobnikow == 20)
  1366. {
  1367. liczbaUczestnikowTurnieju = liczbaOsobnikow / 4;
  1368. }
  1369. else if (liczbaOsobnikow == 40)
  1370. {
  1371. liczbaUczestnikowTurnieju = liczbaOsobnikow / 10;
  1372. }
  1373. else if (liczbaOsobnikow == 80)
  1374. {
  1375. liczbaUczestnikowTurnieju = liczbaOsobnikow / 15;
  1376. }
  1377. else if (liczbaOsobnikow == 160)
  1378. {
  1379. liczbaUczestnikowTurnieju = liczbaOsobnikow / 20;
  1380. }
  1381. else
  1382. {
  1383. liczbaUczestnikowTurnieju = liczbaOsobnikow / 4;
  1384. }
  1385.  
  1386.  
  1387. Random randomik = new Random();
  1388. Ranking[] tablica = new Ranking[osek.Length];
  1389. float prawd = 0;
  1390. int sumaRang = 0;
  1391.  
  1392. Chromosom[] tablicaDoZwrotuChromosom = new Chromosom[liczbaOsobnikow];
  1393. for (int r = 0; r < liczbaOsobnikow; r++)
  1394. {
  1395. Praca[] praca = new Praca[liczbaPrac];
  1396. for (int z = 0; z < praca.Length; z++)
  1397. {
  1398. praca[z] = new Praca();
  1399. praca[z].rnd = krzyzowka;
  1400. praca[z].liczbaMaszyn = liczbaMaszyn;
  1401. praca[z].pracaTworzenie(0);
  1402. }
  1403. Chromosom chromek = new Chromosom();
  1404. chromek.liczbaPrac = liczbaPrac;
  1405. chromek.zadanie = praca;
  1406.  
  1407. tablicaDoZwrotuChromosom[r] = chromek;
  1408. }
  1409.  
  1410. Osobnik[] tablicaDoZwrotuOsobnik = new Osobnik[liczbaOsobnikow];
  1411. for (int b = 0; b < liczbaOsobnikow; b++)
  1412. {
  1413. Osobnik os = new Osobnik();
  1414. os.chr = tablicaDoZwrotuChromosom[b];
  1415. os.funkcjaCelu = fCelu(b, tablicaDoZwrotuChromosom);
  1416. tablicaDoZwrotuOsobnik[b] = os;
  1417. }
  1418.  
  1419. osek = osek.OrderBy(si => si.funkcjaCelu).ToArray();
  1420.  
  1421. for (int o = 0; o < osek.Length; o++)
  1422. {
  1423. sumaRang += osek.Length - o;
  1424. }
  1425.  
  1426. for (int i = 0; i < osek.Length; i++)
  1427. {
  1428. Ranking kr = new Ranking();
  1429. kr.chr = osek[i].chr;
  1430. kr.funkcjaCelu = osek[i].funkcjaCelu;
  1431. kr.ranga = osek.Length - i;
  1432. float zmienna = (float)kr.ranga / (float)sumaRang;
  1433. zmienna *= 100;
  1434. kr.prawdopodobienstwo = zmienna;
  1435. if (i == 0)
  1436. {
  1437. kr.poczatekPrzedzialu = 0;
  1438. kr.koniecPrzedzialu = kr.poczatekPrzedzialu + kr.prawdopodobienstwo;
  1439. }
  1440. else
  1441. {
  1442. kr.poczatekPrzedzialu = tablica[i - 1].koniecPrzedzialu;
  1443. kr.koniecPrzedzialu = kr.poczatekPrzedzialu + kr.prawdopodobienstwo;
  1444. }
  1445. tablica[i] = kr;
  1446. }
  1447.  
  1448. //----------------------------------------------------------------------------
  1449.  
  1450. for (int k = 0; k < liczbaOsobnikow; k++)
  1451. {
  1452. Chromosom[] tablicaTurniejowaChromosom = new Chromosom[liczbaUczestnikowTurnieju];
  1453. for (int r = 0; r < liczbaUczestnikowTurnieju; r++)
  1454. {
  1455. Praca[] praca = new Praca[liczbaPrac];
  1456. for (int z = 0; z < praca.Length; z++)
  1457. {
  1458. praca[z] = new Praca();
  1459. praca[z].rnd = krzyzowka;
  1460. praca[z].liczbaMaszyn = liczbaMaszyn;
  1461. praca[z].pracaTworzenie(0);
  1462. }
  1463. Chromosom chromek = new Chromosom();
  1464. chromek.liczbaPrac = liczbaPrac;
  1465. chromek.zadanie = praca;
  1466.  
  1467. tablicaTurniejowaChromosom[r] = chromek;
  1468. }
  1469.  
  1470. Osobnik[] tablicaTurniejowaOsobnik = new Osobnik[liczbaUczestnikowTurnieju];
  1471. for (int b = 0; b < liczbaUczestnikowTurnieju; b++)
  1472. {
  1473. Osobnik os = new Osobnik();
  1474. os.chr = tablicaTurniejowaChromosom[b];
  1475. os.funkcjaCelu = fCelu(b, tablicaTurniejowaChromosom);
  1476. tablicaTurniejowaOsobnik[b] = os;
  1477. }
  1478. for (int r = 0; r < liczbaUczestnikowTurnieju; r++)
  1479. {
  1480. int bryg = randomik.Next(0, liczbaOsobnikow);
  1481. tablicaTurniejowaOsobnik[r].chr = tablica[bryg].chr;
  1482. tablicaTurniejowaOsobnik[r].funkcjaCelu = tablica[bryg].funkcjaCelu;
  1483. }
  1484. tablicaTurniejowaOsobnik = tablicaTurniejowaOsobnik.OrderBy(si => si.funkcjaCelu).ToArray();
  1485. tablicaDoZwrotuOsobnik[k] = tablicaTurniejowaOsobnik[0];
  1486. }
  1487.  
  1488. return tablicaDoZwrotuOsobnik;
  1489. }
  1490.  
  1491. public void zapiszFCelu()
  1492. {
  1493. System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Users\kowal\Desktop\daneDoWykresu.txt");
  1494.  
  1495. for (int a = 0; a < liczbaGeneracji; a++)
  1496. {
  1497.  
  1498. file.WriteLine(tablicaFunkcjiCelu[a, 0]);
  1499. file.WriteLine(tablicaFunkcjiCelu[a, 1]);
  1500. }
  1501. file.Close();
  1502. }
  1503.  
  1504. public void wyczyscZapiszFCelu()
  1505. {
  1506. System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Users\kowal\Desktop\daneDoWykresu.txt");
  1507. file.WriteLine();
  1508. file.Close();
  1509. }
  1510.  
  1511. public void wypisywanieKolejnosciPrac(Osobnik os)
  1512. {
  1513. generacjaMutacji.Text += "\n[";
  1514. for (int i = 0; i < liczbaPrac; i++)
  1515. {
  1516. for (int j = 0; j < liczbaPrac; j++)
  1517. {
  1518. if (czyTaSamaPraca(os.chr.zadanie[i], pierwszyOsobnik.chr.zadanie[j]))
  1519. {
  1520. if (i == (liczbaPrac - 1))
  1521. {
  1522. generacjaMutacji.Text += "J" + (j + 1) + "]";
  1523. }
  1524. else
  1525. {
  1526. generacjaMutacji.Text += "J" + (j + 1) + "; ";
  1527. }
  1528. }
  1529. }
  1530. }
  1531. }
  1532.  
  1533. public void zapisywanieDanychDoOpisu(Osobnik os)
  1534. {
  1535. System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Users\kowal\Desktop\daneDoOpisu.txt");
  1536. file.WriteLine("Najlepszy osobnik:");
  1537. file.WriteLine("wartosc funkcji celu: " + najlepszyZNowejGeneracji(tabPoSelekcji).ToString());
  1538. file.WriteLine("iteracja: " + iteracjaNajlepszego());
  1539. file.WriteLine("najlepszy chromosom:");
  1540. file.Write("[");
  1541. for (int i = 0; i < liczbaPrac; i++)
  1542. {
  1543. for (int j = 0; j < liczbaPrac; j++)
  1544. {
  1545. if (czyTaSamaPraca(os.chr.zadanie[i], pierwszyOsobnik.chr.zadanie[j]))
  1546. {
  1547. if (i == (liczbaPrac - 1))
  1548. {
  1549. file.Write("J" + (j + 1) + "]");
  1550. }
  1551. else
  1552. {
  1553. file.Write("J" + (j + 1) + "; ");
  1554. }
  1555. }
  1556. }
  1557. }
  1558. file.Close();
  1559. }
  1560.  
  1561. public void pierwszyNajlepszyDoPliku()
  1562. {
  1563. System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Users\kowal\Desktop\tabelaPierszegoNajlepszegoOsobnika.txt");
  1564. file.WriteLine("Chromosom najlepiej przystosowany w pierwszej iteracji");
  1565. file.WriteLine();
  1566. file.Write("\t");
  1567. for (int i = 0; i < liczbaMaszyn; i++)
  1568. {
  1569. file.Write("S" + (i + 1) + "\t");
  1570.  
  1571. }
  1572. file.WriteLine();
  1573. for (int i = 0; i < liczbaPrac; i++)
  1574. {
  1575. file.Write("J" + (i + 1) + "\t");
  1576. for (int s = 0; s < liczbaMaszyn; s++)
  1577. {
  1578. if (pierwszyOsobnik.chr.zadanie[i].zadania[s].czas == 0)
  1579. {
  1580. file.Write("- \t");
  1581. }
  1582. else
  1583. {
  1584. file.Write(pierwszyOsobnik.chr.zadanie[i].zadania[s].ToString() + "\t");
  1585. }
  1586.  
  1587. }
  1588. file.WriteLine();
  1589.  
  1590. }
  1591. file.WriteLine();
  1592. file.WriteLine();
  1593. file.Close();
  1594. }
  1595.  
  1596. public void pierwszyNajlepszyDoPlikuCzystka()
  1597. {
  1598. System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Users\kowal\Desktop\tabelaPierszegoNajlepszegoOsobnika.txt");
  1599. file.WriteLine();
  1600. file.Close();
  1601. }
  1602.  
  1603. public void zapisywanieDanychDoOpisuCzystka()
  1604. {
  1605.  
  1606. System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Users\kowal\Desktop\daneDoOpisu.txt");
  1607. file.WriteLine();
  1608. file.Close();
  1609. }
  1610.  
  1611. public int iteracjaNajlepszego()
  1612. {
  1613. int indexNajlepszy = 0;
  1614. int wartFCeluNajlepsza = pierwszyOsobnik.funkcjaCelu;
  1615. System.IO.StreamReader file = new System.IO.StreamReader(@"C:\Users\kowal\Desktop\daneDoWykresu.txt");
  1616. int[,] tabWczytana = new int[liczbaGeneracji, 2];
  1617. for (int i = 0; i < liczbaGeneracji; i++)
  1618. {
  1619. tabWczytana[i, 0] = Int32.Parse(file.ReadLine());
  1620. tabWczytana[i, 1] = Int32.Parse(file.ReadLine());
  1621. }
  1622.  
  1623. for (int j = 0; j < liczbaGeneracji; j++)
  1624. {
  1625. if (tabWczytana[j, 1] < wartFCeluNajlepsza)
  1626. {
  1627. wartFCeluNajlepsza = tabWczytana[j, 1];
  1628. indexNajlepszy = tabWczytana[j, 0];
  1629. }
  1630. }
  1631.  
  1632. file.Close();
  1633. return indexNajlepszy;
  1634. }
  1635.  
  1636. public void wyswietlPierwszyWCalosci()
  1637. {
  1638. generacja.Text += "Chromosom najlepiej przystosowany w pierwszej iteracji";
  1639. generacja.Text += "\n";
  1640. generacja.Text += "\t";
  1641. for (int i = 0; i < liczbaMaszyn; i++)
  1642. {
  1643. generacja.Text += "S" + (i + 1) + "\t";
  1644.  
  1645. }
  1646. generacja.Text += "\n";
  1647. for (int i = 0; i < liczbaPrac; i++)
  1648. {
  1649. generacja.Text += "J" + (i + 1) + "\t";
  1650. for (int s = 0; s < liczbaMaszyn; s++)
  1651. {
  1652. if (pierwszyOsobnik.chr.zadanie[i].zadania[s].czas == 0)
  1653. {
  1654. generacja.Text += "- \t";
  1655. }
  1656. else
  1657. {
  1658. generacja.Text += pierwszyOsobnik.chr.zadanie[i].zadania[s].ToString() + "\t";
  1659. }
  1660.  
  1661. }
  1662. generacja.Text += "\n";
  1663.  
  1664. }
  1665. generacja.Text += "\n";
  1666. generacja.Text += "\n";
  1667.  
  1668. }
  1669.  
  1670. public void wyswietlOstatniWCalosci()
  1671. {
  1672. generacja.Text += "Chromosom najlepiej przystosowany";
  1673. generacja.Text += "\n";
  1674. generacja.Text += "\t";
  1675. for (int i = 0; i < liczbaMaszyn; i++)
  1676. {
  1677. generacja.Text += "S" + (i + 1) + "\t";
  1678.  
  1679. }
  1680. generacja.Text += "\n";
  1681. for (int i = 0; i < liczbaPrac; i++)
  1682. {
  1683. generacja.Text += "J" + (i + 1) + "\t";
  1684. for (int s = 0; s < liczbaMaszyn; s++)
  1685. {
  1686. if (najlepszyZNowejGeneracji(tabPoSelekcji).chr.zadanie[i].zadania[s].czas == 0)
  1687. {
  1688. generacja.Text += "- \t";
  1689. }
  1690. else
  1691. {
  1692. generacja.Text += najlepszyZNowejGeneracji(tabPoSelekcji).chr.zadanie[i].zadania[s].ToString() + "\t";
  1693. }
  1694.  
  1695. }
  1696. generacja.Text += "\n";
  1697.  
  1698. }
  1699. generacja.Text += "\n";
  1700. generacja.Text += "\n";
  1701.  
  1702. }
  1703.  
  1704. private void rysuj_Click(object sender, RoutedEventArgs e)
  1705. {
  1706.  
  1707. }
  1708.  
  1709. private void krzyzowanieProcentWczytaj_Click(object sender, RoutedEventArgs e)
  1710. {
  1711. krzyzowanieProcent = float.Parse(krzyzowanieProcenty.Text, System.Globalization.CultureInfo.InvariantCulture.NumberFormat);
  1712. }
  1713.  
  1714. private void mutacjaProcentWczytaj_Click(object sender, RoutedEventArgs e)
  1715. {
  1716. mutacjeProcent = float.Parse(mutacjeProcenty.Text, System.Globalization.CultureInfo.InvariantCulture.NumberFormat);
  1717. }
  1718. }
  1719. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement