Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function [c1, c2] = orderedCrossover(p1,p2)
- %Zasadę działania tego operatora krzyżowania ilustruje przykład:
- % p1 = [1 2 3 4 5 6]; p2 = [6 5 4 3 2 1];
- % Losujemy dwa miejsca krzyżowania: np. pozycja 3 i pozycja 5, wtedy:
- % c1 = [1 2 5 4 3 6]; c2 = [6 3 4 5 2 1];
- %(liczby między miejscami krzyżowania w c1 należy przepisać w kolejności
- % w jakiej występują w p2; te same liczby należy przepisać do c2 w
- % kolejności w jakiej występują w p1)
- %losowanie 2 liczb
- przedzial = [rand() rand()];
- rozmiar = size(p1);
- przedzial = floor(przedzial*rozmiar(2));
- przedzial = sort(przedzial);
- przedzial = floor(przedzial+1);
- %robota
- w_roboczy1 = [p1(przedzial(1) : przedzial(2)) ; przedzial(1):przedzial(2)];
- w_roboczy2 = [p1(przedzial(1) : przedzial(2)) ; przedzial(1):przedzial(2)];
- pos_src = 1;
- i = 1;
- rozmiar = size(p2);
- rozmiar2 = size(w_roboczy1);
- while (i <= rozmiar(2)) && (pos_src <= rozmiar2(2))
- if p2(i) == w_roboczy1(1, pos_src)
- w_roboczy1(2, pos_src) = i;
- pos_src = pos_src+1;
- i=1;
- else
- i=i+1;
- end
- end
- w_roboczy1=rot90(w_roboczy1);
- w_roboczy1=sortrows(w_roboczy1, 2);
- c2=p2;
- %rot90(w_roboczy1(:,2))
- %w_roboczy2(1,:)
- c2(rot90(w_roboczy1(:,2))) =w_roboczy2(1,:);
- c1=p1;
- c1(przedzial(1) : przedzial(2)) = w_roboczy1(:,1);
- %przedzial
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement