粒子群优化的算法原理

2024-05-05 22:57

1. 粒子群优化的算法原理

 PSO算法是基于群体的,根据对环境的适应度将群体中的个体移动到好的区域。然而它不对个体使用演化算子,而是将每个个体看作是D维搜索空间中的一个没有体积的微粒(点),在搜索空间中以一定的速度飞行,这个速度根据它本身的飞行经验和同伴的飞行经验来动态调整。第i个微粒表示为Xi = (xi1, xi2, …, xiD),它经历过的最好位置(有最好的适应值)记为Pi = (pi1, pi2, …, piD),也称为pbest。在群体所有微粒经历过的最好位置的索引号用符号g表示,即Pg,也称为gbest。微粒i的速度用Vi = (vi1, vi2, …, viD)表示。对每一代,它的第d维(1 ≤ d ≤ D)根据如下方程进行变化:vid = w∙vid+c1∙rand()∙(pid-xid)+c2∙Rand()∙(pgd-xid) (1a)xid = xid+vid其中w为惯性权重(inertia weight),c1和c2为加速常数(acceleration constants),rand()和Rand()为两个在[0,1]范围里变化的随机值。此外,微粒的速度Vi被一个最大速度Vmax所限制。如果当前对微粒的加速导致它的在某维的速度vid超过该维的最大速度vmax,d,则该维的速度被限制为该维最大速度vmax,d。对公式(1a),第一部分为微粒先前行为的惯性,第二部分为“认知(cognition)”部分,表示微粒本身的思考;第三部分为“社会(social)”部分,表示微粒间的信息共享与相互合作。“认知”部分可以由Thorndike的效应法则(law of effect)所解释,即一个得到加强的随机行为在将来更有可能出现。这里的行为即“认知”,并假设获得正确的知识是得到加强的,这样的一个模型假定微粒被激励着去减小误差。“社会”部分可以由Bandura的替代强化(vicarious reinforcement)所解释。根据该理论的预期,当观察者观察到一个模型在加强某一行为时,将增加它实行该行为的几率。即微粒本身的认知将被其它微粒所模仿。PSO算法使用如下心理学假设:在寻求一致的认知过程中,个体往往记住自身的信念,并同时考虑同事们的信念。当其察觉同事的信念较好的时候,将进行适应性地调整。 a). 初始化一群微粒(群体规模为m),包括随机的位置和速度;b). 评价每个微粒的适应度;c). 对每个微粒,将它的适应值和它经历过的最好位置pbest的作比较,如果较好,则将其作为当前的最好位置pbest;d). 对每个微粒,将它的适应值和全局所经历最好位置gbest的作比较,如果较好,则重新设置gbest的索引号;e). 根据方程(1)变化微粒的速度和位置;f). 如未达到结束条件(通常为足够好的适应值或达到一个预设最大代数Gmax),回到b)。

粒子群优化的算法原理

2. 粒子群优化算法的介绍

粒子群优化算法又翻译为粒子群算法、微粒群算法、或微粒群优化算法。

3. 粒子群优化的算法参数

PSO参数包括:群体规模m,惯性权重w,加速常数c1和c2,最大速度Vmax,最大代数Gmax,解空间[Xmin Xmax]。Vmax决定在当前位置与最好位置之间的区域的分辨率(或精度)。如果Vmax太高,微粒可能会飞过好解,如果Vmax太小,微粒不能进行足够的探索,导致陷入局部优值。该限制有三个目的:防止计算溢出;实现人工学习和态度转变;决定问题空间搜索的粒度。惯性权重w使微粒保持运动的惯性,使其有扩展搜索空间的趋势,有能力探索新的区域。加速常数c1和c2代表将每个微粒推向pbest和gbest位置的统计加速项的权重。低的值允许微粒在被拉回来之前可以在目标区域外徘徊,而高的值导致微粒突然的冲向或者越过目标区域。如果没有后两部分,即c1 = c2 = 0,微粒将一直以当前的速度飞行,直到到达边界。由于它只能搜索有限的区域,将很难找到好的解。如果没有第一部分,即w = 0,则速度只取决于微粒当前的位置和它们历史最好位置pbest和gbest,速度本身没有记忆性。假设一个微粒位于全局最好位置,它将保持静止。而其它微粒则飞向它本身最好位置pbest和全局最好位置gbest的加权中心。在这种条件下,微粒群将统计的收缩到当前的全局最好位置,更象一个局部算法。在加上第一部分后,微粒有扩展搜索空间的趋势,即第一部分有全局搜索的能力。这也使得w的作用为针对不同的搜索问题,调整算法全局和局部搜索能力的平衡。如果没有第二部分,即c1 = 0,则微粒没有认知能力,也就是“只有社会(social-only)”的模型。在微粒的相互作用下,有能力到达新的搜索空间。它的收敛速度比标准版本更快,但是对复杂问题,比标准版本更容易陷入局部优值点。如果没有第三部分,即c2 = 0,则微粒之间没有社会信息共享,也就是“只有认知(cognition-only)”的模型。因为个体间没有交互,一个规模为m的群体等价于m个单个微粒的运行。因而得到解的几率非常小。

粒子群优化的算法参数

4. 粒子群优化的介绍

粒子群优化(),又称微粒群算法,是由J. Kennedy和R. C. Eberhart等于1995年开发的一种演化计算技术,来源于对一个简化社会模型的模拟。其中“群(swarm)”来源于微粒群符合M. M. Millonas在开发应用于人工生命(artificial life)的模型时所提出的群体智能的5个基本原则。“粒子(particle)”是一个折衷的选择,因为既需要将群体中的成员描述为没有质量、没有体积的,同时也需要描述它的速度和加速状态。

5. 最优化 粒子群法

运行结果。
function [xm,fv] = zhidaoPSO(fitness,N,c1,c2,w,M,D)
%[xm,fv] = zhidaoPSO(@fitness,40,2,2,0.8,1000,2)
%         
%         求解无约束优化问题
%         fitness         待优化目标函数
%         N         粒子数目,
%         cX         学习因子
%         W         惯性权重
%         M          最大迭代次数
%         D          自由变量的个数
%         xm          目标函数取最小值时的自由变量
%         fv          目标函数的最小值
%   Detailed explanation goes here
tic;
format long;
%------step1.初始化种群的个体------------
x = zeros(N,D);
v = zeros(N,D);
for i=1:N

    for j=1:D

        x(i,j)=100*rand - 50;  %随机初始化位置

        v(i,j)=100*rand - 50;  %随机初始化速度

    end

end

%------step2.先计算各个粒子的适应度,并初始化Pi和PgPg为全局最优-------------
p = zeros(N,1);
%y = zeros(N,D);
for i=1:N

    p(i)=fitness(x(i,:));

    %y(i,:)=x(i,:);

end
y = x;
pg = x(N,:);             %Pg为全局最优

for i=1:(N-1)

    if fitness(x(i,:))<fitness(pg)

        pg=x(i,:);

    end

end

%------step3.进入主要循环,按照公式依次迭代------------
%Pbest = zeros(M,1);
for t=1:M

    for i=1:N

        v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));
        for k=1:D
            if v(i,k) > 10 %10=vmax
                v(i,k) = 10;
            end
        end
        x(i,:)=x(i,:)+v(i,:);
        for k=1:D
            if x(i,k) > 50 %50=xmax
                x(i,k) = 31;
            end
        end

        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);
toc;

最优化 粒子群法

6. 优化算法笔记(五)粒子群算法(3)

(已合并本篇内容至粒子群算法(1))
  
 上一节中,我们看到小鸟们聚集到一个较小的范围内后,不会再继续集中。这是怎么回事呢?
   猜测:
   1.与最大速度限制有关,权重w只是方便动态修改maxV。
   2.与C1和C2有关,这两个权重限制了鸟儿的搜索行为。
   还是上一节的实验,  。现在我们将maxV的值有5修改为50,即maxV=50,其他参数不变。参数如下
                                          
 此时得到的最优位值的适应度函数值为0.25571,可以看出与maxV=5相比,结果差了很多而且小鸟们聚集的范围更大了。
     现在我们设置maxV=1,再次重复上面的实验,实验结果如下:
                                          
   这次最终的适应度函数值为,比之前的结果都要好0.00273。从图中我们可以看出,小鸟们在向一个点集中,但是他们飞行的速度比之前慢多了,如果问题更复杂,可能无法等到它们聚集到一个点,迭代就结束了。
     为什么maxV会影响鸟群的搜索结果呢?
     我们依然以maxV=50为例,不过这次为了看的更加清晰,我们的鸟群只有2只鸟,同时将帧数放慢5倍以便观察。
  
 
                                                                                                                                                                                                          
 
  
 思路一:限制鸟的最大飞行速率,由于惯性系数W的存在,使得控制最大速率和控制惯性系数的效果是等价的,取其一即可。
     方案1:使惯性系数随着迭代次数增加而降低,这里使用的是线性下降的方式,即在第1次迭代,惯性系数W=1,最后一次迭代时,惯性系数W=0,当然,也可以根据自己的意愿取其他值。
   实验参数如下:
                                          
   小鸟们的飞行过程如上图,可以看到效果很好,最后甚至都聚集到了一个点。再看看最终的适应度函数值8.61666413451519E-17,这已经是一个相当精确的值了,说明这是一个可行的方案,但是由于其最后种群过于集中,有陷入局部最优的风险。
     方案2:给每只鸟一个随机的惯性系数,那么鸟的飞行轨迹也将不再像之前会出现周期性。每只鸟的惯性系数W为(0,2)中的随机数(保持W的期望为1)。
   实验参数如下:
                                          
   可以看到小鸟们并没有像上一个实验一样聚集于一个点,而是仍在一个较大的范围内进行搜索。其最终的适应度函数为0.01176,比最初的0.25571稍有提升,但并不显著。什么原因造成了这种情况呢?我想可能是由于惯性系数成了期望为1的随机数,那么小鸟的飞行轨迹的期望可能仍然是绕着一个四边形循环,只不过这个四边形相比之前的平行四边形更加复杂,所以其结果也稍有提升,当然对于概率算法,得到这样的结果可能仅仅是因为运气不好
     我们看到惯性系数W值减小,小鸟们聚拢到一处的速度明显提升,那么,如果我们去掉惯性系数这个参数会怎么样呢。
     方案3:取出惯性系数,即取W=0,小鸟们只向着那两个最优位置飞行。
                                          
   可以看见鸟群们迅速聚集到了一个点,再看看得到的结果,最终的适应度函数值为2.9086886073362966E-30,明显优于之前的所有操作。
     那么问题来了,为什么粒子群算法需要一个惯性速度,它的作用是什么呢?其实很明显,当鸟群迅速集中到了一个点之后它们就丧失了全局的搜索能力,所有的鸟会迅速向着全局最优点飞去,如果当前的全局最优解是一个局部最优点,那么鸟群将会陷入局部最优。所以,惯性系数和惯性速度的作用是给鸟群提供跳出局部最优的可能性,获得这个跳出局部最优能力的代价是它们的收敛速度减慢,且局部的搜索能力较弱(与当前的惯性速度有关)。
     为了平衡局部搜索能力和跳出局部最优能力,我们可以人为的干预一下惯性系数W的大小,结合方案1和方案2,我们可以使每只鸟的惯性系数以一个随机周期,周期性下降,若小于0,则重置为初始值。
                                          
   这样结合了方案1和方案2的惯性系数,也能得到不错的效果,大家可以自己一试。
  
 思路二:改变小鸟们向群体最优飞行和向历史最优飞行的权重。
     方案4:让小鸟向全局最优飞行的系数C2线性递减。
                                          
   小鸟们的飞行过程与之前好像没什么变化,我甚至怀疑我做了假实验。看看最终结果,0.7267249621552874,这是到目前为止的最差结果。看来这不是一个好方案,让全局学习因子C2递减,势必会降低算法的收敛效率,而惯性系数还是那么大,小鸟们依然会围绕历史最优位置打转,毕竟这两个最优位置是有一定关联的。所以让C1线性递减的实验也不必做了,其效果应该与方案4相差不大。
     看来只要是惯性系数不变怎么修改C1和C2都不会有太过明显的效果。为什么实验都是参数递减,却没有参数递增的实验呢?
     1.惯性系数W必须递减,因为它会影响鸟群的搜索范围。
     2.如果C1和C2递增,那么小鸟的惯性速度V势必会跟着递增,这与W递增会产生相同的效果。
  
 上面我们通过一些实验及理论分析了粒子群算法的特点及其参数的作用。粒子群作为优化算法中模型最简单的算法,通过修改这几个简单的参数也能够改变算法的优化性能可以说是一个非常优秀的算法。
     上述实验中,我们仅分析了单个参数对算法的影响,实际使用时(创新、发明、写论文时)也会同时动态改变多个参数,甚至是参数之间产生关联。
     实验中,为了展现实验效果,maxV取值较大,一般取值为搜索空间范围的10%-20%,按上面(-100,100)的范围maxV应该取值为20-40,在此基础上,方案1、方案2效果应该会更好。
     粒子群算法是一种概率算法,所以并不能使用一次实验结果来判断算法的性能,我们需要进行多次实验,然后看看这些实验的效果最终来判断,结果必须使用多次实验的统计数据来说明,一般我们都会重复实验30-50次,为了发论文去做实验的小伙伴们不要偷懒哦。
     粒子群算法的学习目前告一段落,如果有什么新的发现,后面继续更新哦!
   以下指标纯属个人yy,仅供参考
  
  目录 
    上一篇 优化算法笔记(四)粒子群算法(2) 
    下一篇 优化算法笔记(六)遗传算法

7. 粒子群优化算法的与遗传算法的比较

 ①种群随机初始化。②对种群内的每一个个体计算适应值(fitness value)。适应值与最优解的距离直接有关。③种群根据适应值进行复制。④如果终止条件满足的话,就停止,否则转步骤② 。从以上步骤,我们可以看到PSO和遗传算法有很多共同之处。两者都随机初始化种群,而且都使用适应值来评价系统,而且都根据适应值来进行一定的随机搜索。两个系统都不是保证一定找到最优解。但是,PSO没有遗传操作如交叉(crossover)和变异(mutation),而是根据自己的速度来决定搜索。粒子还有一个重要的特点,就是有记忆。 演化计算的优势,在于可以处理一些传统方法不能处理的。例子例如不可导的节点传递函数或者没有梯度信息存在。但是缺点在于:1、在某些问题上性能并不是特别好。2.网络权重的编码而且遗传算子的选择有时比较麻烦。最近已经有一些利用PSO来代替反向传播算法来训练神经网络的论文。研究表明PSO 是一种很有潜力的神经网络算法。PSO速度比较快而且可以得到比较好的结果。而且还没有遗传算法碰到的问题。

粒子群优化算法的与遗传算法的比较

8. 粒子群优化算法的参数设置

从上面的例子我们可以看到应用PSO解决优化问题的过程中有两个重要的步骤: 问题解的编码和适应度函数PSO的一个优势就是采用实数编码, 不需要像遗传算法一样是二进制编码(或者采用针对实数的遗传操作.例如对于问题 f(x) = x1^2 + x2^2+x3^2 求解,粒子可以直接编码为 (x1, x2, x3), 而适应度函数就是f(x). 接着我们就可以利用前面的过程去寻优.这个寻优过程是一个叠代过程, 中止条件一般为设置为达到最大循环数或者最小错误PSO中并没有许多需要调节的参数,下面列出了这些参数以及经验设置粒子数: 一般取 20–40. 其实对于大部分的问题10个粒子已经足够可以取得好的结果, 不过对于比较难的问题或者特定类别的问题, 粒子数可以取到100 或 200粒子的长度: 这是由优化问题决定, 就是问题解的长度粒子的范围: 由优化问题决定,每一维可是设定不同的范围Vmax: 最大速度,决定粒子在一个循环中最大的移动距离,通常设定为粒子的范围宽度,例如上面的例子里,粒子 (x1, x2, x3) x1 属于 [-10, 10], 那么 Vmax 的大小就是 20学习因子: c1 和 c2 通常等于 2. 不过在文献中也有其他的取值. 但是一般 c1 等于 c2 并且范围在0和4之间中止条件: 最大循环数以及最小错误要求. 例如, 在上面的神经网络训练例子中, 最小错误可以设定为1个错误分类, 最大循环设定为2000, 这个中止条件由具体的问题确定.全局PSO和局部PSO: 我们介绍了两种版本的粒子群优化算法: 全局版和局部版. 前者速度快不过有时会陷入局部最优. 后者收敛速度慢一点不过很难陷入局部最优. 在实际应用中, 可以先用全局PSO找到大致的结果,再用局部PSO进行搜索.另外的一个参数是惯性权重, 由Shi 和Eberhart提出, 有兴趣的可以参考他们1998年的论文(题目: A modified particle swarm optimizer)。