群体优化算法:螺旋动态优化 (SDO) 算法
目录
1.概述
科学文献介绍了基于自然和种群各个方面的各种元启发式优化算法。这些算法可分为多个类别,例如:集群智能、物理、化学、人类社会行为、植物、动物等。有许多基于集群智能的元启发式优化算法。基于物理现象的算法也被广泛提出并成功应用于各个领域。
基于集群智能的算法在寻找最佳解决方案的过程中融入了智能元素。它们模拟蜂群或蚁群的行为,在这种行为中,单个代理之间交换信息并合作实现共同目标。这些算法在处理需要全局搜索和适应不断变化的条件的问题时非常有效。
另一方面,基于物理的算法依靠物理定律和原理来解决优化问题。它们模拟重力、电磁学或热力学等物理现象,并利用这些原理找到最佳解决方案。基于物理的算法的主要优势之一是易于解释。它们可以准确而一致地显示整个搜索区域的动态。
此外,一些基于物理的算法使用黄金分割率,这是一种数学自然比例,具有特殊属性,有助于快速高效地收敛到最优解。黄金分割率已被研究并应用于多个领域,包括人工神经网络优化、资源分配等。
因此,基于物理的元启发式优化算法为解决复杂的优化问题提供了强有力的工具。它们的精确性和对基本物理原理的应用,使其在需要高效搜索最优解的各个领域都具有吸引力。
螺旋动力学优化(Spiral Dynamics Optimization,SDO)是由 Tamura 和 Yasuda 于 2011 年提出的最简单的物理算法之一,它是利用自然界中的对数螺旋现象而开发的。算法简单,控制参数少。此外,该算法还具有计算速度快、局部搜索能力强、前期多样化和后期强化等特点。
自然界中有许多螺旋,如星系、极光、动物角、龙卷风、贝壳、蜗牛、氨虫、变色龙尾巴或海马。在人类诞生之初创造的古代艺术中也能看到螺旋。多年来,一些研究人员努力了解螺旋序列和复杂性,并开发出螺旋方程和算法。自然界中经常出现的螺旋现象是在星系和热带气旋中观察到的对数螺旋。离散对数螺旋生成过程作为元启发式算法中的高效搜索行为来实现,这为螺旋动力学优化算法的开发提供了灵感。
可见螺旋序列图案在自然界中可以找到很多代表,例如植物、树木、波浪和许多其他形状。自然界中的视觉模式可以用混沌理论、分形、螺旋和其他数学概念来建模。在一些自然形态中,螺旋和分形密切相关。例如,斐波那契螺旋是基于黄金分割率和斐波那契数字的对数螺旋的变体。由于它是对数曲线,因此在每个尺度上看起来都是一样的,也可以被视为分形。
上述模式激发了研究人员开发优化算法的灵感。螺旋轨迹有多种类型,以下是主要的几种:
- 阿基米德螺旋
- 摆线螺旋
- 外摆线螺旋
- 次摆线螺旋
- 对数螺旋
- 玫瑰螺旋
- 费马螺旋
每种螺旋都有自己独特的属性,可以用来模拟各种自然形态。其中特别强调了基于螺旋路径概念的各种自然启发优化算法。多年来,研究人员利用螺旋运动开发了各种新的优化算法。
此外,可以通过使用螺旋路径作为上层结构或补充来修改非螺旋算法的行为,以提高最优解的准确性。
Tamura 和 Yasuda 提出的二维螺旋优化算法是一种针对二维连续优化问题的多点元启发式搜索方法。随后,Tamura 和 Yasuda 利用二维优化的理念提出了 n 维优化。
2.算法
作者介绍的用于多维空间搜索的 SDO 算法有其局限性和缺点:- 不适用于一维问题和其他奇数维度的优化问题。
- 通过该算法将坐标成对连接会影响特定问题的解决方案的质量,并在综合测试中显示假阳性结果。
在多维空间中构建螺旋轨迹存在一定的困难。因此,如果问题局限于一维空间,那么螺旋就不能在通常意义上构建,因为螺旋至少需要在二维中运动。在这种情况下,我们可以使用一个简单的函数来随时间改变坐标值,而不使用螺旋线。如果我们谈论的是一维优化问题,那么就不使用螺旋线,因为沿着螺旋线的运动没有额外的维度。
在多维空间中,可以为每对坐标构建螺旋,但对于剩下的一个坐标,则无法定义螺旋。例如,在一个 13 维空间中,有可能为 6 对坐标构建螺旋,但其中一个坐标的移动不包含螺旋成分。
要在多维空间中构造螺旋,我们可以使用“多维螺旋”或“超螺旋”方法。这种方法包括引入额外的虚拟坐标,并在每个维度中定义螺旋形状。为了构造超螺旋,我们可以使用基于多维空间几何的旋转矩阵和算法。然而,这种方法需要更复杂的计算,并且可能难以在实际的优化问题中实现。
由于文章使用的多维函数是反复重复的二维函数,原始的 SDO 会显示出不合理的高结果,因为它使用的是成对坐标绑定。因此,螺旋算法在其他坐标互不相关的多维问题上效果不佳。换句话说,在这种情况下,我们会无意中为螺旋算法在重复函数上创建完美条件。
为了避免螺旋算法的上述问题,我提出了一种基于二维螺旋投影到一个坐标轴上的方法。如果我们将二维螺旋上一个点的运动视为钟摆的运动,那么该点运动在两个坐标中的每一个上的投影将与钟摆运动在每一个坐标上的投影一致。因此,我们可以使用摆点运动在多维空间中的每个轴上的投影来模拟二维空间中的点螺旋运动。
当使用构建螺旋的方法来模拟多维空间中每个坐标处的摆行为时,每个“虚拟”螺旋的半径可能不同。这可以对优化的质量产生积极影响,因为一些坐标可能更接近已知的最优值,并且不需要显著改变。
我们可以将任何具有阻尼的谐波振动定律视为二维螺旋在一维轴上的投影。我选择了一个简单的阻尼谐振子(点位置对时间的依赖性),其公式如下:
x(t) = A*e^(-γt)*cos(ωt + φ)
其中:
- A - 振荡幅度
- γ - 阻尼比
- ω - 振荡器固有频率
- φ - 振荡的初始相位
公式清楚地表明,阻尼比、频率和初始相位都是常数,可用作算法的输入参数,但我们将使用的不是三个参数,而是两个参数。我们将在每次迭代时使用振荡的初始相位作为随机分量(每个坐标的相位将相对于其他坐标略有偏移),否则该算法是完全确定的,仅取决于点在空间中的初始位置。
其思想是,一旦发现新的最佳全局极值,就会为所有点计算新的振幅,即全局极值的坐标与该点的相应坐标之间的差。从这一点开始,沿着坐标的振幅是单独的,并存储在每个点的存储器中,直到发现新的更好的极值并确定新的振幅。
在确定振幅后,每个点开始衰减振荡,其中振荡的对称轴是全局最优的已知坐标。利用图 1 和图 2 可以直观地评估阻尼比和频率(外部参数)的影响。
图 1.振幅对振荡性质的影响
图 2.频率对振荡性质的影响
虽然在我们的算法中,所有坐标都是绝对独立的,但如前所述,在构建螺旋的逻辑中,它们之间并不存在成对的组合和关联。如果我们在二维平面上构建一个点的运动,就会得到如下图 3 所示的螺旋形。
图 3.假设螺旋采用默认算法参数,其中振幅值为 6,阻尼比为 0.3,频率为 4
事实上,在实际问题和测试函数中,沿每个坐标的振幅并不一定要相同(与原始算法不同)。振幅的差异会产生扁平的螺旋。振幅越小,相应坐标的细化速度越快,因为它更接近已知的最佳值。
图 4.沿 Y 坐标方向的点的值更接近已知值,其振幅小于沿 X 轴方向的值
由于我们考虑的是相对于已知最佳值的差值,即从零开始的位移是一个增量,因此图表上的所有图形都是相对于零点绘制的。
下面我们来看看代码说明。首先,让我们确定算法的结构并创建伪代码:
- 初始化点群
- 计算适应度函数值
- 当出现新的最佳值时,计算每个点坐标的振幅
- 当出现新的最佳点时,随机 "抛出 "最佳点
- 利用阻尼谐振方程计算各点的新位置
- 重复第 2 点。
第 4 点是特别添加的,目的是增加被卡住的阻力,使各点不会 "螺旋式 "地汇聚到某个局部极值并卡在那里。算法的作者并没有涉及这一主题。
S_Particle 结构包含以下变量,非常适合描述代理(粒子、点):
- c [] - 粒子坐标数组
- cD[] - 粒子速度数组
- t - 迭代步长,在公式中扮演 "时间" 的角色
- f - 粒子适应度函数值
该结构还定义了 Init 函数,用于初始化结构变量。coords 参数指定粒子坐标的数量。
//—————————————————————————————————————————————————————————————————————————————— struct S_Particle { void Init (int coords) { ArrayResize (c, coords); ArrayResize (cD, coords); t = 0; f = -DBL_MAX; } double c []; //coordinates double cD []; //coordinates int t; //iteration (time) double f; //fitness }; //——————————————————————————————————————————————————————————————————————————————
让我们定义 SDOm 算法类 - C_AO_SDOm。该类包含以下变量和方法:
- cB [] - 最佳坐标数组
- fB - 最佳坐标的适应度函数值
- p [] - 粒子数组,数据类型 - S_Particle
- rangeMax [] - 最大搜索范围值数组
- rangeMin [] - 最小搜索范围值数组
- rangeStep [] - 搜索步长数组
- Init - 初始化类参数的方法,接受以下参数:coordinatesNumberP - 坐标数,populationSize - 群体大小,dampingFactorP - 阻尼比,frequencyP - 频率,precisionP - 精度。
- Moving - 在搜索空间移动粒子的方法
- Revision - 修订和更新最佳坐标的方法
- coords - 坐标数
- popSiz - 群体大小
- A、e、γ、ω、φ - 阻尼谐振公式的分量
- precision、revision - 在类中使用的私有变量
- SeInDiSp - 以给定步长计算给定范围内的新坐标值
- RNDfromCI - 在给定范围内生成随机数的方法
代码描述了 C_AO_SDOm 类,该类代表了该算法的实现,并带有用于修改和更新最佳坐标的附加函数。
类的前三个变量分别是 cB 数组(存储最佳坐标)、fB 变量(存储最佳坐标的适应度函数值)和 p 数组(存储群体的候选粒子)。
接下来的三个类变量是 rangeMax、rangeMin 和 rangeStep 数组,分别存储搜索范围的最大值和最小值以及搜索步长。
此外,该类还包含三个公有方法:Init、Moving 和 Revision。Init 用于初始化类参数和创建初始粒子群。Moving 用于在搜索空间内移动粒子。Revision 用于修订最佳坐标并更新其值。
该类还包含几个在类中使用的私有变量。这些变量是 coords 和 popSize 变量,分别存储坐标数量和群体数量。A 变量用于 Moving 方法,"precision"变量存储精度值,"revision"变量负责修正最佳坐标的需要。
该类包含几个私有方法:Research、SeInDiSp 和 RNDfromCI。Research 用于研究新的粒子坐标,而 SeInDiSp 和 RNDfromCI 则用于计算给定范围内的随机值。
"precision"是算法的一个外部参数,负责沿阻尼振荡轨迹运动的离散性。数值越大,轨迹再现越精确,数值越小,轨迹越 "粗糙"(这并不意味着会对结果产生负面影响,这取决于任务)。经过我的一系列实验,默认设置选择了最佳设置。
//—————————————————————————————————————————————————————————————————————————————— class C_AO_SDOm { //---------------------------------------------------------------------------- public: double cB []; //best coordinates public: double fB; //FF of the best coordinates public: S_Particle p []; //particles public: double rangeMax []; //maximum search range public: double rangeMin []; //manimum search range public: double rangeStep []; //step search public: void Init (const int coordinatesNumberP, //coordinates number const int populationSizeP, //population size const double dampingFactorP, //damping factor const double frequencyP, //frequency const double precisionP); //precision public: void Moving (); public: void Revision (); //---------------------------------------------------------------------------- private: int coords; //coordinates number private: int popSize; //population size private: double A; private: double e; private: double γ; private: double ω; private: double φ; private: double precision; private: bool revision; private: double SeInDiSp (double In, double InMin, double InMax, double Step); private: double RNDfromCI (double min, double max); }; //——————————————————————————————————————————————————————————————————————————————
C_AO_SDOm 类的 Init 方法用于初始化类参数和创建初始粒子群。
首先,MathSrand 用于重置随机数生成器,GetMicrosecondCount 函数用于初始化生成器。
接下来,该方法为 "fB" 和 "revision" 变量设定初始值,并为参与阻尼振荡公式的常量变量赋值。
//—————————————————————————————————————————————————————————————————————————————— void C_AO_SDOm::Init (const int coordinatesNumberP, //coordinates number const int populationSizeP, //population size const double dampingFactorP, //damping factor const double frequencyP, //frequency const double precisionP) //precision { MathSrand ((int)GetMicrosecondCount ()); // reset of the generator fB = -DBL_MAX; revision = false; coords = coordinatesNumberP; popSize = populationSizeP; e = M_E; γ = dampingFactorP; ω = frequencyP; φ = 0.0; precision = precisionP; ArrayResize (rangeMax, coords); ArrayResize (rangeMin, coords); ArrayResize (rangeStep, coords); ArrayResize (cB, coords); ArrayResize (p, popSize); for (int i = 0; i < popSize; i++) { p [i].Init (coords); } } //——————————————————————————————————————————————————————————————————————————————我们将使用 Moving 方法在搜索空间中移动粒子。
第一个代码块(if (!revision) )仅在第一次迭代时执行,目的是在搜索空间中随机放置粒子。然后,该方法会将 "revision" 值设置为 "true",以便下次使用正常代码块。
该方法代码的下一部分负责移动群体粒子。如果当前粒子的适应度值等于最佳坐标的适应度值(p[i].f == fB),则粒子坐标的更新方式与第一个代码块相同。这意味着粒子会被随机抛离其位置,以防止所有粒子都聚集在一个点上。
否则,该方法会使用 t 变量,利用迭代计数器模拟每个粒子的当前时间(当更新最佳全局解决方案时,该计数器将重置)。然后使用阻尼谐波振荡方程计算每个粒子的坐标。
代码中注释掉的部分为公式计算的坐标值添加了一个随机增量,可用于创建美丽的视觉烟花效果。然而,这种效果没有实际价值,也没有改善结果,因此代码被注释掉了。
//—————————————————————————————————————————————————————————————————————————————— void C_AO_SDOm::Moving () { //---------------------------------------------------------------------------- if (!revision) { for (int i = 0; i < popSize; i++) { for (int c = 0; c < coords; c++) { p [i].c [c] = RNDfromCI (rangeMin [c], rangeMax [c]); p [i].c [c] = SeInDiSp (p [i].c [c], rangeMin [c], rangeMax [c], rangeStep [c]); } } revision = true; return; } //---------------------------------------------------------------------------- int t = 0.0; for (int i = 0; i < popSize; i++) { if (p [i].f == fB) { for (int c = 0; c < coords; c++) { p [i].c [c] = RNDfromCI (rangeMin [c], rangeMax [c]); p [i].c [c] = SeInDiSp (p [i].c [c], rangeMin [c], rangeMax [c], rangeStep [c]); } continue; } p [i].t++; t = p [i].t; for (int c = 0; c < coords; c++) { A = p [i].cD [c]; φ = RNDfromCI (0.0, 2.0); p [i].c [c] = p [i].c [c] + A * pow (e, -γ * t / precision) * cos (ω * t / (precision) + φ);// + RNDfromCI (-0.01, 0.01) * (rangeMax [c] - rangeMin [c]); p [i].c [c] = SeInDiSp (p [i].c [c], rangeMin [c], rangeMax [c], rangeStep [c]); } } } //——————————————————————————————————————————————————————————————————————————————
Revision 类方法用于更新最佳坐标,并计算粒子坐标与已知最佳解决方案之间的差值。这种差异作为初始振幅,一旦找到新的更好的解决方案,粒子将开始围绕位于这些运动中心的最佳已知坐标振荡。
//—————————————————————————————————————————————————————————————————————————————— void C_AO_SDOm::Revision () { //---------------------------------------------------------------------------- bool flag = false; for (int i = 0; i < popSize; i++) { if (p [i].f > fB) { flag = true; fB = p [i].f; ArrayCopy (cB, p [i].c, 0, 0, WHOLE_ARRAY); } } if (flag) { for (int i = 0; i < popSize; i++) { p [i].t = 0; for (int c = 0; c < coords; c++) { p [i].cD [c] = (cB [c] - p [i].c [c]); } } } } //——————————————————————————————————————————————————————————————————————————————
3.测试结果
试验台的结果似乎不错:
C_AO_SDOm:100;0.3;4.0;10000.0
=============================
5 Rastrigin's; Func runs 10000 result:76.22736727464056
Score:0.94450
25 Rastrigin's; Func runs 10000 result:64.5695106264092
Score:0.80005
500 Rastrigin's; Func runs 10000 result:47.607500083305425
Score:0.58988
=============================
5 Forest's; Func runs 10000 result:1.3265635010116805
Score:0.75037
25 Forest's; Func runs 10000 result:0.5448141810532924
Score:0.30817
500 Forest's; Func runs 10000 result:0.12178250603909949
Score:0.06889
=============================
5 Megacity's; Func runs 10000 result:5.359999999999999
Score:0.44667
25 Megacity's; Func runs 10000 result:1.552
Score:0.12933
500 Megacity's; Func runs 10000 result:0.38160000000000005
Score:0.03180
=============================
All score:4.06967
SDOm 算法的可视化揭示了一些独特的特征:所有测试函数的收敛图都是不稳定的,收敛曲线的性质在所有迭代中都会发生变化。这不会增加对结果的信心。Megacity 函数可视化特别显示了多次重复测试(视频中通常只显示一次,这样 GIF 就不会太大),以显示不同测试结果的不稳定性。结果的分布范围很大。
除了尖锐的 Forest 和离散的 Megacity 的粒子坐标线清晰可见外,没有发现其他粒子运动性质上的特征。很难判断这是好事还是坏事。例如,在 ACOm 算法的情况下,这是定性收敛的标志,但在 SDOm 的情况下可能不是这样。
Rastrigin 测试函数中的 SDOm。
Forest 测试函数中的 SDOm。
Megacity 测试函数中的 SDOm。
在使用 Moving 方法中注释的代码(该代码负责向粒子坐标添加随机噪声)时,出现了类似于烟花的有趣现象,而振荡相位的随机变化却没有被使用。我猜想,在粒子的质量收敛到已知解之后,它们会向不同的方向喷射,这就是在算法被卡住的那一刻显示出美丽效果的原因。这可以从烟花爆炸与收敛图水平部分开始的重合性中看出。
展示无用但美丽的烟花效果。
SDOm 算法的总体结果相当不错,在参加评级表审查的 23 个算法中名列第 8 位。在平滑 Rastrigin 函数方面,SDOm 的效果明显更好。陷入困境的倾向会干扰复杂的 Forest 和 Megacity 函数的结果。
# | AO | 描述 | Rastrigin | Rastrigin 最终 | Forest | Forest 最终 | Megacity (discrete) | Megacity 最终 | 最终结果 | ||||||
10 p(5 F) | 50 p(25 F) | 1000 p(500 F) | 10 p(5 F) | 50 p(25 F) | 1000 p(500 F) | 10 p(5 F) | 50 p(25 F) | 1000 p(500 F) | |||||||
1 | SDSm | 随机扩散搜索 M(stochastic diffusion search M) | 0.99809 | 1.00000 | 0.69149 | 2.68958 | 1.00000 | 1.00000 | 1.00000 | 3.00000 | 1.00000 | 1.00000 | 1.00000 | 3.00000 | 100000 |
2 | SDS | 随机扩散搜索(stochastic diffusion search) | 0.99737 | 0.97322 | 0.58904 | 2.55963 | 0.96778 | 0.93572 | 0.79649 | 2.69999 | 0.78696 | 0.93815 | 0.71804 | 2.44315 | 88.208 |
3 | SSG | 树苗播种和生长(saplings sowing and growing) | 1.00000 | 0.92761 | 0.51630 | 2.44391 | 0.72654 | 0.65201 | 0.83760 | 2.21615 | 0.54782 | 0.61841 | 0.99522 | 2.16146 | 77.678 |
4 | HS | 和声搜索(harmony search) | 0.99676 | 0.88385 | 0.44686 | 2.32747 | 0.99882 | 0.68242 | 0.37529 | 2.05653 | 0.71739 | 0.71842 | 0.41338 | 1.84919 | 70.647 |
5 | IWO | 入侵性杂草优化(invasive weed optimization) | 0.95828 | 0.62227 | 0.27647 | 1.85703 | 0.70690 | 0.31972 | 0.26613 | 1.29275 | 0.57391 | 0.30527 | 0.33130 | 1.21048 | 48.267 |
6 | ACOm | 蚁群优化M(ant colony optimization M) | 0.34611 | 0.16683 | 0.15808 | 0.67103 | 0.86785 | 0.68980 | 0.64798 | 2.20563 | 0.71739 | 0.63947 | 0.05579 | 1.41265 | 47.419 |
7 | MEC | 思维进化计算(mind evolutionary computation) | 0.99270 | 0.47345 | 0.21148 | 1.67763 | 0.60691 | 0.28046 | 0.21324 | 1.10061 | 0.66957 | 0.30000 | 0.26045 | 1.23002 | 44.061 |
8 | SDOm | 螺旋动力学优化 M(spiral dynamics optimization M) | 0.81076 | 0.56474 | 0.35334 | 1.72884 | 0.72333 | 0.30644 | 0.30985 | 1.33963 | 0.43479 | 0.13289 | 0.14695 | 0.71463 | 41.370 |
9 | COAm | 布谷鸟优化算法 M(cuckoo optimization algorithm M) | 0.92400 | 0.43407 | 0.24120 | 1.59927 | 0.58309 | 0.23477 | 0.13842 | 0.95629 | 0.52174 | 0.24079 | 0.17001 | 0.93254 | 37.845 |
10 | FAm | 萤火虫算法 M(firefly algorithm M) | 0.59825 | 0.31520 | 0.15893 | 1.07239 | 0.51012 | 0.29178 | 0.41704 | 1.21894 | 0.24783 | 0.20526 | 0.35090 | 0.80398 | 33.152 |
11 | ABC | 人工蜂群(artificial bee colony) | 0.78170 | 0.30347 | 0.19313 | 1.27829 | 0.53774 | 0.14799 | 0.11177 | 0.79750 | 0.40435 | 0.19474 | 0.13859 | 0.73768 | 29.784 |
12 | BA | 蝙蝠算法(bat algorithm) | 0.40526 | 0.59145 | 0.78330 | 1.78002 | 0.20817 | 0.12056 | 0.21769 | 0.54641 | 0.21305 | 0.07632 | 0.17288 | 0.46225 | 29.488 |
13 | CSS | 带电系统搜索(charged system search) | 0.56605 | 0.68683 | 1.00000 | 2.25289 | 0.14065 | 0.01853 | 0.13638 | 0.29555 | 0.07392 | 0.00000 | 0.03465 | 0.10856 | 27.914 |
14 | GSA | 重力搜索算法(gravitational search algorithm) | 0.70167 | 0.41944 | 0.00000 | 1.12111 | 0.31623 | 0.25120 | 0.27812 | 0.84554 | 0.42609 | 0.25525 | 0.00000 | 0.68134 | 27.807 |
15 | BFO | 细菌觅食优化(bacterial foraging optimization) | 0.67203 | 0.28721 | 0.10957 | 1.06881 | 0.39655 | 0.18364 | 0.17298 | 0.75317 | 0.37392 | 0.24211 | 0.18841 | 0.80444 | 27.549 |
16 | EM | 类电磁算法(electroMagnetism-like algorithm) | 0.12235 | 0.42928 | 0.92752 | 1.47915 | 0.00000 | 0.02413 | 0.29215 | 0.31628 | 0.00000 | 0.00527 | 0.10872 | 0.11399 | 18.981 |
17 | SFL | 混合蛙跳(shuffled frog-leaping) | 0.40072 | 0.22021 | 0.24624 | 0.86717 | 0.20129 | 0.02861 | 0.02221 | 0.25211 | 0.19565 | 0.04474 | 0.06607 | 0.30646 | 13.201 |
18 | MA | 猴子算法(monkey algorithm) | 0.33192 | 0.31029 | 0.13582 | 0.77804 | 0.10000 | 0.05443 | 0.07482 | 0.22926 | 0.15652 | 0.03553 | 0.10669 | 0.29874 | 11.771 |
19 | FSS | 鱼群搜索(fish school search) | 0.46812 | 0.23502 | 0.10483 | 0.80798 | 0.12825 | 0.03458 | 0.05458 | 0.21741 | 0.12175 | 0.03947 | 0.08244 | 0.24366 | 11.329 |
20 | IWDm | 智能水滴 M(intelligent water drops M) | 0.26459 | 0.13013 | 0.07500 | 0.46972 | 0.28568 | 0.05445 | 0.05112 | 0.39126 | 0.22609 | 0.05659 | 0.05054 | 0.33322 | 10.434 |
21 | PSO | 粒子群优化(particle swarm optimisation) | 0.20449 | 0.07607 | 0.06641 | 0.34696 | 0.18873 | 0.07233 | 0.18207 | 0.44313 | 0.16956 | 0.04737 | 0.01947 | 0.23641 | 8.431 |
22 | RND | 随机(random) | 0.16826 | 0.09038 | 0.07438 | 0.33302 | 0.13480 | 0.03318 | 0.03949 | 0.20747 | 0.12175 | 0.03290 | 0.04898 | 0.20363 | 5.056 |
23 | GWO | 灰狼优化器(grey wolf optimizer) | 0.00000 | 0.00000 | 0.02093 | 0.02093 | 0.06562 | 0.00000 | 0.00000 | 0.06562 | 0.23478 | 0.05789 | 0.02545 | 0.31812 | 1.000 |
总结
修正版算法的原始实现方法可以避免原作者算法中繁重的矩阵计算,也可以使其不参考 n 维空间的坐标关系而具有通用性。我曾尝试在阻尼谐振方程中使用 "质量" 的概念,以使粒子的行为因其适应度而各不相同。这样做的目的是减少质量较大(适合度函数值较高)的粒子的振幅和频率,而质量较轻的粒子则必须做出振幅较大、频率较高的运动。这可以对已知的最佳解决方案提供更高程度的细化,同时由于光粒子的“广泛”运动而提高搜索能力。遗憾的是,这一想法并没有带来预期的效果改善。
算法中粒子轨迹的物理模拟表明了使用速度、加速度和惯性等物理概念的可能性。这需要进一步研究。
图 5.根据相关测试对算法进行颜色分级
图 6.算法测试结果柱状图(从 0 到 100,越多越好、
存档中包含使用这篇文章中应用的方法计算评级表的脚本)。
改进的螺旋动力学优化算法(SDOm)的利弊:
优点:
1.外部参数少。
2.实现简单。
3.运行速度快。
缺点:
1.结果高度分散。
2.容易陷入局部极值。
这篇文章还附有一个归档,其中包含前几篇文章中所述算法代码的最新版本。文章作者不对规范算法描述的绝对准确性负责。为提高搜索能力,已对其中多项功能进行了修改。文章中提出的结论和判断都是基于实验结果。
本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/12252