粒子群算法

粒子群优化(Particle Swarm Optimization, PSO)算法是Kennedy和Eberhart受人工生命研究结果的启发、通过模拟鸟群觅食过程中的迁徙和群聚行为而提出的一种基于群体智能的全局随机搜索算法,1995年IEEE国际神经网络学术会议发表了题为―Particle Swarm Optimization的论文,标志着PSO算法诞生(注:国内也有很多学者译为―微粒群优化)。它与其他进化算法一样,也是基于种群和进化的概念,通过个体间的协作与竞争,实现复杂空间最优解的搜索;同时,PSO又不像其他进化算法那样对个体进行交叉、变异、选择等进化算子操作,而是将群体(swarm)中的个体看作是在D维搜索空间中没有质量和体积的粒子(particle),每个粒子以一定的速度在解空间运动,并向自身历史最佳位置pbest和邻域历史最佳位置gbest聚集,实现对候选解的进化。PSO算法具有很好的生物社会背景而易理解、参数少而易实现,对非线性、多峰问题均具有较强的全局搜索能力,在科学研究与工程实践中得到了广泛关注。

算法原理 

PSO从这种模型中得到启示并用于解决优化问题。PSO 中,每个优化问题的潜在解都是搜索空间中的一只鸟,称之为粒子。所有的粒子都有一个由被优化的函数决定的适值( fitness value) ,每个粒子还有一个速度决定它们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索。 
PSO初始化为一群随机粒子(随机解),然后通过迭代找到最优解。在每一次迭代中,粒子通过跟踪两个极值来更新自己;第一个就是粒子本身所找到的最优解pbest,这个解称为个体极值;另一个极值是整个种群目前找到的最优解gbest,这个极值是全局极值。另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值。 
假设在一个D维的目标搜索空间中,有N个粒子组成一个群落,其中第i个粒子表示为一个D维的向量 

Xi=(xi1,xi2,…,xiD),i=1,2,…,N。

Xi代表当前粒子在搜索空间中所处的位置,代表一个解。

第i个粒子的“飞行 ”速度也是一个D维的向量,记为 
Vi=(vi1,vi2,…,viD),i=1,2,…,N。

vi1代表i粒子在D维空间第一维上的速度分量。Vi决定了i粒子在这一次搜索中移动的方向和距离。

第i个粒子迄今为止搜索到的最优位置称为个体极值,记为 
Pbest(pi1,pi2,…,piD),i=1,2,…,N。 
整个粒子群迄今为止搜索到的最优位置为全局极值,记为 
gbest(pg1,pg2,…,pgD)

在找到这两个最优值时,粒子根据如下的公式(1)和(2)来更新自己的速度和位置[12]: 
Vid=w*Vid+c1* γ1(pid-xid)+c2*γ2(pgd-xid)       (1)
xid=xid+vid                                                                  (2) 
其中:c1和c2为学习因子,也称加速常数(acceleration constant),γ1和γ2为[0,1]范围内的均匀随机数。式(1)右边由三部分组成,第一部分为―惯性(inertia)‖或―动量(momentum)部分,反映了粒子的运动,代表粒子有维持自己先前速度的趋势;第二部分为―认知(cognition)部分,反映了粒子对自身历史经验的记忆(memory)或回忆(remembrance),代表粒子有向自身历史最佳位置逼近的趋势;第三部分为―社会(social)部分,反映了粒子间协同合作与知识共享的群体历史经验,代表粒子有向群体或邻域历史最佳位置逼近的趋势,根据经验,通常c1=c2=2。vid是粒子的速度,vid在[-Vmax,Vmax]之间,Vmax是常数,由用户设定用来限制粒子的速度。γ1γ2是介于[0,1]之间的随机数。

整个求解过程中,惯性权重w、加速因子c1和c2和最大速度vmax共同维护粒子对全局和局部搜索能力的平衡。

基本粒子群算法流程 

算法的流程如下: 
① 初始化粒子群,包括群体规模N,每个粒子的位置xi和速度Vi

② 计算每个粒子的适应度值Fit[i]; 

③ 对每个粒子,用它的适应度值Fit[i]和个体极值pbest[i]比较,如果Fit[i]>pbest[i] ,则用Fit[i]替换掉pbest[i];

④ 对每个粒子,用它的适应度值Fit[i]和全局极值gbest比较,如果Fit[i]>gbest,则用Fit[i]替换掉gbest; 

⑤ 根据公式(1),(2)更新粒子的速度vi和位置xi ; 

⑥ 如果满足结束条件(误差足够好或到达最大循环次数)退出,否则返回②。


最大速度Vmax

最大速度的选择:Vmax增大,有利于全局探索(global exploration);Vmax减小,则有利于局部开发(local exploitation)。但是Vmax过高,粒子运动轨迹可能失去规律性,甚至越过最优解所在区域,导致算法难以收敛而陷入停滞状态;相反Vmax太小,粒子运动步长太短,算法可能陷入局部极值。Vmax的选择通常凭经验给定,并一般设定为问题空间的10%~20% 。此外,还有动态调节方法以改善算法性能;Vmax自适应于群体最佳和最差适应度值maxv的选择方法。

权值W

权值w将影响PSO 的全局与局部搜优能力,w值较大,全局搜优能力强,局部搜优能力弱;反之,则局部搜优能力增强,而全局搜优能力减弱。所以通常惯性因子w不是常数值,而是一个随着迭代渐变的数值。迭代初始惯性因子w的值较大,使算法有较强的全局搜索能力,在整个解空间内搜索可行解;惯性因子w随着迭代代数增加逐步减小,使算法在迭代后期局部搜索能力增强全局搜索能力减弱以加速收敛到已搜索到的最优解。


matlab代码

function [xm,fv] = PSO(fitness,N,c1,c2,w,M,D)

format long;

%------初始化种群的个体------------

for i=1:N

    for j=1:D

        x(i,j)=randn;  %随机初始化位置

        v(i,j)=randn;  %随机初始化速度

    end

end

%------先计算各个粒子的适应度,并初始化Pi和Pg----------------------

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

        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
xm = pg';
fv = fitness(pg);





版权声明:

posted on 2015-04-13 22:09  moffis  阅读(567)  评论(0编辑  收藏  举报

导航