优化算法笔记(十七)万有引力算法

1. 万有引力算法简介

(以下描述,均不是学术用语,仅供大家快乐的阅读)
万有引力算法(Gravitational Search Algorithm)是受物体之间的万有引力启发而提出的算法。算法提出于2008(2009)年,时间不长,不过相关的文章和应用已经相对较多,也有不少的优化改进方案。
  万有引力算法中,每一个物体的位置代表了一个可行解,而物体的质量则反映了该位置的好坏,位置越好的物体的质量越大,反之物体的质量越小(质量由适应度值计算出,不是直接相等)。物体在解空间中的运动方式由其他物体的引力决定,质量越大的物体,在同等引力作用下的加速度较小,所以单位时间内的速度也相对较小,位移距离较短,反之加速度和速度都较大,位移距离较长。故可以简单的认为,位置越优的个体的移动速度越慢,位置越差的个体的移动速度越快

2. 算法流程

万物之间皆有万有引力,不过在我们谈到万有引力之时,对象大多是天体,否则万有引力太小可以忽略不计。所有这次我们的主角就是天体了。(总不可能是苹果吧)。


  每一个天体都有个属性:位置X,质量M,加速度A,以及速度V,还有适应度值F。
  在D维空间内有N个天体,其位置为

,加速度

,速度

,其适应度值为


2.1计算天体的质量

第i个天体的质量则是根据其适应度值计算得出:

计算质量

其中M为天体的质量在群体重质量中的占比, 分别表示全局最差天体的适应度值和全局最优个体的适应度值。
  可以看出,处于最优位置的天体的质量m为1,最差位置的天体的质量m为0。当最优天体和最差天体重合时,所有的天体的质量m都为1。

2.2计算天体的加速度

由万有引力计算公式和加速度公式可以计算出当前天体收到另一个天体万有引力而产生的加速度:


计算天体的加速度

其中R表示第i个天体和第j个天体之间的欧式距离,aij为天体i在第d维上受到天体j的万有引力而产生的加速度,ai为第i个天体受到的其他所有天体万有引力的合力产生的加速度。G为万有引力常量,可以根据一下公式计算:


万有引力常量

  其中G0为初始值,T为最大迭代次数。

2.3计算天体的速度并更新位置

计算出了天体的加速度,则可以根据当前速度计算出下一步天体的运行速度以及天体下一步的位置。

更新位置和速度

  这一步比较简单与粒子群、蝙蝠等有速度的算法一致。


算法流程

  可以看出万有引力算法的流程异常的简单,与经典的粒子群差不多。万有引力算法也可以看做是一个优化改进版的粒子群,不过设计比较巧妙,引入的质量、加速度等概念,但实现仍然很简单。万有引力算法的效果如何,在下一节将会进行实验测试。

3. 实验

适应度函数。
实验一:

问题维度(维度) 2
总群数量(种群数) 20
搜索次数(最大迭代次数) 100
G0 100
取值范围 (-100,100)
实验次数 10
实验一
最优值 2.3541929659476212E-18
最差值 0.12702092417237046
平均值 0.012796260245792387

从图像中可以看出,各个天体都在不停的运动,由于没有贪心算法(优于当前值才改变位置)的加入,所以个天体有可能运动到比原先位置更差的地方,而且其收敛速度也比较快。
  从结果上看,似乎还不错,受到最差值的影响均值也相对较大,算法结果的稳定性不是太好。
  直觉上感觉算法有点问题。根据物理得来的直觉告诉我,这些天体会相互靠近,所以,它们不会集中到它们所构成的凸包之外,凸实心物体的质心不会跑到该物体的外部。做个试验验证一下,将测试函数的最优解设置到一个极端的位置。
实验二: 适应度函数

问题维度(维度) 2
总群数量(种群数) 20
搜索次数(最大迭代次数) 100
G0 100
取值范围 (-100,100)
实验次数 10

这次最优解位置在(90,90)处,该点有很大概率出现在初始天体所围成的凸多边形外。

实验二
最优值 23.0992211557913
最差值 1267.97543843818
平均值 417.19208443999185

从图像中可以看出,在天体们还没有到达最优位置附近(右下角的红点)时,它们已经收敛于一个点,之后则很难再次向最优解靠经。看结果可以发现几乎每一次实验的结果都不太好,算法果然有点问题,不过问题不大。
  万有引力出现这种现象可能有两个原因:1.算法收敛的太快,还未对全局进行充分搜索之时就收敛到了一点,收敛到一点后无法再运到。2.算法没有跳出局部最优的策略,万有引力作用下的天体慢慢聚集到奇点,形成黑洞,无法从中逃离。
  那接下来,对万有引力算法的改进方向也比较明确了:1.减缓其收敛速度,2增加跳出局部最优操作,使之逃离黑洞。
  看看万有引力常量G的函数图像

万有引力常量曲线

  几乎在x/Xmax=1/5时已经收敛到接近0。
实验三:修改

问题维度(维度) 2
总群数量(种群数) 20
搜索次数(最大迭代次数) 100
G0 100
取值范围 (-100,100)
实验次数 10
G=G0*(1-t/T)
最优值 1.3110161211294625E-5
最差值 0.27745689480499086
平均值 0.033094478518038435

将万有引力常量的值修改为随着迭代次数线性下降,从图像中可以看出,效果还是比较明显的,天体在不断的运动,最后才收敛、聚集于一起。从实验结果也可以看出,算法相对稳定。结合图像可以知道,改进后,算法的收敛性下降,但全局搜索能力有较大的提升,算法的结果不会很差但是精度较低。

G=G0*e^(-5t/T)
最优值 2.828223575285611E-9
最差值 0.11880965981395
平均值 0.013540748540427833

将万有引力常量的下降趋势放缓为原来的1/4,从图像中可以看出,算法的收敛速度非常快,也得到了较好的结果,相比线性下降,算法有着更好的精度,不足之处则是没有跳出局部最优的操作,收敛过快也容易陷入局部最优。
  不知道原文为什么让万有引力常量G的如此快的降到0,明明降的更慢能有更好的全局搜索能力,但精度可能较差。猜测如果精度较差则在测试函数结果和曲线上比不赢对比的其他算法,论文没法发了。其使用的测试函数的最优解大多处于解空间的中心位置附近,即很少出现最优解在天体所围成的凸多面体之外的情况,而实际问题中我们是无法预知最优解在个位置的。
  接下来,将试着为万有引力算法加入一点跳出局部最优的操作。

实验四:改进,新增以下规则及操作
  在实验二的条件下
  1. 处于最优位置的天体保持自己的位置不动.
  2. 如果某一个天体的运动后的位置优于当前全局最优个体的位置则将当前的最优个体初始化到解空间的随机位置.(将被自己干掉的大哥流放)。
  3. 如果触发了规则2,将所有的个体的以迭代次数重置为0,即计算G=G0*e^(-20t/T)中的t置为0,重新计算万有引力常量,若未触发条件2则t=t+1。

问题维度(维度) 2
总群数量(种群数) 20
搜索次数(最大迭代次数) 100
G0 100
取值范围 (-100,100)
实验次数 10
实验四
最优值 0.002865626046584871
最差值 0.34315942017305623
平均值 0.051625935063410844

从图像上看,算法的全局搜索能力有大幅的增强,并且已经集中到了最优解的附近,而且由于加入了“流放”这一跳出局部最优的操作,可以看出,不断的有新的个体出现在距最优位置较远的位置。不过收敛速度有所下降,因此局部搜索能力有一定减弱。
  看结果,好像没有实验三那么好,但与实验二相比,已经有了很大的提升,而且有了跳出局部最优的操作,结果也相对稳定。
  上述的实验仅仅是对直观猜想的实现,如果想以此为改进点,还要对其进行大量的调优,相信会有不错的结果。

4. 总结

万有引力算法根据万有引力提出,结合了牛顿第二定律,可以说其操作步骤与真实的物理规律非常的贴切。不过就像前文说过,受物理现象启发而来的优化算法其性能是未知的,因为它们不具备智能,只有着规律,有规律就会存在弱点,就会有搜索盲区。宇宙那么大,肯定存在没有任何天体到达过的空间。
  不过由于万有引力算法流程简单,理解方便,其优化方案和能改进的地方相对较多。万有引力算法的收敛速度过快,导致其全局搜索能力较弱而局部搜索能力很强,容易陷入局部最优。根据其特点,我们可以降低其收敛速度或者增加跳出局部最优操作,来平衡算法的各个性能。

参考文献
Rashedi E , Nezamabadi-Pour H , Saryazdi S . GSA: A Gravitational Search Algorithm[J]. Information Sciences, 2009, 179(13):2232-2248. 提取码:xhpa

以下指标纯属个人yy,仅供参考

指标 星数
复杂度 ★★☆☆☆☆☆☆☆☆
收敛速度 ★★★★★★★☆☆☆
全局搜索 ★★☆☆☆☆☆☆☆☆
局部搜索 ★★★★★★★☆☆☆
优化性能 ★★★☆☆☆☆☆☆☆
跳出局部最优 ★★☆☆☆☆☆☆☆☆
改进点 ★★★★★★★☆☆☆

目录
上一篇 优化算法笔记(十六)混合蛙跳算法
下一篇 优化算法笔记(十八)灰狼算法

优化算法matlab实现(十七)万有引力算法matlab实现

你可能感兴趣的:(优化算法笔记(十七)万有引力算法)