斑点鬣狗算法(Pytyhon)

斑点鬣狗优化算法

摘要

本文提出了一种新的元启发式算法——斑点鬣狗优化算法。该算法背后的主要概念是斑点鬣狗与其协作行为之间的社会关系。SHO的三个基本步骤是寻找猎物、包围和攻击猎物,这三个步骤都是数学建模和实现的。将所提出的算法与最近开发的8种元启发式算法在29个著名的基准测试函数上进行了比较。还分析了收敛性和计算复杂度。 将该算法应用于5个实际约束和1个无约束工程设计问题,验证了其适用性。实验结果表明,该算法的性能优于其他竞争元启发式算法。

1. 引言

在过去的几十年里,现实生活问题的复杂性的提高增加了对更好的元启发式技术的需求。 这些已被用于获得实际工程设计问题的最优解。 由于它们的效率和复杂性,与其他现有的经典技术相比,它们变得更加流行。

元启发式方法大致分为三类,如基于进化的、基于物理的和基于群体的方法。

第一种技术是基于一般群体的元启发式,它是从生物进化中得到的,如繁殖、突变、重组和选择。进化算法的灵感来自自然选择理论,其中一个种群(即一组解决方案)试图在给定环境中基于适应度评估生存(定义为适应度评估)。进化算法通常在所有类型的问题的最优解附近表现良好,因为这些方法理想地不会对基本适应度或自适应景观做出任何假设。一些流行的基于进化的技术是遗传算法(GA)遗传规划(GP)进化策略(ES)基于生物地理学的优化器(BBO)。一些著名的技术,如遗传算法(GA)蚁群优化(ACO)粒子群优化(PSO)微分进化(DE)在不同的领域都很受欢迎。由于易于实现,元启发式优化算法在工程应用中更受欢迎(图(1))。

第二类是基于物理的算法。 在这些算法中,搜索代理根据引力、电磁力、惯性力等物理规则在整个搜索空间进行通信和移动。少数算法的名称是模拟退火(SA)引力搜索算法(GSA)大爆炸大危机(BBBC)充电系统搜索(CSS)黑洞算法(BH)中心力优化(CFO)小世界优化算法(SWOA)人工化学反应优化算法(ACROA)射线优化算法(RO)基于银河的搜索算法(GBSA)曲线空间优化(CSO)

最后一种是基于群体的算法,它基于社会生物的集体行为。 集体智力是由群体之间的相互作用及其环境所激发的。众所周知的SI技术算法是粒子群优化(PSO),另一种流行的智能技术是蚁群优化猴子搜索狼包搜索算法蜜蜂采集花粉算法(BCPA)杜鹃搜索(CS)海豚伴侣优化(DPO)蝙蝠启发算法(BA)萤火虫算法(FA)狩猎搜索(HUS)。一般来说,基于群的算法比基于进化的算法更容易实现,因为包含较少的算子(即:选择,交叉,变异)。除了这些,还有其他元启发式的技术灵感来自人类的行为。一些流行的算法是和谐搜索(HS)参数自适应和谐搜索(PAHS)基于方差的和谐搜索基于和谐搜索的重构算法(HSBRA)禁忌搜索(TS)组搜索优化器(GSO)帝国主义竞争算法(ICA)联赛冠军算法(LCA)烟火算法碰撞体优化(CBO)内部搜索算法(ISA)矿爆算法(MBA)足球联赛竞赛算法(SLC)寻人优化算法(SOA)基于社会的算法(SBA)交换市场算法(EMA)

元启发式算法的主要组成部分是探索和开发。探索确保算法到达搜索空间的不同有前途的区域,而开发则确保在给定区域内搜索最优解。需要对这些组件进行微调,以达到给定问题的最优解。由于优化问题的随机性,在这些分量之间进行平衡是很困难的。 这一事实促使我们开发一种新的元启发式算法来解决现实工程设计问题。

一个优化器解决问题集的性能不能保证解决所有不同性质的优化问题。 这也是我们工作的动机,并描述了一种新的基于元启发式的算法。

本文介绍了一种新的元启发式算法,用于优化约束和无约束设计问题。本文的主要目的是开发一种新的元启发式算法,名为斑点鬣狗优化(SHO),该算法受斑点鬣狗的社会等级和狩猎行为的启发。统一的集群可以帮助斑点鬣狗之间的有效的合作。SHO的主要步骤是受斑点鬣狗狩猎行为的启发。 在29个基准测试函数和6个实际结构优化问题上,对SHO算法的性能进行了评价。结果表明,SHO的性能优于其他竞争算法。

本文的其余部分结构如下:第二节介绍了所提出的SHO算法的概念。 实验结果和讨论见第3节。 在第四节中,对五个约束和一个无约束工程设计问题进行了SHO的性能测试,并与其他著名的算法进行了比较。 最后,在第五节中给出了结论和一些未来的研究方向。

元启发式算法算法统计

图1:元启发式算法统计

2. 斑点鬣狗优化器(SHO)

在这一部分中,详细描述了所提出的算法的数学建模。

2.1. 灵感

社会关系在本质上是动态的。 这些都受到网络与离开或加入人口的个人之间关系的变化的影响。 动物行为的社会网络分析分为三类:

  • 第一类包括环境因素,如资源可用性和与其他动物物种的竞争。
  • 第二类侧重于基于个人行为或素质的社会偏好。
  • 第三类科学家的关注较少,包括物种本身的社会关系。

动物之间的社会关系是我们工作的灵感,并将这种行为与斑点鬣狗相关,科学上被命名为Crocuta。

鬣狗是像狗一样的大型食肉动物。 它们生活在非洲和亚洲的热带草原、草原、次沙漠和森林中。 他们在野外存活10-12年,最多25年。

已知的鬣狗有四种,即斑点鬣狗、条纹鬣狗、棕色鬣狗和狼狗,它们的大小、行为和饮食类型各不相同。所有这些物种都有熊一样的态度因为前腿比后腿长。

斑点鬣狗是熟练的猎人和最大的其他三种鬣狗物种(即条纹,棕色和狼)。 斑点的鬣狗也被称为笑的鬣狗,因为它的声音非常类似于人类的笑声。 它们之所以被称为斑点,是因为它们的皮毛上有红棕色的斑点,带有黑点。 斑点鬣狗是复杂的,聪明的,高度社交的动物,非常可怕的声誉。 他们有能力无休止地争夺领土和食物。

在斑点鬣狗家族中,女性成员占主导地位,生活在他们的家族中。 然而,男性成员在成年后离开他们的氏族去寻找和加入一个新的氏族。 在这个新的家庭中,他们是最低级别的成员,以获得他们的份额。 加入氏族的男性成员总是与相同的成员(朋友)在一起很长一段时间。 而女性,总是有一个稳定的地方。关于斑点鬣狗的一个有趣的事实是,当发现新的食物来源时,它们会产生声音警报,这与人类的笑声非常相似。

根据Ilany等人的说法。斑点鬣狗通常成群结队地生活和狩猎,依靠一个信任的朋友网络有100多个成员。为了增加他们的网络,他们通常与另一个斑点鬣狗联系在一起,这是一个朋友的朋友,或者通过亲属关系而不是任何未知的斑点鬣狗联系在一起。斑点鬣狗是一种社会性动物,可以通过姿势和信号等特殊的叫声相互交流。他们使用多种感官程序来识别他们的亲属和其他个人。他们还可以识别第三方亲属,并对他们的宗族伙伴之间的关系进行排序,并在社会决策过程中使用这些知识。斑点鬣狗通过视觉、听觉和嗅觉追踪猎物。图(2)展示了斑点鬣狗的跟踪、追逐、包围和攻击机制。粘聚簇有助于斑点鬣狗之间的有效合作,并最大限度地提高适应度。本文对斑点鬣狗的狩猎技术和社会关系进行了数学建模,以设计SHO并进行优化。

斑点鬣狗捕食步骤

图2:斑点鬣狗捕食步骤

2.2. 数学模型和优化算法

在这一小节中,提供了搜索包围狩猎攻击猎物的数学模型。 然后概述了SHO算法。

2.2.1. 包围猎物

斑点鬣狗可以熟悉猎物的位置并包围它们。为了对斑点鬣狗的社会层次结构进行数学建模,我们认为目前最好的候选解是目标猎物或目标,因为搜索空间不知道先验,所以接近最优。其他搜索代理将尝试更新他们的位置,在定义最佳搜索候选解之后,关于最佳候选解。这种行为的数学模型由以下方程表示:
$$
\vec{D}{h}=\left|\vec{B} \cdot \vec{P}(x)-\vec{P}(x)\right|\tag{1}
$$

$$
\vec{P}(x+1)=\vec{P}{p}(x)-\vec{E} \cdot \vec{D}\tag{2}
$$

其中$\vec{D}{h}$定义了猎物和斑点鬣狗之间的距离,$x$指示当前迭代,$\vec{B}$和$\vec{E}$是系数向量,$\vec{P}$指示猎物的位置向量,$\vec{p}$是斑点鬣狗的位置矢量,$||$和$\cdot$分别是绝对值与向量乘法。

向量$\vec{B}$和$\vec{E}$计算如下:
$$
\vec{B}=2 \cdot r \vec{d}_{1}\tag{3}
$$

$$
\vec{E}=2 \vec{h} \cdot r \vec{d}_{2}-\vec{h}\tag{4}
$$

$$
\vec{h}=5-\left(\text {Iteration} *\left(5 / \text {Max}_{\text {Iteration}}\right)\right)\tag{5}
$$

其中$Iteration = 1,2,3,...,Max_{Iteration}$

为了适当平衡搜索和开发,在最大迭代次数($Max_{Iteration}$)过程中,$\vec h$从5线性下降到0。此外,随着迭代值的增加,这种机制促进了更多的开发。$\vec{rd_1}$,$\vec{rd_2}$是[0,1]中的随机向量。图(3)显示了在二位环境中公式1和2的影响。在这个图中,斑点鬣狗$(A,B)$可以将其位置更新到猎物的位置$(A*,B∗)$。通过调整$\vec{B}$和$\vec{E}$的值,可以到达关于当前位置的不同数目的位置。在三维环境中,斑点鬣狗可能更新的位置如图(4)所示。通过使用公式1和2,斑点鬣狗可以在猎物周围随机更新位置。因此,同样的概念可以进一步扩展到n维搜索空间。

2D斑点鬣狗捕食步骤

图3:2D斑点鬣狗捕食步骤

3D斑点鬣狗捕食步骤

图4:3D斑点鬣狗捕食步骤

2.2.2. 搜寻(狩猎)

斑点鬣狗通常成群结队地生活和狩猎,并依赖于信任的朋友网络和识别猎物位置的能力。为了从数学上定义斑点鬣狗的行为,我们假设最好的搜索代理,无论是最优的,都知道猎物的位置。其他搜索代理建立一个集群,可信的朋友组,朝向最佳搜索代理,并保存到目前为止获得的最佳解决方案来更新他们的位置。在这一机制中提出了以下方程:
$$
\vec{D}{h}=\left|\vec{B} \cdot \vec{P}-\vec{P}_{k}\right|\tag{6}
$$

$$
\vec{P}{k}=\vec{P}-\vec{E} \cdot \vec{D}_{h}\tag{7}
$$

$$
\vec{C}{h}=\vec{P}+\vec{P}{k+1}+\ldots+\vec{P}\tag{8}
$$

其中$\vec{P_h}$定义了第一最好的斑点鬣狗的位置,$\vec{P_k}$表示其他斑点鬣狗的位置。在这里,$N$表示斑点鬣狗的数量,计算如下:
$$
N=\operatorname{count}{\operatorname{nos}}\left(\vec{P}, \vec{P}{h+1}, \vec{P}, \ldots,\left(\vec{P}_{h}+\vec{M}\right)\right)\tag{9}
$$
其中$\vec{M}$是[0.5,1]中的随机向量,$nos$定义了解决方案的数量并计算所有候选解决方案,与$\vec{M}$相加后,它们与给定搜索空间中的最佳最优解非常相似,$\vec{C_h}$是一组N数的最优解。

2.2.3. 攻击猎物(使用)

为了对攻击猎物进行数学建模,我们降低了$\vec{h}$的值。$\vec{E}$的变化也被减小,以改变向量$\vec{h}$中的值,该值在迭代过程中可以从5下降到0。图(6)显示表明$|E|<1$迫使一群斑点鬣狗攻击猎物。攻击猎物的数学公式如下:
$$
\vec{P}(x+1)=\frac{\vec{C}_{h}}{N}\tag{10}
$$
其中$\vec{P}(x+1)$保存最佳解决方案,并根据最佳搜索代理的位置更新其他搜索代理的位置。 该SHO算法允许其搜索代理更新其位置并攻击猎物。

攻击猎物

图6:攻击猎物(|E| < 1)

2.2.4. 寻找猎物(搜索)

斑点鬣狗主要是根据栖息在载体$\vec{C_h}$中的斑点鬣狗群或集群的位置搜索猎物。他们彼此远离,寻找和攻击猎物。因此,我们使用随机值大于1或小于−1的$\vec{E}$来迫使搜索代理远离猎物。这种机制允许SHO算法进行全局搜索。找到合适的猎物,图(5)表明|E|>1有利于斑点鬣狗远离猎物。SHO算法的另一个组成部分是$\vec{B}$。在图3中,$\vec{B}$向量包含提供猎物随机权重的随机值。为了显示SHO算法的更多随机行为,假设向量$\vec{B}$>1优先于$\vec{B}$<1,以证明在距离上的效果,如公式3所示。这将有助于勘探和局部最优避免。 根据斑点鬣狗的位置,它可以随机决定猎物的重量,并可能使它僵硬或无法到达斑点鬣狗。我们有意地需要向量$\vec{B}$随机值,不仅在初始迭代期间,而且在最终迭代中。这种机制非常有助于避免局部优化问题,在最终迭代中比以往任何时候都更有帮助。最后,通过满足终止准则来终止SHO算法。

该算法的伪码表明,SHO如何解决优化问题,可以注意到以下几点:

  • 所提出的算法保存了在迭代过程中迄今获得的最佳解。
  • 所提出的包围机制定义了一个圆形的邻域周围的解决方案,可以扩展到更高的维度的鬣狗。
  • 随机向量$\vec{B}$和$\vec{E}$帮助不同随机位置都有鬣狗的候选解决方案
  • 所提出的狩猎方法允许候选解定位猎物的可能位置。
  • 利用调整向量$\vec{E}$和$\vec{h}$的达到进行探索和开发的可能性,并允许SHO在探索和开发之间容易转换。
  • 通过向量$\vec{E}$,一半的迭代用于搜索(探索)($|E| \geq 1$),另一半用于狩猎(开发)($|E| \leq 1$)。

搜索猎物

图5:搜索猎物(|E| > 1)

2.3 SHO的步骤和流程图(图(7))

SHO的步骤概述如下:

步骤1:初始化斑点鬣狗种群$P_i$,其中$i = 1,2,\dots,n$。

步骤2:定义SHO中:$h$,$B$,$E$和$N$的初始参数,并定义最大迭代次数

步骤3:计算每个搜索代理的适应度值

步骤4:在给定的搜索空间中探索最佳搜索代理。

步骤5:定义最优解组,即使用公式8和9直到找到满意的结果。

步骤6:使用公式10过呢更新搜索代理的位置

步骤7:检查是否有任何搜索代理超出给定搜索空间中的边界并调整它。

步骤8:计算更新搜索代理适应度值,如果有比以前的最优解更好的解,则更新向量$\vec{P_h}$。

步骤9:将一组斑点鬣狗$\C_h$更新为更新的搜索代理适应度值。

步骤10:如果满足停止准则,则算法将停止。 否则,返回到步骤5。

步骤11:返回最佳最优解,满足停止准则后,到目前为止得到。

SHO算法伪代码:

输入:斑点鬣狗种群$P_i(i=1,2,\dots,n)$

输出:最好的搜索代理

初始化参数$h,B,E,N$

计算每个搜索代理的适应度

$P_h=$ 最好的搜索代理

$C_h=$ 一组N数的最优解

while($x<Max_{iter}$):

​ for 每个搜索代理:

​ 搜索代理根据公式10更新当前位置

​ 更新$h,B,E,N$

​ 检查是否有搜索代理超出给定的搜索空间并调整

​ 计算每个搜索代理的适应度

​ 如果有比以前的最优解更好的解,则更新Ph

​ 更新群$C_h$关于$P_h$

​ $x=x+1$

返回$P_h$

斑点鬣狗优化流程图

图7:斑点鬣狗优化流程图

2.4. 计算的复杂性

在这一小节中,讨论了所提出的算法的计算复杂度。 下面给出了该算法的时间和空间复杂性。

2.4.1. 时间复杂度

  1. 初始化SHO种群需要O($n×dim$)时间,其中$n$表示生成随机种群的迭代次数,这是基于搜索代理的数量、下界和上界的测试函数。$dim$表示测试函数的维数,以检查和调整超出搜索空间的解决方案。
  2. 在下一步中,每个代理的适应度需要O($Max_{iter} \times n \times dim$)时间,其中$Max_{iter}$是模拟所提出算法的最大迭代次数。
  3. 它需要O($Max_{iter} \times N$)时间来定义斑点鬣狗群,其中$Max_{iter}$是算法的最大迭代,$N$是斑点鬣狗的计数值。
  4. 步骤2和和3将会重复直到找到满意的结果,需要O($k$)时间。

因此,步骤2和3的总复杂度为O($n \times Max_{iter} \times dim \times N$)。 因此,SHO算法的总体时间复杂度为O($k \times n \times Max_{iter} \times dim \times N$)。

2.4.2. 空间复杂度

SHO算法的空间复杂度是在其初始化过程中考虑的任意一次使用的最大空间量。因此,SHO算法的总空间复杂度为O($n \times dim$)。

3. 实验结果及讨论

本节描述了评估所提出算法性能的实验。 使用29个标准基准测试函数来评估所提出的算法的性能。 这些基准见第3.1节。 对结果进行了评价,并与八种著名的元启发式算法进行了比较。

3.1. 用于比较的基准测试函数和算法

将29个基准函数应用于所提出的算法中,以证明其效率。这些职能分为四大类,如单峰多模态定维多模态复合函数。这些都在附录A中描述。在附录A中,$Dim$和$Range$分别表示搜索空间的函数和边界的维数。表A(1-4)和A(2)分别展示了单峰,多模态基准函数,定维多模态和复合函数的描述。

七个测试函数(F1−F7)包含在单峰测试函数中。在第一组测试函数中,只有一个全局最优,并且没有局部最优,这使得它们非常适合于分析算法的收敛速度和开发能力。

第二类包括九个测试函数(F8−F16)。第三类包括十个测试函数(F14−F23)。在第二类和第三类测试函数中,除了全局最优之外,还有多个局部解,这对于检验局部最优避免和算法的探索性能力是有用的。

第四类包括六个复合测试函数(F24−F29)。这些复合基准函数是经典函数的移位、旋转、扩展和组合版本。

所有这些基准测试函数都是最小化问题。图8-11给出了单峰、多模、定维多模和复合函数测试用例的成本函数的二维图。

为了验证该算法的性能,选择了八种著名的算法进行比较。 这些是灰狼优化(GWO)粒子群优化(PSO)飞蛾扑火算法(MFO)多维优化算法(MVO)正弦余弦算法(SCA)引力搜索算法(GSA)遗传算法(GA)和谐搜索(HS)。每个算法的搜索代理数设置为30。观察到30是一个合理数量的搜索代理,用于解决优化问题,因为人工搜索代理的数量越多,确定全局最优的概率就越高。

3.2. 实验装置

表1提到了所提出的SHO和其他元启发式算法的参数设置,如GWO、PSO、MFO、MVO、SCA、GSA、GA和HS。所有这些参数都是根据报道的文献设置的。我们使用相同的初始化技术来比较SHO和上述元启发式算法。实验和算法在MatlabR2014a(8.3.0.532)版本中实现,并在2.40GHz的Corei-5处理器和4GB内存的64位Microsoft Windows8.1的环境中运行。最后一次迭代前得到的最优解的平均值和标准差作为性能指标。为了生成和报告结果,对于每个基准函数,SHO算法使用30个独立运行,其中每个运行使用1000次迭代。

3.3. 性能比较

为了证明所提出的算法的性能,将其结果与3.1节中提到的八种关于基准测试函数的著名元启发式算法进行了比较。

3.3.1. 功能评价F1-F7(开发)

函数F1−F7是单峰的,允许评估基于元启发式的算法的开发能力。

表2显示,与其他报道的方法相比,SHO具有很强的竞争力。 特别是,SHO是函数F1、F2、F3、F5和F7最有效的算法,并找到了最佳的最优解来评价其他基于元启发式的算法。该SHO算法可以提供最佳的开发。

单峰基准函数的二维版本

图8:单峰基准函数的二维版本

3.3.2. 功能评价F8-F23(探索)

多模态函数可能包括许多局部最优,它们可以指数增长。 这些测试问题具有评估优化算法探索的能力。表3和表4显示了F8−F23(多模态和固定维多模态函数)的结果,表明SHO具有良好的勘探能力。根据这些表格,SHO在七个测试问题(即F9、F11、F15、F16、F17、F18、F22)中效率最高,在其他测试问题中也具有竞争力。事实上,在大多数这些测试问题中,SHO算法是最有效的最佳算法。这些结果表明,SHO算法具有很好的探索价值。

多模态基准函数的二维版本

图9:多模态基准函数的二维版本

二维版本的固定维度多模态基准函数

图10:二维版本的固定维度多模态基准函数

3.3.3. 函数F24-F29的评估(避免局部最优)

在复合基准函数情况下的优化是一项非常具有竞争力的任务,因为勘探和开发之间的平衡可以远离局部最优问题。 在这种测试函数中,由于大量的局部最优,可以观察到算法的局部最优避免。表5显示,SHO算法是F26、F28和F29函数的最佳优化器,在其他情况下具有很强的竞争力。

函数F1−F29的结果表明,与其他优化方法相比,SHO是最有效的算法。为了进一步研究该算法的性能,下面将讨论六个经典的工程设计问题。

复合基准函数的二维版本

图11:复合基准函数的二维版本

3.4. 收敛性分析

收敛性分析背后的意图是增加对SHO算法中不同探索性和剥削机制的更好理解。观察到SHO的搜索代理探索了设计空间的有希望的区域,并开发了最好的区域。这些搜索代理在优化过程的开始阶段变化迅速,然后越来越收敛。图12给出了SHO、GWO、PSO、MFO、MVO、SCA、GSA、GA和HS的收敛曲线,并对其进行了比较。可以观察到,SHO与其他最先进的元启发式算法最具竞争力。在优化测试函数时,SHO表现出三种不同的收敛行为。在迭代的初始步骤中,由于其自适应机制,SHO对搜索空间的有前途的区域收敛速度更快。这种行为在测试函数F1、F3、F9、F11和F26中很明显。 在第二步中,SHO仅在F7测试函数中经验的最终迭代中收敛到最优。最后一步是从迭代的初始阶段开始的快速收敛,如F2和F17所示。 这些结果表明,SHO算法保持了探索和开发的平衡,以找到全局最优。总的来说,本节的结果暴露了所提出的SHO算法的不同特点,并且似乎在求解优化问题时,SHO算法的成功率很高。利用公式(10)进行高开发的斑点鬣狗的再定位机制,允许斑点鬣狗围绕群体中的猎物移动到目前为止获得的最佳解决方案。 由于SHO在迭代过程中显示了局部最优避免。然而如图(12)所示,与SHO算法相比,GWO、PSO、MFO、MVO、SCA、GSA、GA和HS等其他方法的成功率较低。

3.5. 可伸缩性研究

下一个实验是为了观察可伸缩性对各种基准测试功能的影响。 测试函数的维数从30变为50、50变为80和80-100。 如图(13)所示,SHO算法的性能在不同维数上提供了不同的行为。 所提出的算法的性能下降,还观察到性能中的降低不太多。 因此,它表明了所提出的算法在高可伸缩环境中的适用性。

3.6. 统计测试

除了基本的统计分析(即均值和标准差)外,还对上述算法进行了方差分析检验。 方差分析测试被用来测试从所提出的算法中获得的结果是否与其他竞争算法的结果有统计学意义的差异。

我们以样本量为30,95%的置信度进行方差分析测试。 基准函数的方差分析检验的结果分析列于表6。 结果表明,与其他竞争对手算法相比,该算法具有统计学意义。

4. 工程问题的SHO

在本节中,对SHO进行了五个约束和一个无约束工程设计问题的测试:焊接梁、拉伸/压缩弹簧、压力容器、减速机、滚动轴承单元和加载结构的位移。这些问题具有不同的约束条件,因此要优化这些问题,需要采用约束处理方法。有不同类型的惩罚函数来处理约束问题:

  • 静态惩罚:不依赖于当前生成数,并且在整个计算过程中始终保持不变。
  • 动态惩罚:在计算等效惩罚因子时涉及到当前的生成(随着时间的推移而增加,即迭代)。
  • 退火惩罚:系数在许多迭代过程中只改变一次。在每次迭代时,只考虑主动约束,这些约束不被困在局部最优状态中。
  • 适应性惩罚:从以前的搜索过程中获取反馈,只有当可行/不可行的解决方案被认为是种群中最好的解决方案时,才会发生变化。
  • 共同进化的惩罚:分成两个值(即Coeff和Viol),以找出违反的约束和相应的违反量。
  • 死亡惩罚:处理可以违反约束并分配零的适应度值的解决方案。 它可以在优化过程中丢弃不可行的解。

然而,该方法没有使用不可行解的信息,这进一步有助于解决主导不可行区域的问题。由于其简单性和较低的计算成本,SHO算法在本节中配备了死刑函数来处理约束。

4.1. 焊接梁设计

4.2. 张力/压缩弹簧设计问题

4.3. 压力容器设计

4.4. 减速机设计问题

4.5. 滚动元件轴承设计问题

4.6. 加载结构的位移

5. 结论

本文提出了一种新的基于群的优化算法——斑点Hyena优化器(SHO)。启发这种方法的基本概念是受社会等级和斑点鬣狗狩猎行为的启发。本文提出了求解29个测试函数的SHO算法,对探索、开发、局部最优回避和收敛行为进行了分析。此外,还利用六个实际工程设计问题来进一步检验SHO算法的效率。结果表明,与GWO、PSO、MFO、MVO、SCA、GSA、GA和HS等著名启发式算法相比,SHO提供了极具竞争力的结果。统计结果基于所提出的SHO与其他优化方法的比较,表明所提出的方法可以处理各种类型的约束,并提供比其他优化器更好的解决方案。所提出的求解实际优化问题的方法可能需要较少的计算工作量来找到最优解。

可以为未来的工作推荐几个研究方向。可以解决不同领域的优化问题。二进制版的SHO可以是另一个激励未来的工作。此外,将该算法扩展到多目标问题和多目标问题上也可以看作是未来的贡献。

代码

import time
import numpy as np
from matplotlib import pyplot as plt
from scipy import special


# 基准测试1参数初始化
class BMT1:
    d = 30  # 问题维度
    min_scope = -100  # 范围最小值
    max_scope = 100  # 范围最大值

    # 问题适合度设置并评估,返回值为数组,意为群体各个体的适应度的值
    def fitness(self):
        fit = np.zeros(len(self))
        for i in range(len(self)):
            for j in range(len(self[i])):
                fit[i] = fit[i] + np.power(self[(i, j)], 2)
        return fit


# 基准测试2参数初始化
class BMT2:
    d = 10  # 问题维度
    min_scope = -5.12
    max_scope = 5.12

    # 问题适合度设置并评估,返回值为数组,意为群体各个体的适应度的值
    def fitness(self):
        fit = np.zeros(len(self))
        for i in range(len(self)):
            for j in range(len(self[i])):
                fit[i] = fit[i] + (np.power(self[(i, j)], 2) - 10 * np.cos(2 * np.pi * j) + 10)
        return fit


SHO_iter_max = 1000
SHO_n = 20

BMT = BMT1
SHO_pop = BMT.max_scope - (BMT.max_scope - BMT.min_scope) * np.random.rand(SHO_n, BMT.d)
SHO_mem_pop = SHO_pop.copy()
SHO_fit = BMT.fitness(SHO_pop)
SHO_mem_fit = SHO_fit.copy()
print("SHO_mem_pop:\n" + str(SHO_mem_pop))
print("SHO_mem_fit:\n" + str(SHO_mem_fit))
print("\n\n\n")

for SHO_iter in range(SHO_iter_max):
    SHO_h = 5 - (SHO_iter * (5 / SHO_iter_max))
    print("当前为第 " + str(SHO_iter) + " 次迭代,当前SHO_h为:" + str(SHO_h))
    for i in range(SHO_n):
        print("当前为第 " + str(i) + " 只鬣狗")
        print("当前位置:" + str(SHO_pop[i]))
        print("当前适应度:" + str(SHO_mem_fit[i]))
        SHO_rd1 = np.random.uniform()
        SHO_rd2 = np.random.uniform()
        SHO_B = 2 * SHO_rd1
        SHO_E = 2 * SHO_h * SHO_rd2 - SHO_h
        print("SHO_rd1: {0}\nSHO_rd2: {1}\nSHO_B  : {2}\nSHO_E  : {3}".format(SHO_rd1, SHO_rd2, SHO_B, SHO_E))
        if np.abs(SHO_E) > 1:
            # 搜索
            print("进行搜索")
            SHO_Dh = np.abs(np.dot(SHO_B, SHO_pop[np.argmin(SHO_mem_fit)]) - SHO_pop[i])
            print("SHO_Dh    : " + str(SHO_Dh))
            SHO_pop[i] = SHO_pop[np.argmin(SHO_mem_fit)] - np.dot(SHO_E, SHO_Dh)
            print("SHO_pop[0]: " + str(SHO_pop[i]))
            if not ((BMT.min_scope < SHO_pop[i]) & (SHO_pop[i] < BMT.max_scope)).all():
                print("超范围,随机获取新位置")
                SHO_pop[i] = BMT.max_scope - (BMT.max_scope - BMT.min_scope) * np.random.rand(BMT.d)
            print("SHO_pop[0]: " + str(SHO_pop[i]))
            SHO_fit[i] = BMT.fitness(np.asarray([SHO_pop[i]]))
        else:
            # 开发
            print("进行猎杀")
            SHO_pop_friend = []
            for j in range(SHO_n):
                SHO_Dh = np.abs(np.dot(SHO_B, SHO_pop[np.argmin(SHO_mem_fit)]) - SHO_pop[j])
                if np.all(SHO_Dh < np.random.uniform(0.5, 1, BMT.d)):
                    SHO_pop_friend.append(SHO_pop[np.argmin(SHO_mem_fit)] - np.dot(SHO_E, SHO_Dh))
            print("SHO_pop_friend:\n" + str(SHO_pop_friend))
            if len(SHO_pop_friend) == 0:
                print("未发现同伴")
            else:
                SHO_pop[i] = np.mean(np.asarray(SHO_pop_friend), axis=0)
                SHO_fit[i] = BMT.fitness(np.asarray([SHO_pop[i]]))
                print("猎杀效果:" + str(SHO_pop[i]))
                print("猎杀后的适应度:" + str(SHO_fit[i]))
        if SHO_fit[i] < SHO_mem_fit[i]:
            print("原位置:" + str(SHO_mem_pop[i]))
            print("现位置:" + str(SHO_pop[i]))
            SHO_mem_pop[i] = SHO_pop[i]
            SHO_mem_fit[i] = SHO_fit[i]
        print("\n\n\n")
    print("SHO_mem_pop:\n" + str(SHO_mem_pop))
    print("SHO_mem_fit:\n" + str(SHO_mem_fit))
    if SHO_iter != SHO_iter_max - 1:
        print("\n\n\n\n\n")

posted @ 2021-06-18 13:28  MO_OF  阅读(1143)  评论(1编辑  收藏  举报