粒子群优化算法(PSO)的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=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);
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,:,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,:,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,:,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
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 )
%UPDATEV Summary of this function goes here
% Detailed explanation goes here
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
--------------------------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
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