Advertisement
hugol

Untitled

Mar 31st, 2015
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 1.28 KB | None | 0 0
  1. function [c1, c2] = orderedCrossover(p1,p2)
  2.  
  3. %Zasadę działania tego operatora krzyżowania ilustruje przykład:
  4. % p1 = [1 2 3 4 5 6]; p2 = [6 5 4 3 2 1];
  5. % Losujemy dwa miejsca krzyżowania: np. pozycja 3 i pozycja 5, wtedy:
  6. % c1 = [1 2 5 4 3 6]; c2 = [6 3 4 5 2 1];
  7. %(liczby między miejscami krzyżowania w c1 należy przepisać w kolejności
  8. % w jakiej występują w p2; te same liczby należy przepisać do c2 w
  9. % kolejności w jakiej występują w p1)
  10.  
  11. %losowanie 2 liczb
  12. przedzial = [rand() rand()];
  13. rozmiar = size(p1);
  14. przedzial = floor(przedzial*rozmiar(2));
  15. przedzial = sort(przedzial);
  16. przedzial = floor(przedzial+1);
  17.  
  18. %robota
  19.  
  20. w_roboczy1 =  [p1(przedzial(1) : przedzial(2)) ; przedzial(1):przedzial(2)];
  21. w_roboczy2 = [p1(przedzial(1) : przedzial(2)) ; przedzial(1):przedzial(2)];
  22. pos_src = 1;
  23. i = 1;
  24. rozmiar = size(p2);
  25. rozmiar2 = size(w_roboczy1);
  26.  
  27. while (i <= rozmiar(2)) && (pos_src <= rozmiar2(2))
  28.     if p2(i) == w_roboczy1(1, pos_src)
  29.         w_roboczy1(2, pos_src) = i;
  30.         pos_src = pos_src+1;
  31.         i=1;
  32.     else
  33.     i=i+1;
  34.     end
  35. end
  36.  
  37. w_roboczy1=rot90(w_roboczy1);
  38. w_roboczy1=sortrows(w_roboczy1, 2);
  39.  
  40. c2=p2;
  41. %rot90(w_roboczy1(:,2))
  42. %w_roboczy2(1,:)
  43. c2(rot90(w_roboczy1(:,2))) =w_roboczy2(1,:);
  44.  
  45. c1=p1;
  46. c1(przedzial(1) : przedzial(2)) = w_roboczy1(:,1);
  47. %przedzial
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement