著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
萤火虫算法是Xin-She Yang根据萤火虫的闪烁行为提出的一种元启发式算法[1]。维基百科[2]给出了该算法的伪代码:

图1 萤火虫算法伪代码
本文将结合Yang的萤火虫算法MATLAB代码对该算法进行分析、学习。Yang分享的代码可从以下链接下载。
Firefly Algorithm - File Exchange - MATLAB Centralwww.mathworks.com
firefly_simple.m是Yang提供的一个简单的二维空间示例。该函数的目的是寻找二元函数 在
范围内的最大值。
曲面如下图所示,在计算范围内有四个极值。

图2 f(x,y)曲面
firefly_simple函数首先对算法参数进行设定。萤火虫数量为12,最大代数为50(默认值)。 。
接着对萤火虫群体进行初始化——随机均匀分布在2D平面中。每个萤火虫的亮度为其所在位置的函数 。如下图所示(笔者对Yang的代码稍作修改,使点的大小与萤火虫亮度正相关)。

图3 萤火虫的初始化(图中等高线代表f(x,y)函数大小,绿色的点代表萤火虫,其大小与每个萤火虫的亮度正相关)
接着对萤火虫群体按照每只萤火虫的亮度从小到大排序。当萤火虫群体里第 个和第
个萤火虫的欧式距离为
时,定义它们俩的吸引度为
。依次两两对比群体里任意两只萤火虫亮度亮度,若
,则萤火虫
朝向萤火虫
飞去。萤火虫
的位置更新公式为:
。
式中 为
之间的随机值,
即为萤火虫移动过程中加入的随机y扰动量,避免萤火虫群体陷入局部极值。
萤火虫移动完毕后检查每只萤火虫是否还落在定义域内,若在定义域外则将定义域边界值赋给萤火虫的位置。
这样一代萤火虫的更新就完成了。在进行下一轮更新时可将 乘以一个大于0小于1的数,这样代数越大,扰动越小,可以避免萤火虫最后在极值点附近反复震荡,加快算法的收敛。
多次循环后,当算法循环次数达到最大代数值,算法停止,如下图所示,萤火虫群体中最大的亮度值即为要求的二位函数最大值。

图4 到达最大代数后算法停止,萤火虫群体集中在各个极值点附近
若在设定初始参数时将萤火虫数量设置的过小,可能会导致算法迭代到最大代数时也为收敛到最值附近,而是萤火虫聚集在局部极值。若将萤火虫数量设置的过大,可能会导致算法收敛过慢。
作者:陈星星