1. 程式人生 > >粒子群優化演算法

粒子群優化演算法

粒子群優化演算法是模仿生物社會系統而設計的,更確切的說,是由簡單個體組成的群體與環境以及個體之間的互動行為,是一種基於群智慧方法的進化計算技術。

粒子群演算法源於鳥群捕食行為的模擬。一群鳥在一個固定的區域裡隨機搜尋區域裡唯一的一塊食物,所有的鳥都不知到食物在哪裡,但是他們知道自己當前所處的位置離食物還有多遠,那麼找到食物的最優策略是什麼呢?最簡單的方法就是搜尋離食物最近的鳥的周圍區域。

粒子群演算法從這種模型中得到啟示並用於解決優個問題。在粒子群演算法中,每個優化問題的解都是搜尋空間中的一隻鳥,我們稱之為“粒子”。所有的粒子都有一個適應值,這個適應值根據被優化的函式來確定。每個粒子還有一個速度決定它們飛行的方向和距離,這個速度根據它自己的飛行經驗和同伴的飛行經驗進行動態調整。

粒子群演算法初始化為一群隨機粒子(隨機解),然後通過迭代得到最優解。在每一次迭代過程中,粒子通過兩種經驗呢來更新自己。自己的飛行經驗就是粒子經歷過的最好位置(有最好的適應值),即本身所找到的最優解,這個解叫做個體極值。同伴的飛行經驗是群體所有粒子經過的最好位置,即整個種群目前找到的最優解,這個解叫做全域性極值。另外也可以不用整個群體,而只用其中一部分作為粒子的鄰居,那麼在所有鄰居中的極值就是區域性極值。

利用粒子群演算法計算下列函式在區間【-400,400】的最大值:

f(x,y)=0.5+[\frac{sin^{2}\sqrt{x^{2}+y^{2}}-0.5}{1+0.001(x^{2}+y^{2})^{2}}]

clear all;
close all;
n=1500;m=100;
c1=2;c2=2;
vmax=[10,10];
alpha=0.5;
w=1;
x=800*rand(m,2)-400;
v=zeros(m,2);
f1=inline('-0.5+((sin(sqrt(x(:,1).^2+x(:,2).^2))).^2-0.5)./((1+0.01.*(x(:,1).^2+x(:,2).^2)).^2)','x');
p=x;j=1;
[ft,it]=min(f1(x));
pg=x(it,:);
while i<=n
    ftemp=f1(x);
    vt=w*v+c1*rand*(p-x)+c2*rand([pg(1)-x(:,1),pg(2)-x(:,2)]);
    v=[(vt(:,1)<vmax(1)).*vt(:,1)+vt(:,1)+(vt(:,1)>=vmax(1))*vmax(1),(vt(:,2)<vmax(2)).*vt(:,2)+(vt(:,2)>=vmax(2))*vmax(2)];
    x=x+alpha*v;
    iit=find(f1(x)-ftemp<0);
    [ftemp,it]=min(f1(x));
    pgtemp=x(it,:);
    pg=(ft<ftemp)*pg+(ft>ftemp)*pgtemp;
    p(iit,:)=x(iit,:);
    i=i+1;
end
x=pg,f=ftemp
    

執行程式,輸出如下:

x = 

    1.0e-008*-0.00854074563935        0.746613355488466

f =

    -1

求得函式最大值為-1.