English Русский Español Deutsch 日本語 Português
preview
化学反应优化 (CRO) 算法(第二部分):汇编和结果

化学反应优化 (CRO) 算法(第二部分):汇编和结果

MetaTrader 5示例 | 23 一月 2025, 09:27
462 0
Andrey Dik
Andrey Dik

目录

  1. 概述
  2. 算法的实现
  3. 测试结果


1.概述

在文章的第二部分,我们将继续深入探讨化学反应优化(CRO)的迷人世界。基于 "分子" 和 "基本反应" 的概念,我们熟悉了算法的基本原理,并思考了如何将这些概念应用于解决复杂的优化问题。我们还了解了 CRO 内部能量守恒的关键点以及分解合成分子内分子间无效碰撞等算法函数,这些函数在探索搜索空间和寻找最优解方面发挥着重要作用。

既然我们已经介绍了化学反应优化算法中化学运算符的基本概念和工作原理,现在就该进入算法的总体汇编和实际应用阶段了。在这里,我们将重点介绍该算法在各种测试函数上的结果,以分析其在解决现实世界问题方面的效率和潜力。我们将检查其性能、收敛性和找到全局最优解的能力,这将使我们能够评估其适用性,并将 CRO 算法的结果与其他优化方法进行比较,确定其优缺点。


2.算法的实现

让我们继续编写算法代码,使用大家已经熟悉的所有算法模板,其中包括标准的InitMovingRevision 函数。既然我们已经声明了结构并实现了化学反应的主要运算符,接下来我们就来编写算法类,将所有组件连接在一起。

我们需要一个伪代码来实现算法汇编:

如果 revision 标志被重置 - 初始化:
    对于从 0popSize 的每个分子 i
        对于从 0coords 的每个坐标 c
            为分子结构生成一个从rangeMinrangeMax 的随机值
            将结构值限制在给定范围内
    将结构保存到数组 a
退出
动能计算:
    minKE = double 类型的最大值
对于从0popSize 的每个分子 i
        如果分子的适应度小于 minKE
            minKE = 分子的适应度
    对于从 0popSize 的每个分子 i
        计算分子动能 KE ,将其从 minKEfB(最佳全局解)适应度的范围缩放为 0.01.0 的范围
molCNT = 0
尚未停止:
    如果随机数小于 moleColl
        随机选择两个分子 M1M2
        如果两个分子的 KE 都大于或等于 β
            合成分子 M1M2
        否则:
            在 M1M2 之间进行分子间无效碰撞
    否则:
        随机选择一个分子 M
        如果分子的 NumHit 超过 α
            对分子 M 进行分解
        否则:
            对分子 M 执行一次碰撞
将分子结构从 Mfilial 复制到 a
计算种群个体的适应度 a
将分子结构从 a 复制到 Mfilial
初始化:ind = -1
对于从 0popSize 的每个分子 i
    如果分子的适应度超过 fB
        fB = 分子的适应度
        ind = i
如果 ind 不等于 -1
    将分子结构复制到 cB
分子更新:
    如果没有修订:
        对于从 0popSize 的每个分子 i
            更新 Mparent 中分子的适应度
        将修订设置为 true
退出
对于从 0popSize 的每个分子 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 返回 falseInit 方法也会返回 false 并完成工作。

2.然后,该方法将 MparentMfilial 数组的大小调整为 popSize,即代表种群大小。

3.接下来,对于 MparentMfilial 数组中的每个元素,都会调用带有 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 群体中的每个分子,结构初始化的随机值范围为 rangeMinrangeMax。然后将这些值复制到数组 a 中。

2.如果 revison 不等于 false,则计算出 Mparent 群体中所有分子的函数 f 的最小值。然后,根据每个分子的函数值 f、Mparent 群的最小值 f 以及 0.01.0 范围内的最佳全局解 fB,计算出每个分子的 KE 值。

3.接下来,直到其中一个化学运算符返回 false(这意味着子代种群已没有空间容纳子代分子),就会发生以下情况:

  • 如果随机数小于 moleColl,则随机选择两个分子 M1M2。如果两个分子的 KE 都大于或等于 beta,则进行合成(即对不低于参数中指定的相对适配度值的分子进行合成;正是出于这些目的,分子的适应度值以前被缩放到 0.01.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 反应类型(分子参与的反应),调用相应的 PostSynthesisPostInterMolInefCollPostDecompositionPostInefCollision 方法。

//——————————————————————————————————————————————————————————————————————————————
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

  Hilly 测试函数上的 CRO

Forest

  Forest 测试函数上的 CRO

Megacity

  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 的一般优缺点:

优点:

  1. 对各类函数的收敛性良好。
  2. 尽管结构复杂,但速度非常快。
  3. 良好的可扩展性。

缺点:

  1. 有时会陷入局部极值情况。

这篇文章附有一个档案,其中包含当前版本的算法代码。文章作者不对规范算法描述的绝对准确性负责。为提高搜索能力,已对其中多项功能进行了修改。文章中提出的结论和判断都是基于实验结果。

本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/15080

附加的文件 |
CRO.zip (28.03 KB)
开发回放系统(第 54 部分):第一个模块的诞生 开发回放系统(第 54 部分):第一个模块的诞生
在本文中,我们将探讨如何将多个真正功能模块中的第一个组合在一起,用于回放/模拟器系统,这些模块也将用于其他用途。我们现在说的是鼠标模块。
人工电场算法(AEFA) 人工电场算法(AEFA)
本文介绍了一种受库仑静电力定律启发的人工电场算法(AEFA)。该算法通过模拟电学现象,利用带电粒子及其相互作用来解决复杂的优化问题。与其他基于自然法则的算法相比,AEFA具有独特性质。
神经网络变得简单(第 88 部分):时间序列密集编码器(TiDE) 神经网络变得简单(第 88 部分):时间序列密集编码器(TiDE)
为尝试获得最准确的预测,研究人员经常把预测模型复杂化。而反过来又会导致模型训练和维护成本增加。这样的增长总是公正的吗?本文阐述了一种算法,即利用线性模型的简单性和速度,并演示其结果与拥有更复杂架构的最佳模型相当。
您应当知道的 MQL5 向导技术(第 17 部分):多币种交易 您应当知道的 MQL5 向导技术(第 17 部分):多币种交易
当经由向导组装一款智能系统时,默认情况下,跨多币种交易不可用。我们研究了 2 种可能采取的技巧,可令交易者在同一时间据多个品种测试他们的思路。