Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function pot =KrzyzRUL(par)
- % pobranie rozmiaru macierzy par
- [m,n]=size(par)
- % nowa macierz do uzpelnienia
- npar=string(zeros(m,n));
- % nalezy dla kazdej pary wylosowac liczbe z zakresu od 0 do 1
- wylosRUL=par; % stworzenie macierzy z elementami par po ruletce
- j=0;
- for i=1:m
- % prawdopodobieństwo na krzyzowanie wynoszace 80% (80% z 1 to 0.8)
- if rand(1) <= 0.8
- j=j+1;
- wylosRUL(j,:)=par(i,:)
- end
- end
- % pary ktore zostana poddane krzyzowaniu
- wylosRUL=wylosRUL(1:j,:)
- % zmiana ich na wartosci binarne
- BINwylosp1=dec2bin(int32(100*wylosRUL(:,1)),8);
- BINwylosi1=dec2bin(int32(100*wylosRUL(:,2)),8);
- BINwylosd1=dec2bin(int32(100*wylosRUL(:,3)),8);
- BINwylosp2=dec2bin(int32(100*wylosRUL(:,4)),8);
- BINwylosi2=dec2bin(int32(100*wylosRUL(:,5)),8);
- BINwylosd2=dec2bin(int32(100*wylosRUL(:,6)),8);
- BINwylos=[string(BINwylosp1),string(BINwylosi1),string(BINwylosd1),string(BINwylosp2),string(BINwylosi2),string(BINwylosd2)]
- % pobranie rozmiaru macierzy par poddanych krzyzowaniu, w celu pozniejszemu
- % zapisaniu tych ktore nie beda zapisane
- [k,l]=size(BINwylos)
- % zamiana kazdej nastawy na wartosc binarna
- BINp1=dec2bin(int32(100*par(:,1)),8);
- BINi1=dec2bin(int32(100*par(:,2)),8);
- BINd1=dec2bin(int32(100*par(:,3)),8);
- BINp2=dec2bin(int32(100*par(:,4)),8);
- BINi2=dec2bin(int32(100*par(:,5)),8);
- BINd2=dec2bin(int32(100*par(:,6)),8);
- % macierz wylosRUL w postaci binarnej
- BINpar=[string(BINp1),string(BINi1),string(BINd1),string(BINp2),string(BINi2),string(BINd2)]
- %%
- % wylosowane punkty przeciecia
- pktPRZE=randperm(8-1,2);
- % od tego genu pobierzemy lanuch ktory wykorzystamy do krzyzowania
- p1=min(pktPRZE)+1;
- % +1 bo chcemy wziac element po punkcie np. jesli wylosujemy 2 to znaczy ze
- % po dwoch genach jest nasz punkt, tym samym bierzemy trzeci gen
- % do tego genu pobieramy wyzej wspomniany lancuch
- p2=max(pktPRZE);
- %%
- % tworzymy nowe wiersze kazdej z nastaw wystepujacych w krzyzowanej parze
- % dzieki temu nie nadpiszemy niepotrzebnie innych elementow
- newBINwylosp1=string(BINwylosp1);
- newBINwylosi1=string(BINwylosi1);
- newBINwylosd1=string(BINwylosd1);
- newBINwylosp2=string(BINwylosp2);
- newBINwylosi2=string(BINwylosi2);
- newBINwylosd2=string(BINwylosd2);
- %%
- % wiersze z elementami z danej nastawy osobnikow z par, ktore bedzieym
- % podmieniac w ramach krzyzowania
- eleNewBINwylosp1=string(extractBetween(newBINwylosp1,[p1],[p2]));
- eleNewBINwylosi1=string(extractBetween(newBINwylosi1,[p1],[p2]));
- eleNewBINwylosd1=string(extractBetween(newBINwylosd1,[p1],[p2]));
- eleNewBINwylosp2=string(extractBetween(newBINwylosp2,[p1],[p2]));
- eleNewBINwylosi2=string(extractBetween(newBINwylosi2,[p1],[p2]));
- eleNewBINwylosd2=string(extractBetween(newBINwylosd2,[p1],[p2]));
- %%
- % potomkowie pierwszego osobnika z pary skrzyzowanego z drugim
- pot12BINwylosp=string(replaceBetween(newBINwylosp1,[p1],[p2],eleNewBINwylosp2));
- pot12BINwylosi=string(replaceBetween(newBINwylosi1,[p1],[p2],eleNewBINwylosi2));
- pot12BINwylosd=string(replaceBetween(newBINwylosd1,[p1],[p2],eleNewBINwylosd2));
- %%
- % potomkowie drugiego osobnika z pary skrzyzowanego z pierwszym
- pot21BINwylosp=string(replaceBetween(newBINwylosp2,[p1],[p2],eleNewBINwylosp1));
- pot21BINwylosi=string(replaceBetween(newBINwylosi2,[p1],[p2],eleNewBINwylosi1));
- pot21BINwylosd=string(replaceBetween(newBINwylosd2,[p1],[p2],eleNewBINwylosd1));
- %%
- % elitaryzmu (bez petli ze wzgledu na to jak wykonalismy
- % krzyzowanie), ponownie dwa pierwsze poniewaz sa one najlepsze
- LeliteBINwylos=string(BINpar(1,1:3));
- PeliteBINwylos=string(BINpar(1,4:6));
- %%
- % macierz po krzyzowaniu pierwszego osobnika pary z drugim
- pot12=string([pot12BINwylosp,pot12BINwylosi,pot12BINwylosd])
- % macierz po krzyzowaniu drugiego osobnika pary z pierwszym
- pot21=string([pot21BINwylosp,pot21BINwylosi,pot21BINwylosd])
- %%
- % implementacja elitaryzmu w otrzymanym potomstwie
- % usuniecie pierwszego wiersza
- pot12(1,:)=[];
- pot21(1,:)=[];
- % dopisanie osobnikow elitaryzmu do potomstwa
- pot12=string([LeliteBINwylos;pot12])
- pot21=string([PeliteBINwylos;pot21])
- % dopisanie do potomstwa osobnikow ktore nie podlegaly krzyzowaniu
- pot12=[pot12;BINpar(k+1:m,1:3)]
- pot21=[pot21;BINpar(k+1:m,4:6)]
- % stworzenie ogolnej macierzy potomstwa, ktora jest przeplatana
- [x,y]=size(pot12)
- pot=strings(2*x,3);
- pot(1:2:end,:)=string(pot12);
- pot(2:2:end,:)=string(pot21);
- % z racji ze bedziemy potrzebowac tyle samo osobnikow
- %out=pot;
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement