萤火虫算法 (Firefly algorithm)

做者:陈星星
连接:https://zhuanlan.zhihu.com/p/67065319
来源:知乎
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。
 

萤火虫算法是Xin-She Yang根据萤火虫的闪烁行为提出的一种元启发式算法[1]。维基百科[2]给出了该算法的伪代码:算法

图1 萤火虫算法伪代码函数

本文将结合Yang的萤火虫算法MATLAB代码对该算法进行分析、学习。Yang分享的代码可从如下连接下载。学习

Firefly Algorithm - File Exchange - MATLAB Centralwww.mathworks.com图标

firefly_simple.m是Yang提供的一个简单的二维空间示例。该函数的目的是寻找二元函数 [公式][公式] 范围内的最大值。spa

[公式] 曲面以下图所示,在计算范围内有四个极值。blog

图2 f(x,y)曲面排序

firefly_simple函数首先对算法参数进行设定。萤火虫数量为12,最大代数为50(默认值)。 [公式]ip

接着对萤火虫群体进行初始化——随机均匀分布在2D平面中。每一个萤火虫的亮度为其所在位置的函数 [公式] 。以下图所示(笔者对Yang的代码稍做修改,使点的大小与萤火虫亮度正相关)。get

图3 萤火虫的初始化(图中等高线表明f(x,y)函数大小,绿色的点表明萤火虫,其大小与每一个萤火虫的亮度正相关)it

接着对萤火虫群体按照每只萤火虫的亮度从小到大排序。当萤火虫群体里第 [公式] 个和第 [公式] 个萤火虫的欧式距离为 [公式] 时,定义它们俩的吸引度为 [公式] 。依次两两对比群体里任意两只萤火虫亮度亮度,若 [公式] ,则萤火虫 [公式] 朝向萤火虫 [公式] 飞去。萤火虫 [公式] 的位置更新公式为: [公式]class

式中 [公式][公式] 之间的随机值, [公式] 即为萤火虫移动过程当中加入的随机y扰动量,避免萤火虫群体陷入局部极值。

萤火虫移动完毕后检查每只萤火虫是否还落在定义域内,若在定义域外则将定义域边界值赋给萤火虫的位置。

这样一代萤火虫的更新就完成了。在进行下一轮更新时可将 [公式] 乘以一个大于0小于1的数,这样代数越大,扰动越小,能够避免萤火虫最后在极值点附近反复震荡,加快算法的收敛。

屡次循环后,当算法循环次数达到最大代数值,算法中止,以下图所示,萤火虫群体中最大的亮度值即为要求的二位函数最大值。

图4 到达最大代数后算法中止,萤火虫群体集中在各个极值点附近

若在设定初始参数时将萤火虫数量设置的太小,可能会致使算法迭代到最大代数时也为收敛到最值附近,而是萤火虫汇集在局部极值。若将萤火虫数量设置的过大,可能会致使算法收敛过慢。

参考

  1. ^Yang X S. Nature-Inspired Metaheuristic Algorithms[M]. Luniver Press, 2008.
  2. ^https://en.wikipedia.org/wiki/Firefly_algorithm

https://www.zhihu.com/search?type=content&q=%E8%90%A4%E7%81%AB%E8%99%AB%E7%AE%97%E6%B3%95

做者:陈星星

相关文章
相关标签/搜索