1原理:
根據鳥類尋食的仿生學,結合個體的最優解和群體的最優解不斷地迭代來尋找區域的最優解。
在N維的目標空間中,有m個粒子組成一個群體,
第i個粒子的位置表示為:
每個位置對應一個潛在解,把
代入適應函數中即可得到對應的適應值。
粒子個體經過的最好的位置為:
整個群體的最優位置為:
粒子i的速度為:
粒子群位置根據以下公式進行跟新:



PSO的參數選取:
粒子數m,個數越多越容易找到全局最優解,但程序耗時長。
慣性因子w,越大越容易找到全局最優解,但可能對局部的搜索能力不好
加速常數c1和c2,選取無特定規則,一般都選為1.
2程序實現
本程序可以求解一個一維上的最優解,多維可以仿照實現。
代碼:
clc,clear %% %define the function fitness=inline('(2.1*(1-x+2*x.^2).*exp(-x.^2/2))+sin(x)+x','x'); %% E0=0.001; Max_num=50; particlesize=30; c1=0.5; c2=1; w=0.3; vc=0.5; vmax=0.6; x=-5+10*rand(particlesize,1); v=1*rand(particlesize,1); %% f=fitness(x); personalbest_x=x; personalbest_f=f; [groupbest_f i]=max(personalbest_f); groupbest_x=x(i); for j=1:Max_num v=w*v+c1*rand*(personalbest_x-x)+c2*rand*(groupbest_x*ones(particlesize,1)-x); for kk=1:particlesize if v(kk)>vmax v(kk)=vmax; else if v(kk)<-vmax v(kk)=-vmax; end end end x=x+vc*v; f=fitness(x); for kk=1:particlesize if f(kk)>personalbest_f(kk) personalbest_f(kk)=f(kk); personalbest_x(kk)=x(kk); end end [groupbest_f i]=max(personalbest_f); groupbest_x=x(i); ddd(j)=groupbest_f; end str=num2str(groupbest_f) %% subplot(2,1,1) x_0=-5:0.01:5; f_0=fitness(x_0); plot(x_0,f_0,'r','linewidth',2); hold on plot(groupbest_x,groupbest_f,'b+','linewidth',6); legend('所求函數','最優解位置'); subplot(2,1,2) plot(1:Max_num,ddd,'linewidth',2); legend('最優解的變化'); xlabel('迭代次數'); ylabel(str);
注:運行時間(i5,8G,win7,64位),1s左右
程序輸出:

