
化学反应优化 (CRO) 算法(第二部分):汇编和结果
目录
1.概述
在文章的第二部分,我们将继续深入探讨化学反应优化(CRO)的迷人世界。基于 "分子" 和 "基本反应" 的概念,我们熟悉了算法的基本原理,并思考了如何将这些概念应用于解决复杂的优化问题。我们还了解了 CRO 内部能量守恒的关键点以及分解、合成、分子内和分子间无效碰撞等算法函数,这些函数在探索搜索空间和寻找最优解方面发挥着重要作用。
既然我们已经介绍了化学反应优化算法中化学运算符的基本概念和工作原理,现在就该进入算法的总体汇编和实际应用阶段了。在这里,我们将重点介绍该算法在各种测试函数上的结果,以分析其在解决现实世界问题方面的效率和潜力。我们将检查其性能、收敛性和找到全局最优解的能力,这将使我们能够评估其适用性,并将 CRO 算法的结果与其他优化方法进行比较,确定其优缺点。
2.算法的实现
让我们继续编写算法代码,使用大家已经熟悉的所有算法模板,其中包括标准的Init、Moving 和 Revision 函数。既然我们已经声明了结构并实现了化学反应的主要运算符,接下来我们就来编写算法类,将所有组件连接在一起。
我们需要一个伪代码来实现算法汇编:
如果 revision 标志被重置 - 初始化:
对于从 0 到 popSize 的每个分子 i:
对于从 0 到 coords 的每个坐标 c
为分子结构生成一个从rangeMin 到 rangeMax 的随机值
将结构值限制在给定范围内
将结构保存到数组 a
退出
动能计算:
minKE = double 类型的最大值
对于从0 到 popSize 的每个分子 i:
如果分子的适应度小于 minKE:
minKE = 分子的适应度
对于从 0 到 popSize 的每个分子 i:
计算分子动能 KE ,将其从 minKE 到 fB(最佳全局解)适应度的范围缩放为 0.0 到 1.0 的范围
molCNT = 0
尚未停止:
如果随机数小于 moleColl:
随机选择两个分子 M1 和 M2
如果两个分子的 KE 都大于或等于 β:
合成分子 M1 和 M2
否则:
在 M1 和 M2 之间进行分子间无效碰撞
否则:
随机选择一个分子 M
如果分子的 NumHit 超过 α:
对分子 M 进行分解
否则:
对分子 M 执行一次碰撞
将分子结构从 Mfilial 复制到 a
计算种群个体的适应度 a
将分子结构从 a 复制到 Mfilial
初始化:ind = -1
对于从 0 到 popSize 的每个分子 i :
如果分子的适应度超过 fB:
fB = 分子的适应度
ind = i
如果 ind 不等于 -1:
将分子结构复制到 cB
分子更新:
如果没有修订:
对于从 0 到 popSize 的每个分子 i :
更新 Mparent 中分子的适应度
将修订设置为 true
退出
对于从 0 到 popSize 的每个分子 i :
更新 Mfilial 中分子的适应度
取决于分子类型(合成、分子间无效碰撞、分解、碰撞):
进行适当的操作后护理
有了文章第一部分介绍的伪代码和化学运算符,我们就可以开始用代码实现 CRO 算法了。
声明C_AO_CRO类,该类是C_AO基类的继承者,是化学反应优化(CRO)算法的实现。
1.公有领域:
- popSize - 种群数量。
- moleColl, alpha, beta, molecPerturb - 算法参数。
- params - 用于存储算法参数的数组。
- Mparent[], Mfilial[] - S_CRO_Agent 结构的对象,代表分子。
2.可用的方法有:
- C_AO_CRO() - 用于初始化类字段的类构造函数。
- SetParams() - 设置算法参数的方法。
- Init() - 算法初始化方法。该方法接受最小和最大搜索范围、搜索步长和世代次数。
- Moving() 和 Revision() - 实现算法基本操作的方法。
3.私有字段和方法:
- Synthesis()、InterMolInefColl()、Decomposition() 、InefCollision() - 实现不同类型反应的方法。
- PostSynthesis()、PostInterMolInefColl()、PostDecomposition()、PostInefCollision() - 在相应反应后执行操作的方法。
- N() - 用于修改分子结构中一个成分(坐标)的方法。
该类是化学反应优化 (CRO) 算法的完整实现,包含其所需的所有数据和方法。
//—————————————————————————————————————————————————————————————————————————————— class C_AO_CRO : public C_AO { public: //-------------------------------------------------------------------- ~C_AO_CRO () { } C_AO_CRO () { ao_name = "CRO"; ao_desc = "Chemical Reaction Optimisation"; ao_link = "https://www.mql5.com/en/articles/15041"; popSize = 50; //population size moleColl = 0.9; alpha = 200; beta = 0.01; molecPerturb = 0.5; ArrayResize (params, 5); params [0].name = "popSize"; params [0].val = popSize; params [1].name = "moleColl"; params [1].val = moleColl; params [2].name = "alpha"; params [2].val = alpha; params [3].name = "beta"; params [3].val = beta; params [4].name = "molecPerturb"; params [4].val = molecPerturb; } void SetParams () { popSize = (int)params [0].val; moleColl = params [1].val; alpha = (int)params [2].val; beta = params [3].val; molecPerturb = params [4].val; } bool Init (const double &rangeMinP [], //minimum search range const double &rangeMaxP [], //maximum search range const double &rangeStepP [], //step search const int epochsP = 0); //number of epochs void Moving (); void Revision (); S_CRO_Agent Mparent []; S_CRO_Agent Mfilial []; //---------------------------------------------------------------------------- double moleColl; int alpha; double beta; double molecPerturb; private: //------------------------------------------------------------------- bool Synthesis (int index1, int index2, int &molCNT); bool InterMolInefColl (int index1, int index2, int &molCNT); bool Decomposition (int index, int &molCNT); bool InefCollision (int index, int &molCNT); void PostSynthesis (S_CRO_Agent &mol); void PostInterMolInefColl (S_CRO_Agent &mol); void PostDecomposition (S_CRO_Agent &mol); void PostInefCollision (S_CRO_Agent &mol); void N (double &coord, int coordPos); }; //——————————————————————————————————————————————————————————————————————————————
C_AO_CRO 类的 Init 方法用于根据传递的参数初始化类变量。此方法中发生的情况如下:
1.该方法调用 StandardInit 函数,该函数获取最小和最大搜索范围以及搜索步长。如果 StandardInit 返回 false,Init 方法也会返回 false 并完成工作。
2.然后,该方法将 Mparent 和 Mfilial 数组的大小调整为 popSize,即代表种群大小。
3.接下来,对于 Mparent 和 Mfilial 数组中的每个元素,都会调用带有 coords 参数的 Init 方法。该方法初始化群体中每个代理的字段。
4.最后,该方法返回 true,表明初始化已成功完成。
该方法利用给定的参数对化学反应优化 (CRO) 算法进行初始设置,并为执行优化做好准备。
//—————————————————————————————————————————————————————————————————————————————— bool C_AO_CRO::Init (const double &rangeMinP [], //minimum search range const double &rangeMaxP [], //maximum search range const double &rangeStepP [], //step search const int epochsP = 0) //number of epochs { if (!StandardInit (rangeMinP, rangeMaxP, rangeStepP)) return false; //---------------------------------------------------------------------------- ArrayResize (Mparent, popSize); ArrayResize (Mfilial, popSize); for (int i = 0; i < popSize; i++) { Mparent [i].Init (coords); Mfilial [i].Init (coords); } return true; } //——————————————————————————————————————————————————————————————————————————————
C_AO_CRO 类的 Moving 方法用于调用化学运算符来改变分子结构,从而在优化过程中移动分子。该方法执行以下操作:
1.如果 revison 值等于 false,那么对于 Mparent 群体中的每个分子,结构初始化的随机值范围为 rangeMin 到 rangeMax。然后将这些值复制到数组 a 中。
2.如果 revison 不等于 false,则计算出 Mparent 群体中所有分子的函数 f 的最小值。然后,根据每个分子的函数值 f、Mparent 群的最小值 f 以及 0.0 至 1.0 范围内的最佳全局解 fB,计算出每个分子的 KE 值。
3.接下来,直到其中一个化学运算符返回 false(这意味着子代种群已没有空间容纳子代分子),就会发生以下情况:
- 如果随机数小于 moleColl,则随机选择两个分子 M1 和 M2。如果两个分子的 KE 都大于或等于 beta,则进行合成(即对不低于参数中指定的相对适配度值的分子进行合成;正是出于这些目的,分子的适应度值以前被缩放到 0.0 到 1.0 的范围内)。否则,就会发生分子间无效碰撞。
- 如果随机数大于或等于 moleColl,则随机选择一个分子 M。如果分子的 NumHit 超过 alpha(如果分子发生的碰撞次数超过算法参数中指定的次数,那么分子就会 "破裂"),就会进行分解。否则,就会发生碰撞。
4.方法结束时,Mfilial 中所有分子的结构都会被复制到群体数组 a 中。
该方法负责根据系统的当前状态和给定参数更新化学反应优化算法(CRO)中的分子结构。该方法实现了 CRO 算法的基本操作,如合成、分子间无效碰撞、分解和碰撞。
//—————————————————————————————————————————————————————————————————————————————— void C_AO_CRO::Moving () { //---------------------------------------------------------------------------- if (!revision) { for (int i = 0; i < popSize; i++) { for (int c = 0; c < coords; c++) { Mparent [i].structure [c] = u.RNDfromCI (rangeMin [c], rangeMax [c]); // Random structure in the range from rangeMin to rangeMax Mparent [i].structure [c] = u.SeInDiSp (Mparent [i].structure [c], rangeMin [c], rangeMax [c], rangeStep [c]); a [i].c [c] = Mparent [i].structure [c]; } } return; } //---------------------------------------------------------------------------- double minKE = DBL_MAX; for (int i = 0; i < popSize; i++) { if (Mparent [i].f < minKE) minKE = Mparent [i].f; } for (int i = 0; i < popSize; i++) { Mparent [i].KE = u.Scale (Mparent [i].f, minKE, fB, 0.0, 1.0); } //---------------------------------------------------------------------------- int molCNT = 0; while (!IsStopped ()) { if (u.RNDprobab () < moleColl) { // Select two random molecules M1 and M2 int index1 = u.RNDminusOne (popSize); int index2 = u.RNDminusOne (popSize); // If KE ≤ β: if (Mparent [index1].KE >= beta && Mparent [index2].KE >= beta) { // Perform Synthesis if (!Synthesis (index1, index2, molCNT)) break; } else { // Perform Intermolecular Inefficient Collision if (!InterMolInefColl (index1, index2, molCNT)) break; } } else { // Select a random molecule M int index = u.RNDminusOne (popSize); // If NumHit > α: if (Mparent [index].NumHit > alpha) { // Perform Decomposition if (!Decomposition (index, molCNT)) break; } else { // Perform Collision if (!InefCollision (index, molCNT)) break; } } } for (int i = 0; i < popSize; i++) { ArrayCopy (a [i].c, Mfilial [i].structure); } } //——————————————————————————————————————————————————————————————————————————————
C_AO_CRO 类的Revision 方法用于更新全局最优解,并通过执行化学后操作更新父群体中的分子状态。该方法执行的操作:
1.更新全局解决方案。在 for 循环中,该方法会遍历所有分子。如果当前分子的函数 f 值超过当前最佳 fB 值,则更新 fB,并将当前分子的坐标数组复制到数组 cB 中。
2.如果 revision 值等于 false,那么对于 Mparent 群体中的每个分子,f 值将被设置为等于 a 数组中的 f值。然后将 revision 设置为 true,方法退出。 在这一阶段,重要的是要获得母体分子的适应度值,以便在随后的历时中,依赖于动能的化学算子(适应度函数值归一化为 0.0 至 1.0 的范围)。
3.如果 revision 值不为 false,则 Mfilial 群体中的每个分子的 f 值都等于 a 数组中的 f值。然后,根据分子 rType 反应类型(分子参与的反应),调用相应的 PostSynthesis、PostInterMolInefColl、PostDecomposition、PostInefCollision 方法。
//—————————————————————————————————————————————————————————————————————————————— void C_AO_CRO::Revision () { //---------------------------------------------------------------------------- int ind = -1; for (int i = 0; i < popSize; i++) { if (a [i].f > fB) { fB = a [i].f; ind = i; } } if (ind != -1) ArrayCopy (cB, a [ind].c, 0, 0, WHOLE_ARRAY); //---------------------------------------------------------------------------- if (!revision) { for (int i = 0; i < popSize; i++) { for (int c = 0; c < coords; c++) { Mparent [i].f = a [i].f; } } revision = true; return; } //---------------------------------------------------------------------------- for (int i = 0; i < popSize; i++) { for (int c = 0; c < coords; c++) { Mfilial [i].f = a [i].f; } switch (Mfilial [i].rType) { case synthesis: PostSynthesis (Mfilial [i]); break; case interMolecularInefColl: PostInterMolInefColl (Mfilial [i]); break; case decomposition: PostDecomposition (Mfilial [i]); break; case inefCollision: PostInefCollision (Mfilial [i]); break; } } } //——————————————————————————————————————————————————————————————————————————————
3.测试结果
CRO 算法在 Hilly、Forest 和 Megacity 函数上进行了测试。在每种情况下,对每种景观类型(5、25 和 500 个函数)进行十次函数运行,并得出优化结果。
CRO|Chemical Reaction Optimisation|50.0|0.9|200.0|0.01|0.5
=============================
5 Hilly's; Func runs:10000; result:0.9462894520167225
25 Hilly's;Func runs:10000; result:0.6611186250435438
500 Hilly's;Func runs:10000; result:0.2985263035668822
=============================
5 Forest's; Func runs:10000; result:0.8790568514481787
25 Forest's; Func runs:10000; result:0.584216839762206
500 Forest's; Func runs:10000; result:0.2114595696419046
=============================
5 Megacity's; Func runs:10000; result:0.7584615384615384
25 Megacity's; Func runs:10000; result:0.4264615384615384
500 Megacity's;Func runs:10000; result:0.12686153846153955
=============================
All score:4.89245 (54.36%)
采用 CRO 算法的测试台操作可视化展示了有趣的算法特征。虽然 CRO 有时会卡住,如收敛图中较长的平坦部分所示,但总体结果仍然不错。
CRO 工作的一个显著特点是搜索区域内 "分子" 的移动。乍一看,这种运动似乎是混乱的,类似于布朗运动。然而,尽管存在外部随机性,"分子" 还是设法找到了全局最优区。这表明了 CRO 算法的复杂性和精密性,它利用化学反应原理来解决优化问题。
总的来说,CRO 算法是一种功能强大的优化工具,尽管存在一些困难,但仍能处理各种任务。它的独特性质和寻找全局最优的能力使其成为优化领域的重要工具。
Hilly 测试函数上的 CRO
Forest 测试函数上的 CRO
Megacity 测试函数上的 CRO。
# | AO | 描述 | Hilly | Hilly 最终 | 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 | BGA | 二元遗传算法(binary genetic algorithm) | 0.99989 | 0.99518 | 0.42835 | 2.42341 | 0.96153 | 0.96181 | 0.32027 | 2.24360 | 0.91385 | 0.95908 | 0.24220 | 2.11512 | 6.782 | 75.36 |
2 | CLA | 代码锁算法(code lock algorithm) | 0.95345 | 0.87107 | 0.37590 | 2.20042 | 0.98942 | 0.91709 | 0.31642 | 2.22294 | 0.79692 | 0.69385 | 0.19303 | 1.68380 | 6.107 | 67.86 |
3 | (P+O)ES | (P+O) 演进策略((P+O) evolution strategies) | 0.92256 | 0.88101 | 0.40021 | 2.20379 | 0.97750 | 0.87490 | 0.31945 | 2.17185 | 0.67385 | 0.62985 | 0.18634 | 1.49003 | 5.866 | 65.17 |
4 | CTA | 彗尾算法(comet tail algorithm) | 0.95346 | 0.86319 | 0.27770 | 2.09435 | 0.99794 | 0.85740 | 0.33949 | 2.19484 | 0.88769 | 0.56431 | 0.10512 | 1.55712 | 5.846 | 64.96 |
5 | SDSm | 随机扩散搜索 M(stochastic diffusion search M) | 0.93066 | 0.85445 | 0.39476 | 2.17988 | 0.99983 | 0.89244 | 0.19619 | 2.08846 | 0.72333 | 0.61100 | 0.10670 | 1.44103 | 5.709 | 63.44 |
6 | ESG | 社会群体的演变(evolution of social groups) | 0.99906 | 0.79654 | 0.35056 | 2.14616 | 1.00000 | 0.82863 | 0.13102 | 1.95965 | 0.82333 | 0.55300 | 0.04725 | 1.42358 | 5.529 | 61.44 |
7 | SIA | 模拟各向同性退火(simulated isotropic annealing) | 0.95784 | 0.84264 | 0.41465 | 2.21513 | 0.98239 | 0.79586 | 0.20507 | 1.98332 | 0.68667 | 0.49300 | 0.09053 | 1.27020 | 5.469 | 60.76 |
8 | ACS | 人工协同搜索(artificial cooperative search) | 0.75547 | 0.74744 | 0.30407 | 1.80698 | 1.00000 | 0.88861 | 0.22413 | 2.11274 | 0.69077 | 0.48185 | 0.13322 | 1.30583 | 5.226 | 58.06 |
9 | TSEA | 龟甲进化算法(turtle shell evolution algorithm) | 0.96798 | 0.64480 | 0.29672 | 1.90949 | 0.99449 | 0.61981 | 0.22708 | 1.84139 | 0.69077 | 0.42646 | 0.13598 | 1.25322 | 5.004 | 55.60 |
10 | DE | 差分进化(differential evolution) | 0.95044 | 0.61674 | 0.30308 | 1.87026 | 0.95317 | 0.78896 | 0.16652 | 1.90865 | 0.78667 | 0.36033 | 0.02953 | 1.17653 | 4.955 | 55.06 |
11 | CRO | 化学反应优化(chemical reaction optimization) | 0.94629 | 0.66112 | 0.29853 | 1.90593 | 0.87906 | 0.58422 | 0.21146 | 1.67473 | 0.75846 | 0.42646 | 0.12686 | 1.31178 | 4.892 | 54.36 |
12 | BSA | 鸟群算法(bird swarm algorithm) | 0.89306 | 0.64900 | 0.26250 | 1.80455 | 0.92420 | 0.71121 | 0.24939 | 1.88479 | 0.69385 | 0.32615 | 0.10012 | 1.12012 | 4.809 | 53.44 |
13 | HS | 和声搜索(harmony search) | 0.86509 | 0.68782 | 0.32527 | 1.87818 | 0.99999 | 0.68002 | 0.09590 | 1.77592 | 0.62000 | 0.42267 | 0.05458 | 1.09725 | 4.751 | 52.79 |
14 | SSG | 树苗播种和生长(saplings sowing and growing) | 0.77839 | 0.64925 | 0.39543 | 1.82308 | 0.85973 | 0.62467 | 0.17429 | 1.65869 | 0.64667 | 0.44133 | 0.10598 | 1.19398 | 4.676 | 51.95 |
15 | (PO)ES | (PO) 进化策略((PO) evolution strategies) | 0.79025 | 0.62647 | 0.42935 | 1.84606 | 0.87616 | 0.60943 | 0.19591 | 1.68151 | 0.59000 | 0.37933 | 0.11322 | 1.08255 | 4.610 | 51.22 |
16 | BSO | 头脑风暴优化(brain storm optimization) | 0.93736 | 0.57616 | 0.29688 | 1.81041 | 0.93131 | 0.55866 | 0.23537 | 1.72534 | 0.55231 | 0.29077 | 0.11914 | 0.96222 | 4.498 | 49.98 |
17 | WOAm | Wale 优化算法 M(wale optimization algorithm M) | 0.84521 | 0.56298 | 0.26263 | 1.67081 | 0.93100 | 0.52278 | 0.16365 | 1.61743 | 0.66308 | 0.41138 | 0.11357 | 1.18803 | 4.476 | 49.74 |
18 | ACOm | 蚁群优化M(ant colony optimization M) | 0.88190 | 0.66127 | 0.30377 | 1.84693 | 0.85873 | 0.58680 | 0.15051 | 1.59604 | 0.59667 | 0.37333 | 0.02472 | 0.99472 | 4.438 | 49.31 |
19 | BFO-GA | 细菌觅食优化(bacterial foraging optimization) - ga | 0.89150 | 0.55111 | 0.31529 | 1.75790 | 0.96982 | 0.39612 | 0.06305 | 1.42899 | 0.72667 | 0.27500 | 0.03525 | 1.03692 | 4.224 | 46.93 |
20 | MEC | 思维进化计算(mind evolutionary computation) | 0.69533 | 0.53376 | 0.32661 | 1.55569 | 0.72464 | 0.33036 | 0.07198 | 1.12698 | 0.52500 | 0.22000 | 0.04198 | 0.78698 | 3.470 | 38.55 |
21 | IWO | 入侵性杂草优化(invasive weed optimization) | 0.72679 | 0.52256 | 0.33123 | 1.58058 | 0.70756 | 0.33955 | 0.07484 | 1.12196 | 0.42333 | 0.23067 | 0.04617 | 0.70017 | 3.403 | 37.81 |
22 | Micro-AIS | 微型人工免疫系统(micro artificial immune system) | 0.79547 | 0.51922 | 0.30861 | 1.62330 | 0.72956 | 0.36879 | 0.09398 | 1.19233 | 0.37667 | 0.15867 | 0.02802 | 0.56335 | 3.379 | 37.54 |
23 | COAm | 布谷鸟优化算法 M(cuckoo optimization algorithm M) | 0.75820 | 0.48652 | 0.31369 | 1.55841 | 0.74054 | 0.28051 | 0.05599 | 1.07704 | 0.50500 | 0.17467 | 0.03380 | 0.71347 | 3.349 | 37.21 |
24 | SDOm | 螺旋动力学优化 M(spiral dynamics optimization M) | 0.74601 | 0.44623 | 0.29687 | 1.48912 | 0.70204 | 0.34678 | 0.10944 | 1.15826 | 0.42833 | 0.16767 | 0.03663 | 0.63263 | 3.280 | 36.44 |
25 | NMm | Nelder-Mead 方法 M | 0.73807 | 0.50598 | 0.31342 | 1.55747 | 0.63674 | 0.28302 | 0.08221 | 1.00197 | 0.44667 | 0.18667 | 0.04028 | 0.67362 | 3.233 | 35.92 |
26 | FAm | 萤火虫算法 M(firefly algorithm M) | 0.58634 | 0.47228 | 0.32276 | 1.38138 | 0.68467 | 0.37439 | 0.10908 | 1.16814 | 0.28667 | 0.16467 | 0.04722 | 0.49855 | 3.048 | 33.87 |
27 | GSA | 重力搜索算法(gravitational search algorithm) | 0.64757 | 0.49197 | 0.30062 | 1.44016 | 0.53962 | 0.36353 | 0.09945 | 1.00260 | 0.32667 | 0.12200 | 0.01917 | 0.46783 | 2.911 | 32.34 |
28 | BFO | 细菌觅食优化(bacterial foraging optimization) | 0.61171 | 0.43270 | 0.31318 | 1.35759 | 0.54410 | 0.21511 | 0.05676 | 0.81597 | 0.42167 | 0.13800 | 0.03195 | 0.59162 | 2.765 | 30.72 |
29 | ABC | 人工蜂群(artificial bee colony) | 0.63377 | 0.42402 | 0.30892 | 1.36671 | 0.55103 | 0.21874 | 0.05623 | 0.82600 | 0.34000 | 0.14200 | 0.03102 | 0.51302 | 2.706 | 30.06 |
30 | BA | 蝙蝠算法(bat algorithm) | 0.59761 | 0.45911 | 0.35242 | 1.40915 | 0.40321 | 0.19313 | 0.07175 | 0.66810 | 0.21000 | 0.10100 | 0.03517 | 0.34617 | 2.423 | 26.93 |
31 | SA | 模拟退火(simulated annealing) | 0.55787 | 0.42177 | 0.31549 | 1.29513 | 0.34998 | 0.15259 | 0.05023 | 0.55280 | 0.31167 | 0.10033 | 0.02883 | 0.44083 | 2.289 | 25.43 |
32 | IWDm | 智能水滴 M(intelligent water drops M) | 0.54501 | 0.37897 | 0.30124 | 1.22522 | 0.46104 | 0.14704 | 0.04369 | 0.65177 | 0.25833 | 0.09700 | 0.02308 | 0.37842 | 2.255 | 25.06 |
33 | PSO | 粒子群优化(particle swarm optimisation) | 0.59726 | 0.36923 | 0.29928 | 1.26577 | 0.37237 | 0.16324 | 0.07010 | 0.60572 | 0.25667 | 0.08000 | 0.02157 | 0.35823 | 2.230 | 24.77 |
34 | Boids | Boids 算法 | 0.43340 | 0.30581 | 0.25425 | 0.99346 | 0.35718 | 0.20160 | 0.15708 | 0.71586 | 0.27846 | 0.14277 | 0.09834 | 0.51957 | 2.229 | 24.77 |
35 | MA | 猴子算法(monkey algorithm) | 0.59107 | 0.42681 | 0.31816 | 1.33604 | 0.31138 | 0.14069 | 0.06612 | 0.51819 | 0.22833 | 0.08567 | 0.02790 | 0.34190 | 2.196 | 24.40 |
36 | SFL | 混合蛙跳(shuffled frog-leaping) | 0.53925 | 0.35816 | 0.29809 | 1.19551 | 0.37141 | 0.11427 | 0.04051 | 0.52618 | 0.27167 | 0.08667 | 0.02402 | 0.38235 | 2.104 | 23.38 |
37 | FSS | 鱼群搜索(fish school search) | 0.55669 | 0.39992 | 0.31172 | 1.26833 | 0.31009 | 0.11889 | 0.04569 | 0.47467 | 0.21167 | 0.07633 | 0.02488 | 0.31288 | 2.056 | 22.84 |
38 | RND | 随机(random) | 0.52033 | 0.36068 | 0.30133 | 1.18234 | 0.31335 | 0.11787 | 0.04354 | 0.47476 | 0.25333 | 0.07933 | 0.02382 | 0.35648 | 2.014 | 22.37 |
39 | GWO | 灰狼优化器(grey wolf optimizer) | 0.59169 | 0.36561 | 0.29595 | 1.25326 | 0.24499 | 0.09047 | 0.03612 | 0.37158 | 0.27667 | 0.08567 | 0.02170 | 0.38403 | 2.009 | 22.32 |
40 | CSS | 带电系统搜索(charged system search) | 0.44252 | 0.35454 | 0.35201 | 1.14907 | 0.24140 | 0.11345 | 0.06814 | 0.42299 | 0.18333 | 0.06300 | 0.02322 | 0.26955 | 1.842 | 20.46 |
41 | EM | 类电磁算法(electroMagnetism-like algorithm) | 0.46250 | 0.34594 | 0.32285 | 1.13129 | 0.21245 | 0.09783 | 0.10057 | 0.41085 | 0.15667 | 0.06033 | 0.02712 | 0.24412 | 1.786 | 19.85 |
总结
根据所提供的表格和结果,可以对 CRO 算法的性能得出以下结论:
1.CRO 在 Hilly 测试函数上取得了优异成绩。5 个参数的结果约为 0.95,25 个参数的结果约为 0.66,500 个参数的结果约为 0.30。这表明 CRO 对平滑函数有效,尤其是在参数较少的情况下。
2.在 Forest 测试函数上,CRO 也取得了良好的效果。5 个参数的结果约为 0.88,25 个参数的结果约为 0.58,500 个参数的结果约为 0.21。这表明,CRO 对具有 "尖锐" 极值的函数也很有效,但在寻找最优点时有一定困难。
3.在 Megacity 测试函数上,CRO 继续表现出色。5 个参数的结果约为 0.76,25 个参数的结果约为 0.43,500 个参数的结果约为 0.13。这表明 CRO 对这一离散函数是有效的,与其他算法相比,它的结果是一致的 "绿色",即使是在表格中排名更靠前的算法也是如此。
根据所提供的表格,与其他算法相比,CRO 算法显示出很强的结果。特别是在 Hilly、Forest 和 Megacity 函数上,CRO 显示出了竞争力,尤其是在参数较少的情况下。
CRO 算法排名第 11 位。根据下表中的色阶(深绿色表示效果更好),可以说 CRO 总体上表现出良好而稳定的性能(着色稳定而均匀)。在使用 1000 个参数的 Hilly 函数中,结果看起来要差一些。
事实证明,CRO 算法是一种很有前途的优化方法。它使用两个代理群体(在我的实现中),相互影响,以提供多样性,避免陷入局部最优。该算法的一个显著特点是使用了与化学反应、分解、合成等类似的特殊运算符。
总的来说,CRO算法是一种有前景的优化方法,以其独创性和在各种优化问题中取得高结果的能力而闻名。
优化算法的选择应基于具体的任务和性能要求,我们的排名表将对此有所帮助。通过重新编写 CRO 算法的原始版本,以继承我为群体算法采用的 C_AO 类,这种有趣的算法可以应用于一般的优化问题。
图 1.根据相关测试对算法进行颜色渐变 大于或等于 0.99 的结果用白色标出
图 2.算法测试结果直方图(从 0 到 100,越高越好,
其中 100 是最大可能的理论结果,归档中有一个计算评级表的脚本)。
CRO 的一般优缺点:
优点:
- 对各类函数的收敛性良好。
- 尽管结构复杂,但速度非常快。
- 良好的可扩展性。
缺点:
- 有时会陷入局部极值情况。
这篇文章附有一个档案,其中包含当前版本的算法代码。文章作者不对规范算法描述的绝对准确性负责。为提高搜索能力,已对其中多项功能进行了修改。文章中提出的结论和判断都是基于实验结果。
本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/15080


