Particle Swarm Optimization(粒子群优化算法)

论文:Kennedy J, Eberhart R. Particle swarm optimization[C]//Proceedings of ICNN’95-international conference on neural networks. IEEE, 1995, 4: 1942-1948.
转载:https://blog.csdn.net/qq_42148307/article/details/124844244


一、介绍

1、本论文介绍了一种用于优化连续非线性函数的方法。该方法是通过对一个简化的社会模型的模拟发现的。
2、粒子群起源于两个两种主要的组成方法学:A-life(artificial life人工生命:鸟群、蜂群等)以及进化算法

二、模拟社会行为

粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:同种动物之间的社会信息共享提供了一种进化优势,通过群体中个体之间的协作和信息共享来寻找最优解。
摘自https://blog.csdn.net/qq_42148307/article/details/124844244

三、粒子群优化算法的演变过程

the original intent was to graphically simulate the graceful but unpredictable choreography of a bird flock.

最初的意图是用图形模拟鸟群优美但不可预测的编排。

1、 Nearest Neighbor Velocity Matching(最近邻域速度匹配) and Craziness

最近领域速度匹配:假设有n只鸟,每只鸟是环面像素网格的一个点,有X速度和Y速度两个方向。在每次迭代的过程中,设置一个循环:对于每个鸟,如果有另一只鸟距离这只鸟最近,就将这只鸟的X和Y分配给另一只鸟。这个简单的规则就创造了同步的运动。

Craziness:随着迭代的继续,鸟群的的飞行方向就会保持不变了。我们要引入一个"Craziness"的随机变量,在每次迭代的过程中,使得随机选择的X和Y速度都会增加一些变化。

2、The Cornfield Vector(康菲尔德矢量)

当我们放置一个喂鸟器,一会就会有很多鸟过来,虽然事先这些鸟并不知道这里有食物。这说明了他们之间存在协作和信息共享的情况。cornfield vector:(X,Y)向量组表示鸟的位置。每个鸟根据下面的公式来获得当前位置的评估值:
在这里插入图片描述
所以(100,100)位置的评估值就是0。

现在假设每只鸟飞过很多地方,而(100,100)就是食物的位置。而每只鸟记录下走过的路途中距离食物最近的位置pbest[n],n只鸟就可以形成2个n*1的向量,记为pbestx[n]、pbesty[n]。而下一步n只鸟的位置为vx[n]、vy[n]。假设n只鸟之间不存在信息共享,那么n只鸟寻食物的流程如下:

for iter < iter_num
  for i < n
        if presentx[i] > pbestx[i] :vx[i] = vx[i] - rand() * p_increment
        else: vx[i] = vx[i] + rand() * p_increment
        if presenty[i] > pbesty[i] :vy[i] = vy[i] - rand() * p_increment
        else:vy[i] = vy[i] + rand() * p_increment

        if pbest[i] < Eval(vx[i],vy[i]): 不做改变
        else pbest[i] = Eval(vx[i],vy[i]), pbestx[i] = vx[i], pbesty[i] = vy[i]

    end
end

现在让n只鸟之间存在信息共享:我们取pbest[n]中最小的数对应的索引为gbest,对应的值为pbest,n只鸟当前位置为presentx[n]、presenty[n],下一步n只鸟的速度为vx[n]、vy[n]。那么n只鸟寻食物流程为:

if presentx[] > pbestx[gbest] then vx[] = vx[] - rand() *g_increment
if presentx[] < pbestx[gbest] then vx[] = vx[] + rand() *g_increment
if presenty[] > pbesty[gbest] then vy[] = vy[] - rand() *g_increment
if presenty[] < pbesty[gbest] then vy[] = vy[] + rand() *g_increment
presentx = vx[], presenty = vy[]
Eval(vx[],vy[]), 如果Eval[n]中有小于pbest[n]的值,将该值覆盖到pbest[n]向量的对应位置(更新pbest[n])。

pbest:个体最佳历史位置
gbest:全局最佳历史位置
如果p_increment,g_increment过大,鸟群会比较快地接近目标,但是最终可能无法寻得最优位置,可能会在最优位置处徘徊;如果p_increment,g_increment过小,鸟群会比较慢地接近目标,但是可以更好地寻得最优位置,但是也有可能存在局部最优的问题。

3、消除辅助变量

上述过程我们消除了“最近领域速度匹配”和"Craziness"的随机变量,但是我们引入了pbest[n]和gbest。

pbest[n]和gbest是十分重要的,gbest在概念上类似于公开的知识,或个人寻求达到的群体规范或标准。也是群体之间信息交互的重要方式。
在模拟中,相对于g_increment,高p_increment值会导致孤立的个体在问题空间中过度游荡,而相反的 (相对较高的g_increment) 会导致羊群过早地冲向局部最小值。两个增量的近似相等的值似乎导致对问题域的最有效搜索。

4、多维搜索

许多优化问题既不是线性的也不是二维的,由于作者的目标之一是对社会行为进行建模,这是多维且无碰撞的,这似乎是一个简单的步骤来改变presentx 和presenty(以及vx[n]和vy[n]),从一维数组转变到D × N矩阵,其中D是任意维数,N是代理的数量。

5、Acceleration by Distance(距离加速度)

为了消除判断这个流程以及将变量扩充到D维,我们将上述:if presentx[] > pbestx[gbest] then vx[] = vx[] - rand() *g_increment

改为:
在这里插入图片描述

6、当前简化版本

人们很快意识到,没有什么好的方法来猜测p_increment还是g_increment应该更大。因此这些属性也在算法中剔除了,通过常数2来代替。替代后的表达式为:

xv[ ] [ ] = vx[ ][ ] +
               2 * rand() * (pbestx[ ][ ] - presentx[ ][ ]) +
               2 *rand() *(pbestx[ ][gbest] - presentx[ ][ ])

2rand()(pbestx[ ][ ] - presentx[ ][ ]) 这一部分主要是往小鸟自己熟悉的最佳位置靠拢,
2rand()(pbestx[ ][gbest] - presentx[ ][ ])这一部分主要是小鸟往所有小鸟中熟悉的最佳位置靠

7、其他版本

在这里插入图片描述
虽然简化了,但是在寻找全局最优方面的效果很差。

四、群体与粒子

剩下简单的翻译了一遍,感觉没什么重要内容了就没写。偷个小懒嘻嘻QAQ


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值