Advertisement
Pagoniusz

Untitled

Apr 9th, 2015
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 4.39 KB | None | 0 0
  1. %xy=pobieranieDanych;
  2. load('kwiatek.mat');
  3. %load('tarcza.mat');
  4.  
  5. %liczba miast
  6. nmiast=size(xy,1);
  7.  
  8. %macierz odleglosci miedzy miastami
  9. odleglosci = zeros(nmiast, nmiast);
  10. for i=1:nmiast
  11.     for j=1:nmiast
  12.         odleglosci(i,j) = sqrt((xy(i,1)-xy(j,1))^2 + (xy(i,2)-xy(j,2))^2);
  13.     end
  14. end
  15.  
  16. %liczba osobnikow w populacji
  17. nosobnikow = 80;
  18.  
  19. pMut = 0.2;%UZUPEŁNIJ       %p-wo mutacji
  20. pCross =0.1; %UZUPEŁNIJ     %p-wo krzyżowania
  21.  
  22. %inicjalizacja populacji
  23. pop = zeros(nosobnikow,nmiast);
  24. for n=1:nosobnikow
  25.     pop(n,:)=randperm(nmiast); %każdy osobnik to losowa trasa
  26. end
  27.  
  28. newpop = zeros(size(pop));
  29.  
  30.  
  31. maxepochs = 10000;
  32. historia = zeros(1,maxepochs);
  33.  
  34. %wyświetlenie dwóch okien obok siebie
  35. h1 = gcf;
  36. set(h1,'Units','normalize');
  37. outerpos = get(h1,'OuterPosition');
  38. outerpos(1) = (1-2*outerpos(3))/2;
  39. set(h1,'OuterPosition',outerpos);
  40. h2 = figure;
  41. set(h2,'Units','normalize');
  42. outerpos(1) = (1-2*outerpos(3))/2+outerpos(3);
  43. set(h2,'OuterPosition',outerpos);
  44.  
  45. showInterval = 50;
  46.  
  47. %główna pętla algorytmu
  48. for epoka=1:maxepochs
  49.    
  50.     %ocena
  51.     dlugosciTras = zeros(1,nosobnikow);
  52.    
  53.     %UZUPEŁNIJ TUTAJ
  54.      for i=1:nosobnikow
  55.         sum=0;
  56.         for j=1:nmiast-1
  57.             sum = sum + odleglosci(pop(i,j),pop(i,j+1));
  58.         end
  59.         sum = sum + odleglosci(pop(i,nmiast),pop(i,1)); %dodanie odl pomiedzy ostatnim i 1
  60.         dlugosciTras(i) = sum;
  61.     end
  62.    
  63.     %znalezienie i zapisanie najlepszej trasy (dla elitaryzmu)
  64.     [historia(epoka),bestidx] = min(dlugosciTras);
  65.     besttrasa = pop(bestidx,:);
  66.    
  67.    
  68.     %selekcja turniejowa (lub ruletkowa)
  69.  
  70.     %UZUPEŁNIJ TUTAJ (newpop uzupełniona wyselekcjonowanymi osobnikami z pop)
  71.      for i=1:nosobnikow
  72.         a_rand = randi(nosobnikow);
  73.         b_rand = randi(nosobnikow);
  74.         if(dlugosciTras(a_rand) < dlugosciTras(b_rand))
  75.             newpop(i,:) = pop(a_rand,:);
  76.         else
  77.             newpop(i,:) = pop(b_rand,:);
  78.         end
  79.     end
  80.    
  81. %     krzyzowanie
  82. %    for n = 1:ceil(pCross*nosobnikow/2)
  83. %        [newpop(2*n-1,:), newpop(2*n,:)] = ...
  84. %            orderedCrossover(newpop(2*n-1,:), newpop(2*n,:));
  85. %    end
  86.    
  87.    
  88.     %mutacje
  89.    
  90.     %mutacja rodzaj 1 (switching)
  91.     %np. [1 2 3 4 5 6] -> [1 5 3 4 2 6]
  92.    
  93.     %UZUPEŁNIJ TUTAJ
  94.      for i=1:nosobnikow
  95.         if(rand(1) < pMut)
  96.             a_rand = randi(nmiast);
  97.             b_rand = randi(nmiast);
  98.             tmp = newpop(i, a_rand);
  99.             newpop(i, a_rand) = newpop(i, b_rand);
  100.             newpop(i, b_rand) = tmp;
  101.         end
  102.     end
  103.    
  104.    
  105.     %mutacja rodzaj 2 (inversion)
  106.     %np. [1 2 3 4 5 6] -> [1 5 4 3 2 6]
  107.    
  108.     %UZUPEŁNIJ TUTAJ
  109.     for i=1:nosobnikow
  110.         if(rand(1) < pMut)
  111.             aRand = randi(nmiast);
  112.             bRand = randi(nmiast);
  113.             while(aRand > bRand) %wycinek a do b
  114.                 aRand = randi(nmiast);
  115.                 bRand = randi(nmiast);
  116.             end            
  117.             temp = newpop(i, aRand:bRand);
  118.             fliplr(temp);
  119.             newpop(i, aRand:bRand) = temp;
  120.            
  121.         end
  122.     end
  123.     %mutacja rodzaj 3 (translation)
  124.     %np. [1 2 3 4 5 6] -> [1 5 6 2 3 4]
  125.    
  126.     %UZUPEŁNIJ TUTAJ
  127.      for i=1:nosobnikow
  128.         if(rand(1) < pMut)
  129.         aRand = randi(nmiast);
  130.         bRand = randi(nmiast);
  131.         while(aRand > bRand)
  132.             aRand = randi(nmiast);
  133.             bRand = randi(nmiast);
  134.         end    
  135.        b_rand = newpop(i, bRand:nmiast);
  136.        a_rand = newpop(i, aRand:(bRand-1));
  137.        newpop(i, aRand:(aRand+size(b_rand,2)-1)) = b_rand;
  138.        newpop(i, (aRand+size(b_rand,2)):(aRand+size(b_rand,2)+size(a_rand,2)-1)) = a_rand;
  139.         end
  140.     end
  141.    
  142.     %zmiana pokolenia
  143.     pop = newpop;
  144.    
  145.     %elitaryzm
  146.     pop(nosobnikow,:) = besttrasa;
  147.    
  148.     if mod(epoka,showInterval) == 0
  149.         %wyswietlenie najlepszego (trasa)
  150.         %wyczyszczenie poprzedniej trasy
  151.         set(0,'CurrentFigure',h1)
  152.         clf(h1);          
  153.         %narysowanie nowej
  154.         plot(xy(:,1),xy(:,2),'ro');
  155.         line([xy(besttrasa,1)' xy(besttrasa(1),1)],[xy(besttrasa,2)' xy(besttrasa(1),2)])
  156.         axis([0 10 0 10])
  157.  
  158.         set(0,'CurrentFigure',h2)
  159.         plot(historia(1:epoka))
  160.         title('Zmiana długości trasy najlepszego osobnika w kolejnych populacjach.');
  161.         xlabel('Epoka');
  162.         ylabel('Długość trasy');
  163.         pause(0.01)
  164.     end
  165. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement