środa, 4 lutego 2015

Algorytm Rojowy PSO

Pisałem już o ewolucyjnym, to czemu mam nie naskrobać coś o rojowym. Moja implementacja tego algorytmu szuka minimum funkcji, lecz trochę inaczej. W skrócie istnieje rój pszczółek, który szuka swojego ulubionego kwiatka (mógłbym użyć much ale wiadomo do czego one się zlatują :) ). Kwiatkiem tym jest oczywiście minimum, a pszczółkami wartości punktów. Do rzeczy funkcja wygląda tak:
Rys. 1.1 Wykres badanej funkcji

Gdy pokazywałem ją znajomym wielu jej kształt zaskakiwał, ja zaś widziałem w niej niezłe pole do popisu dla moich pszczółek, które latają tak:


 


Jak widać zlatują się idealnie do minimum funkcji. Poniżej jeszcze kilka wykresów z działania programu:




Wykresów nie opisuje, to co prezentują jest wręcz identyczne do tego, co opisywałem w algorytmie ewolucyjnym. Serdecznie zapraszam do przeczytania tego posta. Pszczółki latają wszystko fajnie ale jak to się dzieje. Otóż wszystko zaczyna się od umieszczenia punktu w przestrzeni, a dokładnie kilkunastu zwanych - rojem. Mamy już punkty więc liczymy wartości funkcji dla każdego z nich. Wartość najmniejsza jest to cel podążania. Jednak nie jest to proste bo wchodzą tutaj w grę jeszcze trzy poziomy ufności:
- zaufanie pszczółki do swojego kierunku
- zaufanie pszczółki do swojego najlepszego rozwiazania
-zaufanie pszczółki do najlepszego rozwiązania w roju
Po opisaniu tego konkretnymi równaniami otrzymujemy wektor prędkości, dzięki niemu pszczółka wie gdzie ma lecieć. chyba najlepiej widać to na zamieszczonym "filmie"

Generalnie prezentuję moją implementację kodu, zaś teorie samych algorytmów napiszę w najbliższym czasie.

Pozdrawiam..

P.S Nauczyłem się wstawiać kod poniżej, choć opcja nie jest profesjonalna (Blogger jest dość toporny w wstawianiu kodu źródłowego).

A oto Kod


Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. clear all
  2. clc
  3. % Algorytm PSO
  4.  
  5. %Definicje
  6.  
  7. dg      = -5.12;    % dolna graica przedizału
  8. gg      =  5.12;    % górna granica przedizału
  9. krok    =  0.01;
  10.  
  11. osob    =  1000;      % ilość osobników w roju
  12.  
  13. ile     =  30;      % ilość wymiarów
  14.  
  15. % Poziomy ufności
  16.  
  17. c1      = 0.3;      % zaufanie do własnego kierunku
  18. c2      = 0.4;      % zaufanie swojej najlepszej pozycji
  19. c3      = 0.7;      % zaufanie najlepszej pozycji sąsidów
  20.  
  21. % Prędkość początkowa
  22. V(1,:)  = [0,0];
  23.  
  24. max     = 100;     % ilość iteracji
  25.  
  26. %% Generacja osobników w roju
  27. X=dg:krok:gg;
  28. rozmiar=length(X);
  29. X=X';
  30. for i=1:osob
  31.  
  32.     a=randi(rozmiar,1);
  33.     os(i,1)=X(a,:);
  34.     a=randi(rozmiar,1);
  35.     os(i,2)=X(a,:);
  36.    
  37. end
  38.  
  39. for k=1:max
  40. %% Wylicznie wartości funkcji
  41.  
  42. for i=1:osob
  43.     a = os(i,1)^2;
  44.     b = os(i,2)^2;
  45.     c = cos(2*pi*os(i,1));
  46.     d = cos(2*pi*os(i,2));
  47.     os(i,3)= ((a-(c*ile))+(b-(d*ile)));
  48.    
  49. end
  50.  
  51. plot3(os(:,1),os(:,2),os(:,3),'ro')
  52. title('Położenie osobników')
  53. %plot(os(:,1),os(:,2),'ro') % kontrola
  54.  
  55. %% Wybór najlepszego osobnika
  56. nr=0;
  57. M=os(:,3)';
  58. b=min(M);
  59. for i=1:osob
  60.        
  61.         if os(i,3) == b
  62.             nr = i;
  63.         end
  64.      
  65. end
  66. %% Przkazanie danych o najlepszym rozwiazaniu danej iteracji
  67.  
  68. X(k,:)=os(nr,1);
  69. Y(k,:)=os(nr,2);
  70. Z(k,:)=os(nr,3);
  71.  
  72. %% Zapis Najlepszego ogólnego położenia
  73. if k == 1
  74.     opti=Z(k,:);
  75.     px=X(k,:);
  76.     py=Y(k,:);
  77. end
  78.  
  79. if k > 1
  80.     if Z(k,:) < opti
  81.         opti=Z(k,:);
  82.         px=X(k,:);
  83.         py=Y(k,:);
  84.     else
  85.         opti=opti;
  86.         px=px;
  87.         py=py;
  88.     end
  89. end
  90.  
  91.    
  92. %% Nadanie prędkości
  93. for i=1:osob
  94.     r1  = rand(1,1);
  95.     r2  = rand(1,1);
  96.     r3  = rand(1,1);
  97.     ax   = c1*r1*V(i,1);
  98.     ay   = c1*r1*V(i,2);
  99.     bx   = c2*r2*(X(k,:)-os(i,1));
  100.     by   = c2*r2*(Y(k,:)-os(i,2));
  101.     c   =  c3*r3*(px-py);
  102.     u=i+1;
  103.     V(u,1)=ax+bx+c;
  104.     V(u,2)=ay+by+c;
  105. end
  106. %% Aktualizacja położenia
  107.  
  108. for i=1:osob
  109.  
  110.     os(i,1) =   os(i,1)+V(i+1,1);    
  111.     os(i,2) =   os(i,2)+V(i+1,2) ;  
  112.     drawnow
  113.  
  114. end
  115.  
  116. OP(k,:)=opti;
  117. czas(k,:)=k;
  118. pp(k,:)=px;
  119. ppp(k,:)=py;
  120. end
  121.  
  122. rysuj
  123. disp('Znalazłem min o wartości')
  124. disp(opti)
  125. disp('w')
  126. disp(px)
  127. disp(py)
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. %% Program rysuje Wykresy funkcji
  2. global dg gg krok
  3. [X,Y] = meshgrid(dg:krok:gg);
  4. z=((X.^2)-(cos(X.*2*pi))+(Y.^2)-(cos(Y.*2*pi)));
  5. surfc(X,Y,z);
  6. figure
  7. %% Wartości osobników
  8. subplot(2,1,1)
  9. semilogx(stan,pkt1)
  10. title('Wartość osobnika w każdym pokoleniu')
  11. xlabel('Pokolenie')
  12. ylabel('Wartość osbnika jeden')
  13. subplot(2,1,2)
  14. semilogx(stan,pkt2)
  15. xlabel('Pokolenie')
  16. ylabel('Wartość osbnika dwa')
  17.  
  18. %% Wartosci funkcji
  19. figure
  20. loglog(stan,Op)
  21. title('Wartość funkcji w każdym pokoleniu')
  22. xlabel('Pokolenie')
  23. % ylabel('Wartość funkcji')


Brak komentarzy:

Prześlij komentarz