参考

首页 编程分享 LINUX丨SYSTEM 正文

anonymous 转载 编程分享 2020-12-18 23:25:07

简介 作者:陈星星 链接:https://zhuanlan.zhihu.com/p/67065319 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。   萤火虫算法是Xi...


作者:陈星星
链接: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提供的一个简单的二维空间示例。该函数的目的是寻找二元函数

范围内的最大值。

曲面如下图所示,在计算范围内有四个极值。

图2 f(x,y)曲面

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

接着对萤火虫群体进行初始化——随机均匀分布在2D平面中。每个萤火虫的亮度为其所在位置的函数

。如下图所示(笔者对Yang的代码稍作修改,使点的大小与萤火虫亮度正相关)。

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

接着对萤火虫群体按照每只萤火虫的亮度从小到大排序。当萤火虫群体里第

个和第

个萤火虫的欧式距离为

时,定义它们俩的吸引度为

。依次两两对比群体里任意两只萤火虫亮度亮度,若

,则萤火虫

朝向萤火虫

飞去。萤火虫

的位置更新公式为:

式中

之间的随机值,

即为萤火虫移动过程中加入的随机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

作者:陈星星

转载链接:https://my.oschina.net/u/4518192/blog/4796516


Tags:


本篇评论 —— 揽流光,涤眉霜,清露烈酒一口话苍茫。


    声明:参照站内规则,不文明言论将会删除,谢谢合作。


      最新评论




ABOUT ME

Blogger:袅袅牧童 | Arkin

Ido:PHP攻城狮

WeChat:nnmutong

Email:nnmutong@icloud.com

标签云