由于之前写过一些粒子群算法的文章,主要是分享了Matlab的源代码,但没有具体算例,可能对一些刚开始了解粒子群算法的人来说不太容易理解和实践。最近有网友针对具体问题咨询我粒子群算法的问题,于是在征得对方同意后将这个算例分享出来,希望可以帮助更多的人。

本文中所用的源程序是从之前分享过的MATLAB源程序中修改得到的,下面是链接:

文章连接:http://aaron8967.blog.51cto.com/6177488/1047217

修改后的程序文件:见本文附件

问题:

数学规划模型minx=10*x1+3*x2+15*x3

约束条件是x1+x2+x3=200,x1,x2,x3都大于零

可以理解为要求得使min(x)最小的x1, x2, x3的取值

求解:

根据x1+x2+x3=200,可以将问题降维

x3=200-x1-x2,x3>0,

min(x)=10*x1+3*x2+15*(200-x1-x2)=3000-5*x1-12*x2,

约束条件为200>x1>0,200>x2>0,x1+x2<200,

即只要求得使min(x)最小的x1x2即可

说明:

在原程序中的变量对应关系

Index:种群中粒子的编号

Iter:迭代次数

particle(index,1,iter):即求解问题中的x1

particle(index,2,iter):即求解问题中的x2

所求的结果存于gbest矩阵中,每迭代一次存储一次结果,结构为(x1, x2, min(x)

程序的所有运行结果存于文件ResultFinalGbestResultHistoryGbest

结果:

PSO的近似结果为:

min(x)=689

x1=11,x2=188,x3=1

程序:

—————————————Fitness.m—————————————

function [ f ] = Fitness( particle,index,iter )

%FITNESS Summary of this function goes here

%   Detailed explanation goeshere

%f=100*(particle(index,2,iter)-particle(index,1,iter)^2)^2+(particle(index,1,iter)-1)^2;

f=3000-5*particle(index,1,iter)-12*particle(index,2,iter);

end


—————————————main.m—————————————

clear all;

%设置数据格式

format long;

%设置粒子群算法参数

max_iteration=1000;%最大迭代次数

swarm_size=200;%种群规模(粒子数量)

particle_size=2;%粒子维数(求解变量个数)

particle_min=[0,0]; %粒子各维最小值

particle_max=[200,200];%粒子各维最大值

velocity_min=1; %粒子速度最小值

velocity_max=10; %粒子速度最大值

c1=1.3; %学习因子C1

c2=1.3; %学习因子C2

%初始化粒子群算法变量

fitness_size=particle_size+1; %位置及适应度结合矩阵维数

particle=zeros(swarm_size,fitness_size,max_iteration); %粒子群位置及适应度矩阵

velocity=zeros(swarm_size,particle_size,max_iteration); %粒子群速度矩阵

pbest=zeros(swarm_size,fitness_size,max_iteration); %局部最优粒子位置及适应度矩阵

gbest=zeros(1,fitness_size,max_iteration); %全局最优粒子位置及适应度矩阵

%初始化粒子群

%初始化迭代数

z=1;

%%%%%%%%初始化粒子群的位置,速度和适应度

for x=1:swarm_size

        for y=1:particle_size

      particle(x,y,z)=(particle_min(y)+(particle_max(y)-particle_min(y))*rand);

       if(particle(x,1,z)+particle(x,2,z))>200

         particle(x,2,z)=200-particle(x,1,z);

       end

      velocity(x,y,(z+1))=velocity_max*rand;

       %粒子位置更新函数UpdateP(particle,velocity,index,dimen,iter,particle_min,particle_max )

      particle(x,y,(z+1))=UpdateP(particle,velocity,x,y,z,particle_min,particle_max);

   end

        if(particle(x,1,z+1)+particle(x,2,z+1))>200

      particle(x,2,z+1)=200-particle(x,1,z+1);

        end

        %适应度函数Fitness(particle,index,iter )

        particle(x,fitness_size,z)=Fitness(particle,x,z);

end

%%%%%%%%初始化局部最优粒子的位置和适应度

pbest(:,:,z)=particle(:,:,z);

%%%%%%%%初始化全局最优粒子的位置和适应度

gbest(1,:,z)=pbest(1,:,z);

for x=1:swarm_size

        if pbest(x,fitness_size,z)<gbest(1,fitness_size,z)

      gbest(1,:,z)=pbest(x,:,z);

   end

end


%%%%迭代

for z=2:max_iteration

%评价粒子

        for x=1:swarm_size

       %适应度函数Fitness(particle,index,iter )??

      particle(x,fitness_size,z)=Fitness(particle,x,z);

       ifparticle(x,fitness_size,z)<pbest(x,fitness_size,(z-1))

          pbest(x,:,z)=particle(x,:,z);

       else

          pbest(x,:,z)=pbest(x,:,(z-1));

       end

   end

        for x=1:swarm_size

       ifpbest(x,fitness_size,z)<gbest(1,fitness_size,(z-1))

          gbest(1,:,z)=pbest(x,:,z);

       else

          gbest(1,:,z)=gbest(1,:,(z-1));

       end

        end

%更新粒子

        for x=1:swarm_size

       for y=1:particle_size

           %粒子速度更新函数

%UpdateV( particle,velocity,pbest,gbest,index,dimen,iter,velocity_min,velocity_max,c1,c2)

          velocity(x,y,(z+1))=UpdateV(particle,velocity,pbest,gbest,x,y,z,velocity_min,velocity_max,c1,c2);

           %粒子位置更新函数UpdateP(particle,velocity,index,dimen,iter,particle_min,particle_max )

           particle(x,y,(z+1))=UpdateP(particle,velocity,x,y,z,particle_min,particle_max);

       end

       if(particle(x,1,z+1)+particle(x,2,z+1))>200

         particle(x,2,z+1)=200-particle(x,1,z+1);

       end

        end

end

%%%%数据处理

DataManage(particle,velocity,pbest,gbest,max_iteration,swarm_size,particle_size,fitness_size);

—————————————UpdateP.m—————————————

function [ p ] = UpdateP(particle,velocity,index,dimen,iter,particle_min,particle_max )

%UPDATEP Summary of this function goes here

%   Detailed explanation goeshere

p=particle(index,dimen,iter)+velocity(index,dimen,(iter+1));

%限制位置

if p>particle_max(dimen)

 p=particle_max(dimen)-(0.3e-10);%(0.3e-10)防止位置固定在上边界

end

if p<particle_min(dimen)

  p=particle_min(dimen)+(0.7e-10);%(0.7e-10)防止位置固定在下边界

end

if dimen==2

  if(p+particle(index,1,iter+1))>200

     p=200-particle(index,1,iter);

  end

end

end

—————————————UpdateV.m—————————————

function [ v ] = UpdateV(particle,velocity,pbest,gbest,index,dimen,iter,velocity_min,velocity_max,c1,c2)

%UPDATEV Summary of this function goes here

%   Detailed explanation goeshere

r1=rand;

r2=rand;

v=velocity(index,dimen,iter)+c1*r1*(pbest(index,dimen,iter)-particle(index,dimen,iter))+c2*r2*(gbest(1,dimen,iter)-particle(index,dimen,iter));

%限制速度

if v>velocity_max

  v=velocity_max-(0.3e-10);%(0.3e-10)防止速度固定在上边界

end

if v<velocity_min

  v=velocity_min+(0.7e-10);%(0.7e-10)防止速度固定在下边界

end

end

—————————————DataManage—————————————

function [ ] = DataManage(particle,velocity,pbest,gbest,max_iteration,swarm_size,particle_size,fitness_size)

%DATAMANAGE Summary of this function goes here

%   Detailed explanation goeshere


temp=zeros(1,fitness_size);

for k=1:max_iteration

   temp(1,:)=gbest(1,:,k);

  save('ResultHistoryGbest','temp','-ascii','-tabs','-append');

end

temp(1,:)=gbest(1,:,max_iteration);

save('ResultFinalGbest','temp','-ascii','-tabs','-append');

end