Advertisement
Ostu

Untitled

Dec 10th, 2021
1,239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 4.41 KB | None | 0 0
  1. function pot =KrzyzRUL(par)
  2.  
  3. % pobranie rozmiaru macierzy par
  4. [m,n]=size(par)
  5.  
  6. % nowa macierz do uzpelnienia
  7. npar=string(zeros(m,n));
  8.  
  9.  
  10. % nalezy dla kazdej pary wylosowac liczbe z zakresu od 0 do 1
  11. wylosRUL=par; %  stworzenie macierzy z elementami par po ruletce
  12. j=0;
  13. for i=1:m
  14.     % prawdopodobieństwo na krzyzowanie wynoszace 80% (80% z 1 to 0.8)
  15.     if rand(1) <= 0.8
  16.             j=j+1;
  17.             wylosRUL(j,:)=par(i,:)
  18.     end
  19. end
  20.  
  21. % pary ktore zostana poddane krzyzowaniu
  22. wylosRUL=wylosRUL(1:j,:)
  23.  
  24. % zmiana ich na wartosci binarne
  25. BINwylosp1=dec2bin(int32(100*wylosRUL(:,1)),8);
  26. BINwylosi1=dec2bin(int32(100*wylosRUL(:,2)),8);
  27. BINwylosd1=dec2bin(int32(100*wylosRUL(:,3)),8);
  28. BINwylosp2=dec2bin(int32(100*wylosRUL(:,4)),8);
  29. BINwylosi2=dec2bin(int32(100*wylosRUL(:,5)),8);
  30. BINwylosd2=dec2bin(int32(100*wylosRUL(:,6)),8);
  31.  
  32. BINwylos=[string(BINwylosp1),string(BINwylosi1),string(BINwylosd1),string(BINwylosp2),string(BINwylosi2),string(BINwylosd2)]
  33.  
  34. % pobranie rozmiaru macierzy par poddanych krzyzowaniu, w celu pozniejszemu
  35. % zapisaniu tych ktore nie beda zapisane
  36. [k,l]=size(BINwylos)
  37.  
  38. % zamiana kazdej nastawy na wartosc binarna
  39. BINp1=dec2bin(int32(100*par(:,1)),8);
  40. BINi1=dec2bin(int32(100*par(:,2)),8);
  41. BINd1=dec2bin(int32(100*par(:,3)),8);
  42. BINp2=dec2bin(int32(100*par(:,4)),8);
  43. BINi2=dec2bin(int32(100*par(:,5)),8);
  44. BINd2=dec2bin(int32(100*par(:,6)),8);
  45.  
  46. % macierz wylosRUL w postaci binarnej
  47. BINpar=[string(BINp1),string(BINi1),string(BINd1),string(BINp2),string(BINi2),string(BINd2)]
  48.  
  49.  
  50. %%
  51.  
  52.  
  53. % wylosowane punkty przeciecia
  54. pktPRZE=randperm(8-1,2);
  55.  
  56. % od tego genu pobierzemy lanuch ktory wykorzystamy do krzyzowania
  57. p1=min(pktPRZE)+1;
  58. % +1 bo chcemy wziac element po punkcie np. jesli wylosujemy 2 to znaczy ze
  59. % po dwoch genach jest nasz punkt, tym samym bierzemy trzeci gen
  60.  
  61. % do tego genu pobieramy wyzej wspomniany lancuch
  62. p2=max(pktPRZE);
  63. %%
  64. % tworzymy nowe wiersze kazdej z nastaw wystepujacych w krzyzowanej parze
  65. % dzieki temu nie nadpiszemy niepotrzebnie innych elementow
  66. newBINwylosp1=string(BINwylosp1);
  67. newBINwylosi1=string(BINwylosi1);
  68. newBINwylosd1=string(BINwylosd1);
  69. newBINwylosp2=string(BINwylosp2);
  70. newBINwylosi2=string(BINwylosi2);
  71. newBINwylosd2=string(BINwylosd2);
  72. %%
  73. % wiersze z elementami z danej nastawy osobnikow z par, ktore bedzieym
  74. % podmieniac w ramach krzyzowania
  75. eleNewBINwylosp1=string(extractBetween(newBINwylosp1,[p1],[p2]));
  76. eleNewBINwylosi1=string(extractBetween(newBINwylosi1,[p1],[p2]));
  77. eleNewBINwylosd1=string(extractBetween(newBINwylosd1,[p1],[p2]));
  78. eleNewBINwylosp2=string(extractBetween(newBINwylosp2,[p1],[p2]));
  79. eleNewBINwylosi2=string(extractBetween(newBINwylosi2,[p1],[p2]));
  80. eleNewBINwylosd2=string(extractBetween(newBINwylosd2,[p1],[p2]));
  81.  
  82. %%
  83.  
  84. % potomkowie pierwszego osobnika z pary skrzyzowanego z drugim
  85. pot12BINwylosp=string(replaceBetween(newBINwylosp1,[p1],[p2],eleNewBINwylosp2));
  86. pot12BINwylosi=string(replaceBetween(newBINwylosi1,[p1],[p2],eleNewBINwylosi2));
  87. pot12BINwylosd=string(replaceBetween(newBINwylosd1,[p1],[p2],eleNewBINwylosd2));
  88. %%
  89. % potomkowie drugiego osobnika z pary skrzyzowanego z pierwszym
  90. pot21BINwylosp=string(replaceBetween(newBINwylosp2,[p1],[p2],eleNewBINwylosp1));
  91. pot21BINwylosi=string(replaceBetween(newBINwylosi2,[p1],[p2],eleNewBINwylosi1));
  92. pot21BINwylosd=string(replaceBetween(newBINwylosd2,[p1],[p2],eleNewBINwylosd1));
  93.  
  94. %%
  95.  
  96. % elitaryzmu (bez petli ze wzgledu na to jak wykonalismy
  97. % krzyzowanie), ponownie dwa pierwsze poniewaz sa one najlepsze
  98. LeliteBINwylos=string(BINpar(1,1:3));
  99. PeliteBINwylos=string(BINpar(1,4:6));
  100.  
  101. %%
  102. % macierz po krzyzowaniu pierwszego osobnika pary z drugim
  103. pot12=string([pot12BINwylosp,pot12BINwylosi,pot12BINwylosd])
  104.  
  105. % macierz po krzyzowaniu drugiego osobnika pary z pierwszym
  106. pot21=string([pot21BINwylosp,pot21BINwylosi,pot21BINwylosd])
  107.  
  108.  
  109. %%
  110. % implementacja elitaryzmu w otrzymanym potomstwie
  111.  
  112. % usuniecie pierwszego wiersza
  113. pot12(1,:)=[];
  114. pot21(1,:)=[];
  115.  
  116. % dopisanie osobnikow elitaryzmu do potomstwa
  117. pot12=string([LeliteBINwylos;pot12])
  118. pot21=string([PeliteBINwylos;pot21])
  119.  
  120. % dopisanie do potomstwa osobnikow ktore nie podlegaly krzyzowaniu
  121. pot12=[pot12;BINpar(k+1:m,1:3)]
  122. pot21=[pot21;BINpar(k+1:m,4:6)]
  123.  
  124. % stworzenie ogolnej macierzy potomstwa, ktora jest przeplatana
  125. [x,y]=size(pot12)
  126. pot=strings(2*x,3);
  127. pot(1:2:end,:)=string(pot12);
  128. pot(2:2:end,:)=string(pot21);
  129.  
  130.  
  131. % z racji ze bedziemy potrzebowac tyle samo osobnikow
  132.  
  133. %out=pot;
  134.  
  135. end
  136.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement