Advertisement
Pagoniusz

Gutowiec?

Mar 19th, 2015
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 3.44 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.5;%UZUPEŁNIJ       %p-wo mutacji
  20. pCross = 0.3;%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. newpop = zeros(size(pop));
  28.  
  29.  
  30. maxepochs = 10000;
  31. historia = zeros(1,maxepochs);
  32.  
  33. %wyświetlenie dwóch okien obok siebie
  34. h1 = gcf;
  35. set(h1,'Units','normalize');
  36. outerpos = get(h1,'OuterPosition');
  37. outerpos(1) = (1-2*outerpos(3))/2;
  38. set(h1,'OuterPosition',outerpos);
  39. h2 = figure;
  40. set(h2,'Units','normalize');
  41. outerpos(1) = (1-2*outerpos(3))/2+outerpos(3);
  42. set(h2,'OuterPosition',outerpos);
  43.  
  44. showInterval = 50;
  45.  
  46. %główna pętla algorytmu
  47. for epoka=1:maxepochs
  48.    
  49.     %ocena
  50.     dlugosciTras = zeros(1,nosobnikow); %sumowanie wartosci z macierzy tras
  51.    
  52.    
  53.     for i=1:nosobnikow
  54.         for j=1:(nmiast-1)
  55.             dlugosciTras(i)=dlugosciTras(i)+odleglosci(pop(i,j),pop(i,j+1));
  56.         end
  57.         dlugosciTras(i)=dlugosciTras(i)+odleglosci(pop(i,j+1),pop(i,1));
  58.     end
  59.    
  60.    
  61.    
  62.    
  63.    
  64.     %znalezienie i zapisanie najlepszej trasy (dla elitaryzmu)
  65.     [historia(epoka),bestidx] = min(dlugosciTras);
  66.     besttrasa = pop(bestidx,:);
  67.    
  68.    
  69.     %selekcja turniejowa (lub ruletkowa) %k=populacja
  70.     for i=1:nosobnikow
  71.         idx=randi(nosobnikow);
  72.         idx2=randi(nosobnikow);
  73.         if(dlugosciTras(idx)<dlugosciTras(idx2))
  74.             newpop(i,:)=pop(idx,:);
  75.         else
  76.             newpop(i,:)=pop(idx2,:);
  77.         end
  78.     end
  79.    
  80.     %UZUPEŁNIJ TUTAJ (newpop uzupełniona wyselekcjonowanymi osobnikami z pop)
  81.    
  82.     %krzyzowanie
  83.     for n = 1:ceil(pCross*nosobnikow/2)
  84.         %[newpop(2*n-1,:), newpop(2*n,:)] = ...
  85.             orderedCrossover(newpop(2*n-1,:), newpop(2*n,:), nmiast);
  86.     end
  87.    
  88.    
  89.     %mutacje
  90.    
  91.     %mutacja rodzaj 1 (switching)
  92.     %np. [1 2 3 4 5 6] -> [1 5 3 4 2 6]
  93.    
  94.     for i=1:ceil(pMut*nosobnikow)
  95.         idx=randi(nmiast);
  96.         idx2=randi(nmiast);
  97.         tmp=newpop(i,idx);
  98.         newpop(i,idx)=newpop(i,idx2);
  99.         newpop(i,idx2)=tmp;
  100.     end
  101.    
  102.     %UZUPEŁNIJ TUTAJ
  103.    
  104.     %mutacja rodzaj 2 (inversion) %fliplr
  105.     %np. [1 2 3 4 5 6] -> [1 5 4 3 2 6]
  106.    
  107.     %UZUPEŁNIJ TUTAJ
  108.    
  109.     %mutacja rodzaj 3 (translation) %przesuwanie
  110.     %np. [1 2 3 4 5 6] -> [1 5 6 2 3 4]
  111.    
  112.     %UZUPEŁNIJ TUTAJ
  113.    
  114.    
  115.     %zmiana pokolenia
  116.     pop = newpop;
  117.    
  118.     %elitaryzm
  119.     pop(nosobnikow,:) = besttrasa;
  120.    
  121.     if mod(epoka,showInterval) == 0
  122.         %wyswietlenie najlepszego (trasa)
  123.         %wyczyszczenie poprzedniej trasy
  124.         set(0,'CurrentFigure',h1)
  125.         clf(h1);          
  126.         %narysowanie nowej
  127.         plot(xy(:,1),xy(:,2),'ro');
  128.         line([xy(besttrasa,1)' xy(besttrasa(1),1)],[xy(besttrasa,2)' xy(besttrasa(1),2)])
  129.         axis([0 10 0 10])
  130.  
  131.         set(0,'CurrentFigure',h2)
  132.         plot(historia(1:epoka))
  133.         title('Zmiana długości trasy najlepszego osobnika w kolejnych populacjach.');
  134.         xlabel('Epoka');
  135.         ylabel('Długość trasy');
  136.         pause(0.01)
  137.     end
  138. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement