由于之前写过一些粒子群算法的文章,主要是分享了Matlab的源代码,但没有具体算例,可能对一些刚开始了解粒子群算法的人来说不太容易理解和实践。最近有网友针对具体问题咨询我粒子群算法的问题,于是在征得对方同意后将这个算例分享出来,希望可以帮助更多的人。
本文中所用的源程序是从之前分享过的MATLAB源程序中修改得到的,下面是链接:
文章连接:http://aaron8967.blog.51cto.com/6177488/1047217
修改后的程序文件:见本文附件
问题:
数学规划模型min(x)=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)最小的x1和x2即可
说明:
在原程序中的变量对应关系
Index:种群中粒子的编号
Iter:迭代次数
particle(index,1,iter):即求解问题中的x1
particle(index,2,iter):即求解问题中的x2
所求的结果存于gbest矩阵中,每迭代一次存储一次结果,结构为(x1, x2, min(x))
程序的所有运行结果存于文件ResultFinalGbest和ResultHistoryGbest
结果:
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,:,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,:,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,:,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 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 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