改进粒子群优化算法(MPSO)MATLAB源程序

作者:aaron8967    主页:http://aaron8967.blog.51cto.com

说明:粒子群优化算法(Particle Swarm Optimization, PSO)是群智能优化算法之一,具有便于实现和收敛速度快等优点。本人在研究这个算法的时候,编写了一些测试的MATLAB源程序,在此分享,以供学习交流之用。这个是引入附加学习粒子的粒子群优化算法。

文件结构:

         主函数:main.m

         适应度函数:Fitness.m

         速度更新函数:UpdateV.m

         粒子更新函数:UpdateP.m

         数据处理函数:DataManage.m

源代码:

---------------------------main.m---------------------------

clear all;

%设置数据格式

format long;

%设置粒子群算法参数

max_iteration=1000;         %最大迭代次数

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

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

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

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

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

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

c1=2.05;                     %学习因子C1

c2=2.05;                     %学习因子C2

c3=0.3;                      %学习因子C3

%初始化粒子群算法变量

phai=c1+c2;

lamda=2/abs(2-phai-sqrt(phai^2-4*phai));

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);

        velocity(x,y,(z+1))=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

    %适应度函数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); 

        if particle(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

        if pbest(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,c3,lamda,swarm_size);

            %粒子位置更新函数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

    end

end

%%%%数据处理

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

--------------------------Fitness.m--------------------------

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

%FITNESS Summary of this function goes here

%   Detailed explanation goes here

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

end

--------------------------UpdateV.m--------------------------

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

%UPDATEV Summary of this function goes here

%   Detailed explanation goes here

r1=rand;

r2=rand;

r3=rand;

r=floor(swarm_size*rand);

if r==0

   r=1;

end

 

v=lamda*(velocity(index,dimen,iter)+c1*r1*(pbest(index,dimen,iter)-particle(index,dimen,iter))+c2*r2*(gbest(1,dimen,iter)-particle(index,dimen,iter))+c3*r3*(particle(r,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

--------------------------UpdateP.m--------------------------

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

%UPDATEP Summary of this function goes here

%   Detailed explanation goes here

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

end

--------------------------DataManage.m--------------------------

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

%DATAMANAGE Summary of this function goes here

%   Detailed explanation goes here

 

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

 

本文是原创文章,转载请保留原作者和出处信息。

由于个人水平有限,不足之处还望多多包涵,欢迎批评指正。

                                                                                                       By  aaron8967