由于之前写过一些粒子群算法的文章,主要是分享了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,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