优化算法笔记(二十一)麻雀搜索算法

(手机阅读会有公式不显示!)

1. 麻雀搜索算法简介

(以下描述,均不是学术用语,仅供大家快乐的阅读)
  麻雀搜索算法(sparrow search algorithm)是根据麻雀觅食并逃避捕食者的行为而提出的群智能优化算法。提出时间是2020年,也就是今年,这是一个新鲜热乎的新算法,相关的论文和研究还比较少,有可能还有一些正在发表中,受疫情影响需要论文的同学抓紧时间水论文了。
  麻雀搜索算法主要模拟了麻雀群觅食的过程。麻雀群觅食过程也是发现者-跟随者模型的一种,同时还叠加了侦查预警机制。麻雀中找到食物较好的个体作为发现者,其他个体作为跟随者,同时种群中选取一定比例的个体进行侦查预警,如果发现危险则放弃食物,安全第一。
  麻雀搜索算法的具体实现其实和人工蜂群算法非常相似,基本结构几乎一致,但是搜索算子有一定的差异,可以说是一种人工蜂群算法的改进算法。
  麻雀搜索算法的相关论文比较少,只看了原始论文,算法的描述比较详细,不过可以看出论文编排的比较匆忙,有部分公式显得过于复杂,影响理解。下面我会根据自己的理解对其中的部分公式进行简化,如果有不对的地方,欢迎大家留言。

2. 算法流程

这次我们的主角是一群麻雀。


  麻雀虽小五脏俱全,每只麻雀只有一个属性:位置,代表它找到的食物的位置。每只麻雀有三种可能的行为:1.作为发现者,继续搜索食物,2,作为跟随者,跟随一个发现者觅食,3.警戒侦查,有危险则放弃食物。
  在D维解空间内每只麻雀的位置为 ,适应度值 。
  这群麻雀中有N只麻雀,每代选取种群中位置最好的PN只麻雀作为发现者,剩余的N-PN只麻雀作为跟随者。

2.1更新发现者位置

每代发现者的位置更新公式如下:


  上图为文中的公式描述,有些不准确,更加精确的描述如下:

  其中 表示种群中第t代中第i个个体的第d维位置, 为(0,1]中的均匀随机数,Q为一个标准正态分布随机数。 为[0,1]中的均匀随机数,ST为警戒阈值,取值范围为[0.5,1.0]。
  可以看出,当 大于ST时,该发现者将按正态分布随机移动到当前位置附近。(其值收敛于最优位置)。
  当 小于ST时是什么情况呢,我们先看看函数 的图像,其中 取值为1000。


  可以看出在其分布随着x的变大,取值范围逐渐由(0,1)慢慢缩小为约(0,0.4)。
X值较小时,取值靠近1的概率较高,随着X的增大,取值的分布变得较为均匀。
所以当 小于ST,麻雀的每一维都在变小,当然,这不是一个好策略。(其值收敛于0)。

2.2更新跟随者位置

文中跟随者的位置更新公式及描述如下图:


  首先我们先看看 是一个大小为1*D的矩阵(1行D列),其每一维都随机从{-1,1}中选取 。
  举个简单的例子,假设 ,X=(x1,x2,x3)=(1,2,3),则

  由于是行向量与矩阵运算,所以文中公式两边不应该出现公式j,出现公式j则表示该变量是一个数值而非一个向量。
  简化可得其位置更新公式如下:


  其中xw为当前种群中麻雀的最差位置,xb则为种群中麻雀的最优位置。
  从公式(2)中可以看出,若i>n/2时,其值为一个标准正态分布随机数与一个以自然对数为底数的指数函数的积,当种群收敛时其取值符合标准正态分布随机数。(其值会收敛于0)。
  若i<=n/2时,其取值为当前最优的麻雀的位置加上该麻雀与最优位置每一维距离随机加减后,将总和均分到每一维上。解释有点绕口,请结合公式自行理解。该过程可以描述为在当前最优位置附近随机找一个位置,且每一维距最优位置的方差将会变得更小,即不会出现在某一维上与最优位置相差较大,而其他位置相差较小。(其值收敛于最优位置)。

2.3侦查预警行为

在麻雀觅食的同时他们中的部分会负责警戒,当危险靠近时,他们会放弃当前的食物,即无论该麻雀是发现者还是跟随者,都将放弃当前的食物而移动到一个新的位置。
  每代将从种群中随机选择SD个个体进行预警行为。
其位置更新公式如下:


  其中 为符合标准正态分布的随机数,K为[-1,1]的均匀随机数, 为一个较小的数防止分母唯一。与原文中的公式相比,我去除了原绝对值符号,因为两个随机数均是关于原点中心对称,增加的分母绝对值,防止分母取值为0。其中 为最差位置的麻雀的适应度值。
  从公式(3)中可以看出,如果该预警的麻雀处于当前的最优位置时,它会逃离到自身附近的一个位置,具体有多近取决于自身距离最差位置与自身位置食物与最差食物的差别的比值;如果该麻雀不是处于最优位置的那一只,它讲逃到当前最优位置附近。(其值收敛于最优位置)。

麻雀搜索算法的流程图如下:

流程图

  可以看出麻雀搜索算法的流程非常的简单。但是根据上面对这三个更新公式的分析可以看出,麻雀搜索算法的更新方式可大致分为两种:1.向当前最优位置靠近;2.向原点靠近。
  使用这两种方式来更新麻雀的位置将会使算法容易陷入局部最优。直觉告诉我拥有这样的更新规则的算法不是一个优秀的算法。具体的问题下面实验中进行详述。

3. 实验

适应度函数。
实验一

问题维度(维度) 2
总群数量(种群数) 20
搜索次数(最大迭代次数) 50
ST(发现者警戒阈值) 0.8
PR(发现者比例) 20%
SD(侦查者比例) 10%
取值范围 (-100,100)
实验次数 10
实验一图像
最优值 3.3847871869609394E-18
最差值 4.948372036158476E-10
平均值 4.956726707414725E-11

看图像,算法收敛速度很快,看结果非常的好,应该比之前的算法都要好。麻雀搜索算法的性能真的这么好吗?


  我们上面说过,麻雀搜索算法会收敛于原点和当前最优位置,上面的测试函数中a=b=0,最优解与原点重合了,当最优解与原点分离后算法的图像会是怎样的呢?
实验二:修改适应度函数最优解。
  适应度函数 。取a=b=50,再次实验,看看结果。

实验二图像
最优值 4.33944451222641E-11
最差值 0.00883558017791963
平均值 0.0013581003562688088

从图像可以看出,麻雀们在原点和最优解位置之间不停地徘徊,最后选择也聚集到了最优位置附近。看看结果,比实验一差太多,而且结果的方差也比之实验一的结果要大。
图像跟上一节对算法的分析向佐证。麻雀搜索算法在求解最优解在原点附近的问题时,其性能非常的好,远好于其他算法;而当待求解的问题的最优解距原点较远时,其性能将会迅速下降,此时麻雀搜索算法的性能只能说中规中矩,比不上粒子群,蜂群,差分进化等经典优化算法,略强于蝙蝠,水波等收敛速度较慢的算法。
  同时由于麻雀搜索算法的各麻雀收敛于当前最优解的方式是直接跳跃到当前最优解附近,不是像粒子群算法那样向最优解移动,这也导致了麻雀搜索算法容易陷入局部最优,且全局搜索能力较弱。


  上面麻雀搜索算法的不足,那么应该如何修改呢?
  以下仅个人建议1.去除向原点收敛的操作,2.减少向最优位置的跳跃,换成向最优位置的移动。具体的实现公式如下:
公式(1)修改如下:

  即发现者更新位置的策略为乘以一个均值为1,方差为1的正态分布随机数(1+Q)或者加上一个标准的正态分布随机数Q。
  公式(2)保留矩阵运算的那部分操作:

  即每只麻雀均会在全维度上向所跟随的发现者随机靠近。
  公式(3)修改如下

  即如果该麻雀是最优位置的麻雀它会逃到最优位置和最差位置之间的随机位置,否则,它会逃到自己和最优位置之间的随机位置, 为标准正态分布随机数,xw为当前最差麻雀的位置,xb为当前最好的麻雀的位置。
  改动几乎是魔改,简化了很多无效操作和故弄玄虚的步骤,下面看看实验结果。

实验三:按照公式(1-1)(2-2)(3-1)实验

问题维度(维度) 2
总群数量(种群数) 20
搜索次数(最大迭代次数) 50
ST(发现者警戒阈值) 0.8
PR(发现者比例) 20%
SD(侦查者比例) 10%
取值范围 (-100,100)
实验次数 10
实验三图像
最优值 5.039531125588296E-10
最差值 0.0100388039964667
平均值 0.0012543085021067958

从图像中可以看出麻雀不会再集中于原点了,同时麻雀有了一定的跳出局部最优能力,虽然跳出局部最优能力很弱,好过没有。从结果上看,其结果略差于实验(二)的结果,由于测试函数比较简单,目前看来差距不太大,其实高维的测试函数也做过实验,实验(三)的结果明显优于实验(二)。这个魔改还比较成功,不过改动太大,感觉都可以归于一个新算法了。

4. 总结

麻雀算法是今年(2020年)刚提出的算法,从文章上看,可能赶上疫情,时间比较紧迫,文中的公式有些许错误,算法的思想与实现不是很契合,算法的具体实现和实验有投机取巧之嫌。(仅个人一孔之见,轻喷)。
  算法的局部搜索能力极强,收敛速度较快,但全局搜索能力较弱且跳出局部最优的操作较弱,易陷入局部最优。整体结构上看,是一个弱化的人工蜂群算法。不过优化算法本就大同小异,经典的优化算法就那么几个,其他的新算法也好,知名算法也好,或多或少都会带有那几个经典优化算法的印迹,我们也无法否认它们是一个新的算法,只不过师出同门罢了。
  关于优化算法实验的投机取巧方面,希望大家有充分的认识,也许自己做了投机操作而不自知。说一下个人的惨痛经历然大家理解为什么叫投机取巧,简单来说就是算法的设计迎合测试函数,不考虑通用性。
  在自己刚学习优化算法的时候也曾一腔热血的想创造一个优化算法,当时用的测试函数比较古老,它们的最优解大多被设定在x=0处。当时自己曾写过一个优化算法,它所有的操作都会让输入值收敛到0。使用那些测试函数进行测试时,该算法的性能远远高于我所见过的所有算法。心想难道自己无意间创造了一个超级强悍的优化算法?答案是否定的,事出反常必有妖,当使用一些被处理过的测试函数(其最优解随机分布且函数进行了平移旋转)进行复试时,该算法的毛病就露出来了,它的结果还是在x=0附近,远不如哪些经典的算法。自己反复思考后得出,优化算法的结果不应该依赖所求解的问题。使用优化算法对同某个函数求解的结果不能依赖于结果的特性,就像不能因为最优结果是a,而去创造一个输出值收敛于a的算法,这是作弊行为,你都知道最终结果,为什么还要使用优化算法呢?
  关于测试函数的选取,不要再使用常见的论文中的测试函数,它们大多最优解取值为0,可以参考仅年的CEC算法竞赛中的测试函数,现在已经出到CEC2019还是CEC2020了,里面的测试函数比较靠谱。


参考文献
Xue J , Shen B . A novel swarm intelligence optimization approach: sparrow search algorithm[J]. Systems ence & Control Engineering An Open Access Journal, 2020, 8(1):22-34.提取码:q240

以下指标纯属个人yy,仅供参考

指标 星数
复杂度 ★★★☆☆☆☆☆☆☆
收敛速度 ★★★★★☆☆☆☆☆
全局搜索 ★★☆☆☆☆☆☆☆☆
局部搜索 ★★★★★★★☆☆☆
优化性能 ★★★★☆☆☆☆☆☆
跳出局部最优 ★☆☆☆☆☆☆☆☆☆
改进点 ★★★★★★★★☆☆

目录
下一篇 优化算法笔记(二十二)蚁狮算法

优化算法matlab实现(二十一)麻雀算法matlab实现

你可能感兴趣的:(优化算法笔记(二十一)麻雀搜索算法)