声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~
昨天看到网上有一个流传很广的改进鲸鱼优化算法MSWOA代码(如下图),作者用了五种策略对鲸鱼算法进行改进,好奇点进去看了下,发现这是一个完全错误的改进。代码是根据文献完全复现的,也就是说,不光代码有错误,就连这篇文献本身就是错误的。
这是截了其中一个函数的图,左边是程序截图,右边是论文原文图,不得不说,复现的倒是挺完美的。但是,改进算法的在F1测试函数中的收敛曲线竟然是平的,作者不懂,难道审稿人也不懂?
更可怕的是,这篇发表在2021年发表在北大核心+CSCD的文章在知网的引用量已经达到了40多次。
为了以正视听,同时,也让小伙伴们在改进算法中也不再发生类似的错误,今天就来看下这个文章的代码到底错在了哪里。
首先,作者用了五种策略进行了改进,这里复制一下他的摘要:
“首先,采用Sobol序列初始化种群以使初始解在解空间分布更均匀;然后,通过非线性时变因子和惯性权重平衡并提高全局搜索及局部开发能力,并结合随机性学习策略增加迭代过程中种群的多样性;最后,引入柯西变异提升算法跳出局部最优的能力。”
这里看起来没什么问题,都是很常见的策略。
那么,问题出在哪呢?由于作者做了不同改进策略对算法性能影响分析,因此首先看一下作者的这张表。
其中,改进策略分别为 Sobol 序列初始化种群(WOA-1)、非线性时变因子(WOA-2)、自适应权值(WOA-3)、柯西变异策略(WOA-4)、随机性学习策略(WOA-5)。
可以看到,在Sobol序列改进的鲸鱼算法中(也就是WOA-1),大部分函数的平均值和标准差已经达到了最优值0。换句话说,在使用种群初始化的时候,算法已经找到了最优值0,这就导致后面的四个策略已经完全起不到任何作用了。
这也难怪这个改进算法大部分函数的收敛曲线是一条横线,初始化就已经找到最优值,那还要后面的策略干什么呢?
为什么说这样的改进是错误的?因为,这就好比一场考试,大家都是比谁的求解速度更快、在不知道答案的情况下谁更靠近最优值,而你已经提前知道了答案,直接在卷子上写个0,那这还有什么意义呢?如果换个最优值不是0的函数,效果恐怕就不尽人意了。
在作者的论文中也可以看到,在最优值非0的函数中,如论文里的F7,效果已经不怎么好了。
当然,Sobol初始化种群策略本身是没什么问题的,因为很多作者都用过,至于效果如何属于仁者见仁智者见智的问题。但是,在生成初始Sobol序列的时候,需要避免结果中产生0点的问题,这一点也是原文作者错误的根源所在。
为了给小伙伴展现这篇文献改进策略最真实的效果,我这边将使用正确版本的Sobol策略,同时略微变换绘图方式,并附上测试函数的三维立体图,用最美观、最正确的方式对这份代码进行改进,并确保与文献核心思想一致:
可以看到,这个算法效果是很不错的,这边随便截图了5个函数,基本都是最优值,说明作者的其他策略是起了一定的效果的。同时,也可以清晰的看到没有任何收敛曲线是平的,因此也并不存在初始点就为0的情况,是一个非常不错的改进算法。
另外,这里也完美复现了论文中的其他两张图:
可以看到,复现出来的图和论文原文中的图几乎一模一样。
想要以上正确版本的Matlab代码的,只需点击下方小卡片,再后台回复关键词,不区分大小写:
MSWOA