蛇优化(SO)算法(含MATLAB代码)

先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论。我会不定期在公众号里推送不同的智能优化算法,经典的,或者是近几年提出的新型智能优化算法,并附带MATLAB代码。

这篇文章的公众号链接在这里:点一下

蛇优化(SO)算法

这个算法我非常感兴趣,就连图片都是那么优美。但是也不得不事先说清楚,胆小者慎入,别到时吓得你在实验室尖叫……然后又在那儿骂我,这就不太好了。因为,这个算法叫蛇优化算法……

初次看见这个算法是2022年年初,当时觉得文章的图片很美,一直印象很深,仔细学习后发现,这算法的性能还是很先进的,在求解许多复杂函数上,收敛性远胜于其他算法……

蛇优化(Snake Optimizer, SO)算法是2022年才提出的,受启发于蛇的觅食和交配行为。这个算法本身不难,也比较容易实现,是一种值得推广的先进算法。此外,这个算法本身就是才提出的,所以它的作者会将它与近几年的state-of-the-art算法进行对比,因此SO算法具备优秀的收敛性能。它的原始参考文献如下:
Hashim F A, Hussien A G. Snake Optimizer: A novel meta-heuristic optimization algorithm[J]. Knowledge-Based Systems, 2022, 242: 108320.

在讲算法之前,先说一下这个期刊吧,KBS目前的IF是8.139,是中科院一区的TOP期刊,上面有很多关于智能优化算法的文章,所以大家可以关注下。并且,这个期刊对实验的要求很高,因此这个期刊上的算法,其性能一般都是能够得到保证的。非常不错的一个期刊,强烈推荐阅读。

先普及一点蛇的知识,方便理解算法的模型与设计。

蛇是爬行动物中的一种神奇生物。它们有无腿的细长身体,如图1所示。此外,和所有的鳞目动物一样,它们是冷血脊椎动物(变温动物)。几乎所有种类的蛇的头骨都有许多关节,这使它们能够吞下猎物,即使猎物比它们的头还大。目前共发现蛇类3600种,隶属520类,隶属20科。蛇生活中最有趣的事情是它们独特的交配行为。雌性蛇有许多繁殖特征(多次交配、季节性和繁殖方式)。雌性可以操纵基因型(配偶选择和精子竞争)和表现型(生理体温调节和巢穴选择)。

上图上图上图!

(a) 思考中的蛇 

(b) 蛇之间的个体交锋

(c) 蛇在产卵
图1 自然界中的蛇

(怎么样,这图是不是很舒服?!美极了!)

雄性和雌性之间交配的发生受一些因素的支配。蛇在春末夏初这两个温度较低的寒冷地区交配,但交配过程不仅取决于温度,还取决于食物的可获得性。如果温度低,食物可以获得,雄性之间会互相争斗以吸引雌性的注意。雌性可以决定是否交配。如果交配发生,雌性开始在巢穴或洞穴中产卵,一旦蛋生出来,它就离开。交配行为如图2所示。上图上图!

图2 蛇正在交配
(像不像麻花?一开始我就说了图片很优美……)

基于蛇的交配行为,作者就设计出了一种模仿蛇特殊交配行为的新型智能优化算法,也就是SO算法。对于每条蛇而言,如果在食物数量足够,温度很低的条件下,就会寻得最好的伴侣(也就是先有物质再说爱情!)。

01

灵感来源

蛇会在温度较低且有食物时进行交配,否则蛇只会寻找食物或吃掉现有的食物。根据这一信息,作者认为搜索过程有两个阶段:勘探(exploration)和开发(exploitation)。这是群智能优化中的两个重要概念,我后面再和大家讨论。

勘探在这里代表了环境因素影响,即寒冷的地方和食物,在这种情况下,蛇只在它的环境中寻找食物(局部搜索)。对于开发,这一阶段包括许多过渡阶段,以获得更有效的全局搜索。在有食物但温度很高的情况下,蛇只会专注于吃现有的食物。最后,如果食物充足而环境寒冷,这就会导致交配过程的发生;交配过程有战斗模式或交配模式。在战斗模式中,每只雄性会为了得到最好的雌性而战斗,而每只雌性则会努力选择最好的雄性(就好比为了某个女生,男生与男生进行决斗吧)。在交配模式中,每一对之间的交配发生与食物的数量有关。如果交配过程发生在搜索空间,雌性蛇有可能产卵,孵化出小蛇。

图3 孵化出的小蛇

02

算法设计

 作者依据上述启发,设计了SO算法,主要包括以下5个大的步骤:

2.1 种群初始化

初始化种群就是在搜索空间内随机产生N个个体作为原始种群进行计算。具体操作是每个个体的每一维随机产生一个取值范围以内的数。即:

(1)

其中,r是[0,1]之间的随机数,Xi是种群中的个体,而Xmin和Xmax分别为优化问题取值范围的上下边界。

2.2 将种群分为雌、雄两个子种群

作者假设雄性个体的数量为种群的50%,雌性也为50%。这样,种群就被分为两组:雄性组和雌性组。用以下2个公式来划分种群:

  (2)

(3)

其中,N为种群中的个体数,即种群规模;Nm为雄性个体数;Nf为雌性个体数。

2.3 评估每一组个体并确定温度和食物量

在每组中找到最好的个体,得到最好的雄性fbest,m和最好的雌性fbest.f以及食物位置ffood。最好的雄性和雌性分别就是两个子种群中的最优个体。温度可以用下面的等式来定义:

 (4)

其中,t为当前迭代次数,T为最大迭代次数。这样设计就使得温度是随着迭代而不断变化的,并且温度整体上是逐渐降低的,实现种群从全局搜索到局部勘探的过渡。

作者又定义了食物数量Q,食物数量可以通过下面的等式得到:

(5)

其中,c1是常数,等于0.5。这是作者设定的一个值。(5)式的设计保证了蛇的食物数量越来越多,越来越充足,从而模拟了低温且食物充足的环境,帮助蛇的交配和孵化。

2.4  勘探阶段(没有食物)

如果食物数量Q<阈值Threshold(0.25),蛇通过选择任意随机位置来搜索食物,并更新它们的位置。对勘探阶段的模拟,如下所述:

   (6)

其中,Xi,m为第i只雄性蛇的位置,Xrand,m为随机选择的雄性蛇的位置,rand是0到1之间的随机数。Am为雄性蛇找到食物的能力,计算方法如下:

 (7)

其中,frand,m为Xrand,m的适应度,而fi,m为Xi,m的适应度;c2为常数,取值为0.05。

    (8)

(这里先说明一下,原始文章中的公式(8)是打错了的,你们可以自己对照下)。其中,Xi,f为第i条雌性的位置,Xrand,f为随机选择的雌性蛇的位置;rand是[0,1]范围内的随机数;Af为雌性蛇寻找食物的能力,计算公式如下:

(9)

其中,frand,f是Xrand,f和的适应度,而fi,m为雌性蛇群中第i个个体的适应度。

2.5 开发阶段(食物存在)

食物数量Q>阈值Threshold的条件下:

这个其实不难理解,就好比人。我们在食物有限的情况下,填饱肚子是最重要的,因此只会在小范内搜索,即勘探;当食物充足时,我们往往想寻找一些更美味的食物,从而扩大寻找的范围,即开发

如果温度temperature>阈值Threshold(0.6),(这里也要注意下,这个阈值和前面那个阈值是两码事,我专门用不同的颜色区分了一下。此外,这里的温度是通过公式(4)计算出来时,是一种抽象的概念,并不代表实际的温度),那么此时环境的温度处于热状态(hot)。蛇只会寻找食物,位置更新公式如下:

(10)

其中,Xi,j为个体(雄性或雌性)蛇的位置,Xfood为最佳个体的位置,c3为常数,等于2。

如果温度temperature<阈值Threshold(0.6),那么此时环境的温度处于冷状态(cold),蛇将处于战斗模式或交配模式:

a). 战斗模式

(11)

其中,Xi,m为第i个雄性的位置;Xbest,f为雌蛇组中的最佳位置;rand是[0,1]范围内的随机数;FM为雄性蛇的战斗能力。

(12)

其中,Xi,f为第i个雌性的位置,Xbest,m为雄性群体中最优个体的位置,FF为雌性蛇的作战能力。(原文章中的公式(12)也有问题,等号后面应该是t,而不是t+1

FM和FF可分别由以下公式计算:

 (13)

 (14)

其中,fbest,f为雌性蛇组最佳个体的适应度,而fbest,m为雄性蛇组最佳个体的适应度,fi为个体i的适应度。

b). 交配模式

(15)

 (16)

其中,Xi,m为第i个雄性的位置;Xi,f为第i个雌性的位置;rand是[0,1]范围内的随机数;Mm和Mf分别表示雄性和雌性的交配能力,由以下公式计算:

 (17)
                               

  (18)

其中,fi,m为第i个雄性个体的适应度;fi,f第i个雌性个体的适应度。如果蛋蛋被孵化,则选择种群中最差的雄性和雌性个体进行替换:

 (19)

 (20)

其中,Xworst,m为雄性蛇组中的最差个体;而Xworst,f为雌性蛇组中的最差个体。

自此,作者便完整地提出了SO算法。我们可以发现,SO算法是基于双种群的。双种群相互利用种群内和种群间的信息进行搜索,兼顾勘探和开发,最终实现种群的进化。

03

计算流程

为了让大家更清晰SO算法的计算流程,这里我用visio绘制了它的计算流程图。虽然SO算法的计算公式较多,蛇在优化过程中存在多种行为,但其数学模型并不复杂,只要把每个判断下的操作理清楚就不难了。如图4所示。

 图4 SO算法的计算流程图

 

04

实验结果与分析

接下来我们来讨论下SO算法的性能,这里主要是利用测试函数进行一下简单的检验。在编码实现这个算法时,种群规模N我设置的50,最大迭代次数T为1000,测试函数的维度为30,其他的参数值均按照原始参考文献进行设置。

由于公众号篇幅有限,这里只简单讨论下。以Ackley、Zakharov和Rosenbrock基准函数为例,观察算法的收敛效果。如图5所示,分别绘制了SO算法在3种函数上的收敛曲线。

(a) Ackley函数

(b) Zakharov函数

(c) Rosenbrock函数

图5 SO算法收敛曲线

可以看出,SO算法在这些多峰函数上的收敛性还是比较优越的。当然,图中没有其他对比算法,在没有比较的情况下说它有效就显得有点苍白了。但就收敛曲线可以发现,SO算法在寻优过程中,能够跳出局部最优,后期收敛迅速。观察收敛曲线还可以看出,SO算法的缺点是在进化前期收敛速度非常缓慢,几乎看不到收敛趋势,进入进化的中后期才开始逐渐下降。因此,如果对SO算法感兴趣的同学,这个就是一个突破口,想办法提升它前期的收敛速度。

此外,由于是今年年初才提出的算法,它的理论体系还不完善,其全局收敛性没有得到证明,在实际问题中的应用也较少。因此,如果对SO感兴趣,还是有很多工作可以做的。
 

05

MATLAB代码

公众号:启发式算法讨论

猜你喜欢

转载自blog.csdn.net/jieyanping/article/details/128216679