作者:陈星星

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

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

萤火虫算法 (Firefly algorithm)_初始化

图1 萤火虫算法伪代码

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

Firefly Algorithm - File Exchange - MATLAB Central​www.mathworks.com萤火虫算法 (Firefly algorithm)_伪代码_02

firefly_simple.m是Yang提供的一个简单的二维空间示例。该函数的目的是寻找二元函数 萤火虫算法 (Firefly algorithm)_极值_03萤火虫算法 (Firefly algorithm)_定义域_04 范围内的最大值。

萤火虫算法 (Firefly algorithm)_商业_05 曲面如下图所示,在计算范围内有四个极值。

萤火虫算法 (Firefly algorithm)_伪代码_06

图2 f(x,y)曲面

firefly_simple函数首先对算法参数进行设定。萤火虫数量为12,最大代数为50(默认值)。 萤火虫算法 (Firefly algorithm)_伪代码_07

接着对萤火虫群体进行初始化——随机均匀分布在2D平面中。每个萤火虫的亮度为其所在位置的函数 萤火虫算法 (Firefly algorithm)_初始化_08 。如下图所示(笔者对Yang的代码稍作修改,使点的大小与萤火虫亮度正相关)。

萤火虫算法 (Firefly algorithm)_伪代码_09

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

接着对萤火虫群体按照每只萤火虫的亮度从小到大排序。当萤火虫群体里第 萤火虫算法 (Firefly algorithm)_伪代码_10 个和第 萤火虫算法 (Firefly algorithm)_商业_11 个萤火虫的欧式距离为 萤火虫算法 (Firefly algorithm)_定义域_12 时,定义它们俩的吸引度为 萤火虫算法 (Firefly algorithm)_定义域_13 。依次两两对比群体里任意两只萤火虫亮度亮度,若 萤火虫算法 (Firefly algorithm)_初始化_14 ,则萤火虫 萤火虫算法 (Firefly algorithm)_伪代码_10 朝向萤火虫 萤火虫算法 (Firefly algorithm)_商业_11 飞去。萤火虫 萤火虫算法 (Firefly algorithm)_伪代码_10 的位置更新公式为: 萤火虫算法 (Firefly algorithm)_极值_18

式中 萤火虫算法 (Firefly algorithm)_极值_19萤火虫算法 (Firefly algorithm)_极值_20 之间的随机值, 萤火虫算法 (Firefly algorithm)_商业_21 即为萤火虫移动过程中加入的随机y扰动量,避免萤火虫群体陷入局部极值。

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

这样一代萤火虫的更新就完成了。在进行下一轮更新时可将 萤火虫算法 (Firefly algorithm)_定义域_22 乘以一个大于0小于1的数,这样代数越大,扰动越小,可以避免萤火虫最后在极值点附近反复震荡,加快算法的收敛。

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

萤火虫算法 (Firefly algorithm)_定义域_23

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

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

 

作者:陈星星