PSO粒子群算法及matlab實現


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左右

程序輸出:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM