RhinoFreak 发表于 2021-12-17 21:37

第三十九弹——蜉蝣算法

引言

本期我们介绍蜉蝣算法(Mayfly Algorithm,MA)。该算法由Konstantinos Zervoudakis等人于2020年提出,主要模拟了蜉蝣的飞行行为及交配过程,因实验效果不错并在Mathworks上广受好评,所以本期介绍给大家。
蜉蝣算法

蜉蝣是属于蜉蝣目的昆虫,也属于古翅目昆虫的一部分。首先未成熟的蜉蝣从卵中孵化出来后,会在水中作为水生若虫生长几年。成年后它们将飞出水面,不过此时成年蜉蝣的寿命只有几天,所以这几天的终极目标就是交配,繁衍后代。正所谓“浮游一生,蜉蝣一世。”
为了吸引雌性,大多数成年雄性聚集在离水面几米的地方,通过独特的运动模式来"表演舞蹈"。在大自然中,这种求偶的行为很常见。受到吸引后,雌性飞向群体内,以便在空中与雄性交配。交配完成后,雌性将卵落在水面上,进而将生命周期继续下去。这种虫子其实很常见,记得之前在南昌航空大学念书时宿舍楼前有很大一块草坪,游走在小道中常常会看到浑身绿色,透明翅翼的蜉蝣~
雄性蜉蝣的运动
在求偶过程中,雄性蜉蝣成群结队地聚集在一起,因此每只雄性蜉蝣的位置更新与邻域个体有关:


其中x、v 分别为个体i 在第t 次迭代时的位置和飞行速度,所以这里很像粒子群算法中的位置更新方式。考虑到雄性蜉蝣总是在靠近水面的地方斗舞,所以飞行速度并不会很快:


式中a1=1、a2=1.5是正吸引常数,分别用于衡量认知成分和社会成分的贡献,通俗来讲就是当前个体及最优个体对当前飞行速度的影响程度。pbest为个体i 的历史最优位置,gbest为最优个体位置。 https://www.zhihu.com/equation?tex=%5Cbeta=2 为蜉蝣的能见度系数,控制着可见范围;rp、rg分别表示pbest、x与gbest、x的间距:


对于当前的舞王(最优个体),它就不能像其他蜉蝣那样更新了,得展现出自己独到的一面:


其中d=5为舞技系数,r 为[-1,1]内一随机值。说道蜉蝣的这种行为,我不禁想起了雨中斗舞的情景:



图1 雨中斗舞

雌性蜉蝣的运动
雌性并不抱团,它们会从男神天团中选出自己"适应度排名"相同的心上人然后杀过去,正所谓"门当户对"。所以简单地讲就是在雄性、雌性群体内按照适应度进行排名,配对时执行一一映射的原则。雌性的位置更新方式与雄性相同:


不过它们的飞行速度更新方式大较为相似(适用于最小化问题):


当f(y)>f(x)时,参数定义与前文相同;相反时,r 为[-1,1]内一随机数,fl 为随机游走系数:
fl=1;                     % Random flight
fl_damp=0.99;
...
fl=fl*fl_damp;交配行为
一一配对后,交叉产生两个子代:


其中male、female分别为父代、母代的位置,L为特定范围内的随机数:
L=unifrnd(0,1,N);%N为种群规模为了控制种群规模,生成子代后若适应度值较优则替换掉对应的较差个体。注意,子代的初始速度为0。至此,算迭代伪代码为:


性能测试

本期我们将MA算法与往期的白骨顶鸡优化算法(COOT)、阿基米德优化算法(AOA)在部分CEC2017测试函数上进行对比测试,取种群规模为30,维度为30,最大迭代次数为10000,计算结果如下:



图2 三个函数在function3上的对比测试



图3 三个函数在function5上的对比测试



图4 三个函数在function21上的对比测试



图5 三个函数在function25上的对比测试

就迭代情况来看,MA算法的性能确实优异!
总结

总体而言,MA算法的结构与粒子群算法有些相似,不过作者将部分参数设置为自适应,这就在处理复杂问题时很吃香。虽然MA算法性能优异,但不得不说,每经过一次迭代,适应度的计算次数过多,所以当以适应度计算次数为评价标准时,MA算法不一定能表现得很优异。值得一提的是,代码中额外引入了一个惯性权重,这是在原文中没有的。可能是作者忘了?谁知道~若有读者需要代码可三连后私聊哦~

redhat9i 发表于 2021-12-17 21:38

冲啊!!!很实用

xiangtingsl 发表于 2021-12-17 21:39

求大哥分享源码

DomDomm 发表于 2021-12-17 21:44

请教一下,蜉蝣算法优化参数时,参数如果需要是整数怎么办?这个算法存在matlab遗传算法工具箱里的整数约束吗?

NoiseFloor 发表于 2021-12-17 21:50

感觉您说的不太明白。待优化参数需要是整数?文中提到的一些常值参数直接在迭代前默认为常数值即可

HuldaGnodim 发表于 2021-12-17 21:53

是这样的,相当于是我需要进行一个整数规划问题,需要优化的问题输入是整数,而蜉蝣算法里每次最佳位置更新是会出现小数的

c0d3n4m 发表于 2021-12-17 21:56

这方面我倒是没做过,不过即使输入的是整数在位置更新时肯定不能保证更新完仍然是整数,那么就要取整或是其他操作,不知道这样会不会影响精度

johnsoncodehk 发表于 2021-12-17 21:58

谢谢,我试过在位置更新的时候取整了,但是优化的效果不好[捂脸]

xiaozongpeng 发表于 2021-12-17 22:03

三连三连三连,求代码。谢谢大哥![调皮]

redhat9i 发表于 2021-12-17 22:05

私聊
页: [1] 2 3
查看完整版本: 第三十九弹——蜉蝣算法