连接: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 到达最大代数后算法中止,萤火虫群体集中在各个极值点附近
若在设定初始参数时将萤火虫数量设置的太小,可能会致使算法迭代到最大代数时也为收敛到最值附近,而是萤火虫汇集在局部极值。若将萤火虫数量设置的过大,可能会致使算法收敛过慢。
参考
https://www.zhihu.com/search?type=content&q=%E8%90%A4%E7%81%AB%E8%99%AB%E7%AE%97%E6%B3%95
做者:陈星星