1 背景
粒子群优化算法(PSO)是一种模拟鸟群社会行为的群体搜索算法。粒子群的概念最初的意图是形象地模拟鸟群优雅而不可预测的行为,目的是发现发现鸟类同步飞行的模式,以及在最优形式重组时突然改变方向的模式。这个概念逐步演化成简单有效的优化方法。
在PSO中,个体也被称为粒子,在超维空间内粒子位置受到其他粒子的影响,是一种共生协同的方法。进行建模就是搜索过程中粒子随机的返回之前搜索过程中发现的搜索空间中成功的区域。即根据自身的经验以及群体中其他个体的经验来进行位置的调整。
2 基本粒子群优化
例子群中个体的一个基本行为是仿效领域个体的成功和自己的成功,从这个个体行为显现出来的集体行为就是在高维搜索空间发现最优区域。每个粒子代表一个潜在的解,一个群体就类似于一个种群,一个粒子类似于一个个体。粒子在多维搜索空间中飞行,会根据本身的经验以及其他粒子的经验来进行位置的调整。
令Xi(t)表示第i个粒子在第t时刻在搜索空间中的位置,t是离散的时间步,粒子的位置通过对当前位置增加加速度Vi(t)来改变,即
Xi(t+1)=Xi(t)+Vi(t+1); 其中Xi(0)~U(Xmin,Xmax)
很明显,驱动优化过程的是速度向量,速度向量反映了粒子的经验知识和粒子邻域的社会交换信息。经验知识通常被称为认知部分,与粒子从最开始到目前找到过的最佳位置(个体最佳位置)的距离成正比,社会交换信息被称为速度方程的社会部分。
根据领域大小的不同,提出了两个PSO算法,一个是全局最佳粒子群优化算法(gbest PSO),另一个是局部最佳粒子群优化(lbest PSO).。两种算法的区别在于获取社会信息的范围,对应到算法中也就是粒子速度公式中社会部分的差别。全局最佳也就是使用粒子群中所有粒子的信息(所有粒子中最好的那个的信息);局部最佳也就是相应粒子邻域的信息,反映了局部环境的知识。
3 伪代码
while 迭代数<最大迭代数
遍历每个粒子
根据相应的公式更新速度以及位置
记录每个粒子的最优信息
记录所有粒子的最优信息
end
4 实现粒子群算法的matlab代码如下
function [xm ,fv ] = PSO( fitness,N,c1,c2,w,M,D )
%% 参数 fitness为待优化的目标函数(适应度函数),N为粒子数目,c1,c2为学习因子(即各部分的贡献度,相当于加了一个权重)
% w为惯性权重,M为最大迭代数,D为自变量的个数(相当于维度)
%% 结果:xm 为目标函数取最小值时候的自变量,fv是目标函数的最小值
%%
%初始化位置以及速度
format long; %有效数字16位
for i=1:N
for j=1:D
x(i,j)=randn;%随机初始化位置
v(i,j)=randn;%随机初始化速度
end
end
%计算每个粒子的适应度
for i=1:N
p(i)=fitness(x(i,:));
y(i,:)=x(i,:);
end
pg=x(N,:); %pg全局最优
for i=1:(N-1)
if fitness(x(i,:)) <fitness(pg) %%根据适应度函数以及需求进行符号的选取(<,>)
pg=x(i,:);
end
end
%按照公式进行迭代,直到满足精度要求
for t=1:M
for i=1:N %更新速度、位置
v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));%rand产生[0,1]上的均匀值,服从均匀分布
x(i,:)=x(i,:)+v(i,:);
if fitness(x(i,:)) <p(i)
p(i)=fitness(x(i,:));
y(i,:)=x(i,:);%个体历史最优进行更新
end
if(p(i)<fitness(pg)) %%根据情况判断符号的选取
pg=y(i,:);%全局最优进行更新
end
end
Pbest(t)=fitness(pg); %历次最优适应度值
end
%%结果展示
disp('****************************')
xm=pg' %全局最优的结果
fv=fitness(pg) %最优结果的适应度值
end
在解决实际的问题时,对适应度函数进行设定,进行方法调用即可。
在对个体经验以及社会经验进行系数(贡献重要度)设定的时候要进行合理的设置才能达到理想的效果。