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

程序输出:

原文地址:https://www.cnblogs.com/jacksin/p/8830787.html