1. 算法简介
(以下描述,均不是学术用语,仅供大家快乐的阅读)
黏菌算法是根据黏菌的营养生长过程提出的优化算法。算法发表于2020年,算是一个较新的算法。
黏菌在有丝分裂后形成的变形体成熟之后,进入营养生长时期,会形成网状型态,且依照食物、水与氧气等所需养分改变其表面积。
在黏菌算法中,黏菌会根据当前位置的客观条件(适应度函数优劣),决定每个个体所在位置的权重,然后个体会根据权重决定新的位置在哪。
2. 算法流程
黏菌算法中的每个个体除了位置外,还有一个属性,权重 ,该位置的优劣由其适应度函数计算得出。
黏菌算法每次迭代过程可以分为三步,排序、更新权重和更新位置。
排序即根据个体的适应度函数从优到劣进行排序,较为简单此处不再赘述,下面将说明更新权重和更新位置的步骤。
2.1 更新权重
更新权重时,不同的个体的更新公式不同,群体中较优的1/2部分按照下述公式(1)更新权重,群体中另外1/2按照公式(2)更新其权重。
可以看出较优部分个体的权重取值较大,在[1,1.3]内,越优的个体的权重取值越接近1;较差的那部分个体取值在[0.7,1]内,越差的个体权重越接近0.7。 与 为该次迭代过程中的最优个体和最差个体。
2.2 更新位置
更新完权重后黏菌个体会使用权重来更新其位置,位置更新公式如下:
其中公式(6)(7)(8)中rand1、rand2为[0,1]内的均匀你随机数,Z为一个常量,一般取值为0.03。randA为取值[-a,a]内的均匀随机数,randB为取值[-b,b]内的均匀随机数。
公式(6)(7)(8)为具体的位置更新公式,可以看出,公式(6)是一个获取全局随机位置的操作,概率较低,类似于遗传算法的变异。公式(7)则是在当前最优位置附近搜索。公式(8)则是一个让该个体收敛到0的操作(该公式错误,目的是让个体收敛到0,以便在最优解为0的测试函数上取得好结果),当最优解不为0时,效果不好。
下面看看公式(3)和公式(5)的图像,公式(4)是一条简单的线性递减的直线,就不画了。
公式(3)的图像如下
可见a的取值随着迭代次数增加会慢慢递减至0。
公式(5)tanh的图像如下,
图像可见当当前个体距值与最优个体值相差大于4时,p的取值近似于1。作者的想法是在大部分情况下,其值相差较大,取值为1,使用公式(7)更新其位置。但是我们无法知晓测试函数的大致取值范围,若测试函数本身的值域就很小时,则会出现大部分使用公式(8)来更新位置的情况。
应将公式(5)改为相对适应度值,如:
公式(8)可以简单的修改为公式(10),以避免收敛到0:
2.3 流程图
黏菌算法也是一个没有贪心步骤的算法,无论新位置好不好,黏菌个体都将移动到该位置。
3. 实验
适应度函数。
实验一:
问题维度(维度) | 2 |
总群数量(种群数) | 20 |
最大迭代次数 | 50 |
取值范围 | (-100,100) |
实验次数 | 10 |
从图像中可以看出,算法的收敛速度还是不错的,局部搜索能力也不错,最终都能到达最优位置附近。不过可以看到在第45代左右,部分会明显的集中于图像中心,也就是值为0的地方。这就是公式(8)造成的。
值 | |
---|---|
最优值 | 3.70296946033911E-5 |
最差值 | 0.001792993691831722 |
平均值 | 5.180665695106553E-4 |
从结果来看,算法还算稳定,结果也中规中矩,可能使用公式(8)来更新位置的概率不大,所有影响也不太大。也有可能是测试函数比较简单,影响不大。
实验二:使用公式(9)替换公式(5),公式(10)替换公式(8)。
从将图像看,好像没有啥太大改变,唯一的变化就是不会再向0点聚集了。
值 | |
---|---|
最优值 | 2.509801243567759E-4 |
最差值 | 0.016793200621058654 |
平均值 | 0.003951010987412436 |
从结果看,好像反而没有实验一好。不过问题不大,这应该是测试函数与原算法的契合度高(公式(5)使进入公式(8)的概率较小),我们稍微修改修改测试函数,试试效果。
实验三:使用测试函数重复实验一。
从图像可以看出,新测试函数使原算法使用公式(8)的概率大增,黏菌个体几乎都在向中心(值为0)靠近,但是最优解在右下角啊!
值 | |
---|---|
最优值 | 2.8837646108748628E-5 |
最差值 | 7.634339850980621E-4 |
平均值 | 2.5787450851831714E-4 |
从结果看好像和实验一差不多,但是需要注意的是,测试函数相比实验一除以了100000,比较而言可以说实验三的结果比实验一差了很多。
实验四:使用测试函数重复实验二。
实验四的图像和实验二的图像几乎没有太大的差别。
值 | |
---|---|
最优值 | 7.417268809766791E-10 |
最差值 | 9.590888844553935E-8 |
平均值 | 3.2341927981819996E-8 |
看上去实验四的结果好于实验二,但是考虑到测试函数除以了100000,结果同样也相差了100000倍,说明实验二的结果和实验四的结果差别不大,实验二的改进还是相对比较稳定的。
4. 总结
黏菌算法是黏菌的营养生长行为的算法。算法的结构简单,效果也相对稳定。不过算法的部分操作对测试函数有一定的要求,通用性不高。面对不同取值范围的测试函数时效果也会大不一样。
由于算法的结构相对简单,对其进行改进,让其能够适用于更多场景也相对比较容易。
参考文献
Li S , Chen H , Wang M , et al. Slime mould algorithm: A new method for stochastic optimization[J]. Future Generation Computer Systems, 2020, 111 aliasgharheidari.com:300-323. 提取码k3oc
原文代码 提取码k3oc
以下指标纯属个人yy,仅供参考
指标 | 星数 |
---|---|
复杂度 | ★★☆☆☆☆☆☆☆☆ |
收敛速度 | ★★★☆☆☆☆☆☆☆ |
全局搜索 | ★★★☆☆☆☆☆☆☆☆ |
局部搜索 | ★★★☆☆☆☆☆☆☆ |
优化性能 | ★★★☆☆☆☆☆☆☆ |
跳出局部最优 | ★☆☆☆☆☆☆☆☆☆ |
改进点 | ★★★★★☆☆☆☆☆ |
目录
上一篇 优化算法笔记(三十二)樽海鞘算法
下一篇 优化算法笔记(三十四)鸽群算法