English Русский Español Português
preview
圆搜索算法(CSA)

圆搜索算法(CSA)

MetaTrader 5测试者 |
248 0
Andrey Dik
Andrey Dik

内容

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


概述

CSA是一种受圆几何特性启发的新型优化算法。其独特之处在于利用三角关系和几何原理来探索搜索空间。

CSA基于一个有趣的理念:每个搜索点沿圆的切线轨迹移动,实现全局探索与局部精修平衡。该方法的原创性在于圆具有恒定半径与连续导数等独特数学性质,确保智能体在搜索空间中平滑移动。

算法分“利用”与“探索”两个阶段。在利用阶段,智能体聚焦潜力区域,移动时方向性更强;在探索阶段,智能体则大胆跃入解空间未探索区域。阶段的切换由当前迭代与特殊参数“c”共同调节。

CSA最引人注目的优势在于:它能够在高维空间中保持高效搜索性能的同时,通过直观的几何模型实现算法逻辑的可解释性。种群中每个智能体沿自身独特轨迹行进,轨迹由搜索过程中动态调整的θ角决定。

CSA由Mohammad H. Kaiys、Hany M. Hasanien等研究者开发,于2022年发表。


算法实现

CSA旨在通过随机圆寻找最优解,以扩大搜索区域。它以圆心为目标点。其过程始于切线与圆夹角逐渐减小,使切线逼近圆心(图例1)。

为增加搜索多样性、避免陷入局部最优,切线接触角亦随机变化。在该算法中,Xt切点充当搜索智能体,Xc圆心代表迄今找到的最优解。

圆几何学

图例1. 圆的几何特性及其切线

CSA通过切点向圆心移动的几何特性,动态调整搜索智能体的位置。这一机制使算法在优化过程中能够提升解的质量,同时通过随机更新切线接触角的机制避免局部最优。CSA优化器的核心流程如下图示:


CSA可视化

图例2. CSA运行图

接下来,为每个智能体确定一个角度。如果当前迭代次数大于阈值与最大迭代次数的乘积,则该智能体处于探索阶段;否则进入利用阶段(参见图例 2)。更新智能体位置并评估其适应度。将结果与当前最优解比较,如果发现更优解,则更新位置。通过递增迭代计数器来结束一次迭代。算法执行完毕后,返回所找到的最优位置及其适应度值。

算法采用“沿圆切线移动点”的概念,每个搜索智能体以相对于当前最优解的某一θ角移动。此运动由多个随时间变化的参数(w, a, p)控制。如前面所述,算法操作分为两个阶段:探索阶段——智能体进行更大幅度移动以寻找有潜力区域;利用阶段——智能体专注于完善已找到的解。

        我所提出的最终版本包含若干差异,显著提升了算法的搜索能力。w更新方程的变化如下:

        • 原版:w = w × rand - w
        • 最终代码:w = π × (1 - epochNow/epochs),这样使得w参数变化更具可预测性且线性,改善了算法的收敛度。
        位置更新方程的修改:
        • 原版:Xi = Xc + (Xc - Xi) × tan(θ)
        • 最终版:Xi = Xc + rand × (Xc - Xi) × tan(θ),添加随机因子 “rand [0.0; 1.0]” 为搜索增添了附加的随机性,性能优于原版。 
        优化更新阶段:
        • 为每个智能体添加局部最优解更新
        • 改进全局与局部搜索间的平衡策略

          主要概念差异在于,最终版本使算法行为更“平滑”且更具可预测性,同时保持搜索能力。相比之下,原版行为更为“混沌”,而最终版则提供更加受控的优化,尤其在探索与利用阶段过渡方面。

          现在我们可以开始编写算法的伪代码。

          CSA伪代码:

          1. 初始化:
            • 设置种群大小(popSize = 50)
            • 设置研究阶段常数(constC = 0.8)
            • 初始化原始参数:
              • w = π(角度参数)
              • a = π
              • p = 1.0
              • θ = 0(原始角度)
          2. 当处于首次迭代(revision = false)时:
            • 对于群体中的每个智能体i:
              • 在给定边界内随机初始化坐标
              • 根据变动步长调整坐标
            • 将revision设置为true
            • 返回起始点
          3. 否则(进入主优化循环):
            • 递增迭代计数器(epochNow++)
            • 参数更新:
              • w = π × (1 - epochNow/epochs) // 线性下降
              • a = π - π × (epochNow/epochs)²
              • p = 1 - 0.9 × √(epochNow/epochs)
          4. 对于种群中的每个个体:
            • 确定当前阶段:
              • 如果epochNow ≤ constC × epochs → 探索阶段:θ = w × random [0.0; 1.0]
              • 否则 → 利用阶段:θ = w × p
            • 更新智能体位置:
              • 对每个坐标j:→ new_pos = best_pos + random [0.0; 1.0] × (best_pos - current_pos) × tan (θ) → 将new_pos限制在给定边界内
          5. 结果修正:
            • 对于每个智能体:
              • 如果智能体适应度 > 全局最优适应度 → 更新全局最优解
              • 若智能体适应度 > 局部最优适应度 → 更新智能体局部最优解
          6. 重复步骤3-5直至满足停止准则

          让我们进入实现阶段。C_AO_CSA类继承自C_AO基类,是CSA算法的具体实现。下面看一下其主要元素与结构:

          构造函数初始化算法参数。指定算法名称与描述,并设置以下参数值:
          • popSize = 50 // 种群规模
          • constC = 0.8 // 探索阶段阈值常数
          • w, aParam, p, theta // 算法使用参数的原始值
          方法
          • SetParams() —— 根据"params"数据数组设置参数值。
          • Init() —— 初始化取值范围与算法执行迭代数,后续将基于这些参数执行算法。
          • Moving() —— 移动粒子并执行算法迭代。
          • Revision() —— 分析并调整种群状态。

          私有方法

          • CalculateW(), CalculateA(), CalculateP(), CalculateTheta() —— 计算对应参数。
          • IsExplorationPhase() —— 判断算法是否处于探索阶段。
          //——————————————————————————————————————————————————————————————————————————————
          class C_AO_CSA : public C_AO
          {
            public: //--------------------------------------------------------------------
            C_AO_CSA ()
            {
              ao_name = "CSA";
              ao_desc = "Circle Search Algorithm";
              ao_link = "https://www.mql5.com/en/articles/17143";
          
              popSize = 50;     // population size
              constC  = 0.8;    // optimal value for the exploration phase
              w       = M_PI;   // initial value w
              aParam  = M_PI;   // initial value a
              p       = 1.0;    // initial value p
              theta   = 0;      // initial value of the angle
          
              ArrayResize (params, 2);
              params [0].name = "popSize";     params [0].val = popSize;
              params [1].name = "constC";      params [1].val = constC;
            }
          
            void SetParams ()
            {
              popSize = (int)params [0].val;
              constC  = params      [1].val;
            }
          
            bool Init (const double &rangeMinP  [],  // minimum values
                       const double &rangeMaxP  [],  // maximum values
                       const double &rangeStepP [],  // step change
                       const int     epochsP = 0);   // number of epochs
          
            void Moving   ();
            void Revision ();
          
            //----------------------------------------------------------------------------
            double constC;      // constant for determining the search phase [0,1]
          
            private: //-------------------------------------------------------------------
            int epochs;         // maximum number of iterations
            int epochNow;       // current iteration
          
            // Parameters for CSA
            double w;           // parameter for calculating the angle
            double aParam;      // parameter a from the equation (8)
            double p;           // parameter p from the equation (9)
            double theta;       // search angle
          
            double CalculateW ();
            double CalculateA ();
            double CalculateP ();
            double CalculateTheta (double currentW, double currentP);
            bool IsExplorationPhase ();
          };
          //——————————————————————————————————————————————————————————————————————————————
          

          Init方法用于初始化CSA算法的参数。其参数包括:rangeMinP[]表示搜索空间各维度的最小值数组;rangeMaxP[]表示搜索空间各维度的最大值数组;rangeStepP[]表示各维度参数变化的步长增量数组;epochsP表示指定的迭代周期数(默认值为0)。

          执行StandardInit方法,尝试对算法标准参数进行初始化。如果初始化成功,则设置epochs和epochNow变量。epochs变量:从输入参数epochsP获取迭代周期总数;epochNow变量:将当前迭代计数器清零。方法执行完毕时返回true,表示算法参数已成功初始化。

          //——————————————————————————————————————————————————————————————————————————————
          bool C_AO_CSA::Init (const double &rangeMinP  [],
                               const double &rangeMaxP  [],
                               const double &rangeStepP [],
                               const int     epochsP = 0)
          {
            if (!StandardInit (rangeMinP, rangeMaxP, rangeStepP)) return false;
          
            //----------------------------------------------------------------------------
            epochs   = epochsP;
            epochNow = 0;
            return true;
          }
          //——————————————————————————————————————————————————————————————————————————————
          

          C_AO_CSA类中Moving方法实现了CSA算法中智能体位置更新的核心逻辑。方法开始时,先将当前迭代计数器加1,用于跟踪已执行的迭代次数(后续计算方程时会用到)。接下来,检查是否需要初始化智能体坐标。如果是首次调用,则在给定范围内为所有智能体生成随机坐标。将坐标按步长进行调整。随后,将“需要修正”标识设置为true。

          如果此方法并非首次调用,则更新算法的关键参数w、aParam和p。随后对每个智能体计算θ角,并更新坐标。每个坐标的更新综合考虑最优智能体坐标、随机因子影响以及θ角。更新后,再次把结果限定在指定范围内。

          //——————————————————————————————————————————————————————————————————————————————
          void C_AO_CSA::Moving ()
          {
            epochNow++;
          
            //----------------------------------------------------------------------------
            if (!revision)
            {
              for (int i = 0; i < popSize; i++)
              {
                for (int j = 0; j < coords; j++)
                {
                  a [i].c [j] = u.RNDfromCI (rangeMin [j], rangeMax [j]);
                  a [i].c [j] = u.SeInDiSp (a [i].c [j], rangeMin [j], rangeMax [j], rangeStep [j]);
                }
              }
              revision = true;
              return;
            }
          
            //----------------------------------------------------------------------------
            w      = CalculateW ();    // Update w linearly
            aParam = CalculateA ();    // Update a
            p      = CalculateP ();    // Update p
          
            for (int i = 0; i < popSize; i++)
            {
              theta = CalculateTheta (w, p);
          
              for (int j = 0; j < coords; j++)
              {
                a [i].c [j] = cB [j] + u.RNDprobab () * (cB [j] - a [i].c  [j]) * tan (theta);
                a [i].c [j] = u.SeInDiSp (a [i].c [j], rangeMin [j], rangeMax [j], rangeStep [j]);
              }
            }
          }
          //——————————————————————————————————————————————————————————————————————————————
          

          Revision方法负责更新整个种群的最优解。其检查当前各智能体的目标函数值,如果发现更优解,则更新对应参数。

          //——————————————————————————————————————————————————————————————————————————————
          void C_AO_CSA::Revision ()
          {
            for (int i = 0; i < popSize; i++)
            {
              // Update the best global solution
              if (a [i].f > fB)
              {
                fB = a [i].f;
                ArrayCopy (cB, a [i].c, 0, 0, WHOLE_ARRAY);
              }
            }
          }
          //——————————————————————————————————————————————————————————————————————————————
          

          CalculateW方法用于计算参数w的值,从初始值M_PI线性递减至0,递减幅度取决于当前迭代次数(epochNow)相对于总迭代次数的比例,并返回计算得到的w值。该参数参与后续θ角的计算。

          //——————————————————————————————————————————————————————————————————————————————
          double C_AO_CSA::CalculateW ()
          {
            // Linear decrease of w from the initial value (M_PI) to 0
            return M_PI * (1.0 - (double)epochNow / epochs);
            //return w * u.RNDprobab () - w;
          }
          //——————————————————————————————————————————————————————————————————————————————
          
          CalculateA方法用于计算aParam的值,随着epochNow的增加,aParam从M_PI二次递减至0,递减曲线取决于总迭代次数。
          //——————————————————————————————————————————————————————————————————————————————
          double C_AO_CSA::CalculateA ()
          {
            return M_PI - M_PI * MathPow ((double)epochNow / epochs, 2);
          }
          //——————————————————————————————————————————————————————————————————————————————
          

          CalculateP方法用于计算参数p的值,随着epochNow的增加,p从"1.0"递减至"0.1",其变化仅取决于当前迭代次数。

          //——————————————————————————————————————————————————————————————————————————————
          double C_AO_CSA::CalculateP ()
          {
            return 1.0 - 0.9 * MathPow ((double)epochNow / epochs, 0.5);
          }
          //——————————————————————————————————————————————————————————————————————————————
          

          CalculateTheta方法利用当前的currentW与currentP参数计算θ值。

          • 若当前处于探索阶段,返回currentW乘以一个随机数。
          • 否则,返回currentW与currentP的乘积。

          //——————————————————————————————————————————————————————————————————————————————
          double C_AO_CSA::CalculateTheta (double currentW, double currentP)
          {
            // Use the aParam parameter to adjust the angle
            if (IsExplorationPhase ()) return currentW * u.RNDprobab ();
            else return currentW * currentP;
          
          }
          //——————————————————————————————————————————————————————————————————————————————
          

          IsExplorationPhase方法用于检查当前迭代是否处于探索阶段。

          //——————————————————————————————————————————————————————————————————————————————
          bool C_AO_CSA::IsExplorationPhase ()
          {
            // Research in the first part of the iterations (constC is usually 0.8)
            return (epochNow <= constC * epochs);
          }
          //——————————————————————————————————————————————————————————————————————————————
          


          测试结果

          算法作者将其定位为一种高效的优化方法。然而,经过实现、改进和最终测试后,结果并不尽如人意。该算法虽能进入排名表,但其表现明显逊于当前最优算法解决方案。

          CSA|Circle Search Algorithm|50.0|0.8|
          =============================
          5 Hilly's; Func runs: 10000; result: 0.6656012653478078
          25 Hilly's; Func runs: 10000; result: 0.4531682514562617
          500 Hilly's; Func runs: 10000; result: 0.2912586479936386
          =============================
          5 Forest's; Func runs: 10000; result: 0.6879687203647712
          25 Forest's; Func runs: 10000; result: 0.41397289345600924
          500 Forest's; Func runs: 10000; result: 0.2052507546137296
          =============================
          5 Megacity's; Func runs: 10000; result: 0.3753846153846153
          25 Megacity's; Func runs: 10000; result: 0.2363076923076922
          500 Megacity's; Func runs: 10000; result: 0.10646153846153927
          =============================
          总分:3.43537 (38.17%)

          可视化算法运行显示出其在收敛性上存在问题,并容易陷入局部极值。尽管如此,该算法仍然尽其所能地运行。尽管存在陷入“陷阱”的问题(从收敛图上的长水平段可清晰看出),但它在高维问题上仍展现出相当有效的运行能力。

          Hilly值

          CSA在Hilly测试函数上

          Forest值

          CSA在Forest测试函数上

          Megacity值

          CSA在Megacity测试函数上

          根据算法测试的结果,CSA在排名表中位列第41位。

          # AO 描述 Hilly值 Hilly最终值 Forest值 Forest最终值 Megacity (离散) 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 ANS 跨邻域搜索 0.94948 0.84776 0.43857 2.23581 1.00000 0.92334 0.39988 2.32323 0.70923 0.63477 0.23091 1.57491 6.134 68.15
          2 CLA 密码锁算法(joo) 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 AMOm 动物迁徙优化M 0.90358 0.84317 0.46284 2.20959 0.99001 0.92436 0.46598 2.38034 0.56769 0.59132 0.23773 1.39675 5.987 66.52
          4 (P+O)ES (P+O) 进化策略 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
          5 CTA 彗星尾算法(joo) 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
          6 TETA 时间演化旅行算法(joo) 0.91362 0.82349 0.31990 2.05701 0.97096 0.89532 0.29324 2.15952 0.73462 0.68569 0.16021 1.58052 5.797 64.41
          7 SDSm 随机扩散搜索 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
          8 AAm 射箭算法M 0.91744 0.70876 0.42160 2.04780 0.92527 0.75802 0.35328 2.03657 0.67385 0.55200 0.23738 1.46323 5.548 61.64
          9 ESG 社会群体的进化(joo) 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
          10 SIA 模拟各向同性退火(joo) 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
          11 ACS 人工协同搜索 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
          12 DA 辩证算法 0.86183 0.70033 0.33724 1.89940 0.98163 0.72772 0.28718 1.99653 0.70308 0.45292 0.16367 1.31967 5.216 57.95
          13 BHAm 黑洞算法M 0.75236 0.76675 0.34583 1.86493 0.93593 0.80152 0.27177 2.00923 0.65077 0.51646 0.15472 1.32195 5.196 57.73
          14 ASO 无序社会优化 0.84872 0.74646 0.31465 1.90983 0.96148 0.79150 0.23803 1.99101 0.57077 0.54062 0.16614 1.27752 5.178 57.54
          15 RFO 皇家同花顺优化(joo) 0.83361 0.73742 0.34629 1.91733 0.89424 0.73824 0.24098 1.87346 0.63154 0.50292 0.16421 1.29867 5.089 56.55
          16 AOSm 原子轨道搜索M 0.80232 0.70449 0.31021 1.81702 0.85660 0.69451 0.21996 1.77107 0.74615 0.52862 0.14358 1.41835 5.006 55.63
          17 TSEA 龟壳演化算法(joo) 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
          18 DE 差分进化 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
          19 CRO 化学反应优化 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
          20 BSA 鸟群算法 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
          21 HS 和声搜索 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
          22 SSG 树苗播种和生长 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
          23 BCOm 细菌趋化性优化算法M 0.75953 0.62268 0.31483 1.69704 0.89378 0.61339 0.22542 1.73259 0.65385 0.42092 0.14435 1.21912 4.649 51.65
          24 ABO 非洲水牛优化 0.83337 0.62247 0.29964 1.75548 0.92170 0.58618 0.19723 1.70511 0.61000 0.43154 0.13225 1.17378 4.634 51.49
          25 (PO)ES (PO) 进化策略 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
          26 TSm 禁忌搜索M 0.87795 0.61431 0.29104 1.78330 0.92885 0.51844 0.19054 1.63783 0.61077 0.38215 0.12157 1.11449 4.536 50.40
          27 BSO 头脑风暴优化 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
          28 WOAm 鲸鱼优化算法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
          29 AEFA 人工电场算法 0.87700 0.61753 0.25235 1.74688 0.92729 0.72698 0.18064 1.83490 0.66615 0.11631 0.09508 0.87754 4.459 49.55
          30 AEO 基于人工生态系统的优化算法 0.91380 0.46713 0.26470 1.64563 0.90223 0.43705 0.21400 1.55327 0.66154 0.30800 0.28563 1.25517 4.454 49.49
          31 ACOm 蚁群优化 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
          32 BFO-GA 细菌觅食优化 - 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
          33 SOA 简单优化算法 0.91520 0.46976 0.27089 1.65585 0.89675 0.37401 0.16984 1.44060 0.69538 0.28031 0.10852 1.08422 4.181 46.45
          34 ABHA 人工蜂巢算法 0.84131 0.54227 0.26304 1.64663 0.87858 0.47779 0.17181 1.52818 0.50923 0.33877 0.10397 0.95197 4.127 45.85
          35 ACMO 大气云模型优化 0.90321 0.48546 0.30403 1.69270 0.80268 0.37857 0.19178 1.37303 0.62308 0.24400 0.10795 0.97503 4.041 44.90
          36 ADAMm 群体自适应矩估计M 0.88635 0.44766 0.26613 1.60014 0.84497 0.38493 0.16889 1.39880 0.66154 0.27046 0.10594 1.03794 4.037 44.85
          37 ATAm 人工部落算法M 0.71771 0.55304 0.25235 1.52310 0.82491 0.55904 0.20473 1.58867 0.44000 0.18615 0.09411 0.72026 3.832 42.58
          38 ASHA 人工淋浴算法 0.89686 0.40433 0.25617 1.55737 0.80360 0.35526 0.19160 1.35046 0.47692 0.18123 0.09774 0.75589 3.664 40.71
          39 ASBO 适应性社会行为优化 0.76331 0.49253 0.32619 1.58202 0.79546 0.40035 0.26097 1.45677 0.26462 0.17169 0.18200 0.61831 3.657 40.63
          40 MEC 思维进化计算 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
          41 CSA 圆搜索算法 0.66560 0.45317 0.29126 1.41003 0.68797 0.41397 0.20525 1.30719 0.37538 0.23631 0.10646 0.71815 3.435 38.17
          42 IWO 入侵杂草优化 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
          43 Micro-AIS 微型人工免疫系统 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
          44 COAm 布谷鸟优化算法 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
          45 SDOm 螺旋动力学优化 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
          RW 随机游走 0.48754 0.32159 0.25781 1.06694 0.37554 0.21944 0.15877 0.75375 0.27969 0.14917 0.09847 0.52734 2.348 26.09


          总结

          基于对CSA的测试与性能分析,可得出以下结论:尽管其几何概念清晰,且沿圆切线移动的搜索机制直观,但在对比测试中表现相对疲弱,在45种优化算法排行榜中仅位列第41。表明当前实现存在明显的局限性。

          算法的主要问题在于易陷入局部极值,尤其在低维简单问题上尤为突出。可能的原因包括:首先,切角搜索机制看似前景良好,但在实践中却不足以跳出局部最优。其次,由constC参数调控的探索与利用阶段平衡,未能提供足够的搜索多样性。这样导致整个种群坍缩至“伪优”解(即单点),即便在更新智能体位置的主方程中引入随机分量尝试“扰动”种群,也未见成效。

          尽管尝试在智能体位置更新方程中加入随机乘数,使算法行为更具可预测性,但未能显著提升其效率。这可能表明,基于圆几何特性的算法基本思想,要么作者在当前实现中未能充分挖掘,要么在全局优化语境下存在根本局限。

          然而,该算法仍展现出一定搜索能力,在特定问题场景中可能表现有效,尤其是针对目标函数相对简单的优化问题。为了提升其效率,建议进一步研究跳出局部极值的机制,例如引入额外的搜索多样性机制,或与其他优化方法结合(优先将该搜索策略作为组件嵌入其他优化算法)。

          标签

          图例3. 算法在相应测试中的颜色渐变表示

          图表

          图例4. 算法测试结果的直方图(评分范围为0到100,越高越好,其中100为理论上的最高可能得分,档案中附有计算排名表的脚本)


          CSA的优缺点:

          优点:

          1. 少量外部参数
          2. 实现简单
          3. 利用圆的几何特性的一个有趣的理念

          缺点:

          1. 收敛精度较低
          2. 局部极端卡陷

          文章附有一个包含当前版本算法代码的归档文件。本文作者对标准算法描述的绝对准确性不承担责任。为提升搜索能力,已经对其中的许多算法进行了修改。文章中表述的结论和论断都是基于实验的结果。

          文中所用的程序

          # 名称 类型 描述
          1 #C_AO.mqh

          种群优化算法的基类
          2 #C_AO_enum.mqh

          种群优化算法的枚举说明
          3 TestFunctions.mqh

          测试函数库
          4
          TestStandFunctions.mqh

          测试台函数库
          5
          Utilities.mqh

          辅助函数库
          6
          CalculationTestResults.mqh

          用于计算比较表结果的脚本
          7
          Testing AOs.mq5
          脚本 面向所有种群优化算法的统一测试平台
          8
          Simple use of population optimization algorithms.mq5
          脚本
          种群优化算法非可视化简易使用案例
          9
          Test_AO_CSA.mq5
          脚本 CSA测试台

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

          附加的文件 |
          CSA.zip (164.1 KB)
          您应当知道的 MQL5 向导技术(第 54 部分):搭配混合 SAC 和张量的强化学习 您应当知道的 MQL5 向导技术(第 54 部分):搭配混合 SAC 和张量的强化学习
          软性参与者-评论者是一种强化学习算法,我们曾在之前的系列文章中考察过 Python 和 ONNX,作为高效的网络训练方式。我们重新审视该算法,意在利用张量,即 Python 中常用的计算图形。
          在MQL5中创建交易管理面板(第九部分):代码组织(5):分析面板(AnalyticsPanel)类 在MQL5中创建交易管理面板(第九部分):代码组织(5):分析面板(AnalyticsPanel)类
          在本文中,我们将探讨如何获取实时市场数据和交易账户信息,执行各种计算,并将结果展示在自定义面板上。为此,我们将深入开发一个分析面板(AnalyticsPanel)类,该类封装了所有这些功能,包括面板创建功能。这项工作是我们正在进行的新建管理面板智能交易系统(EA)扩展工作的一部分,旨在运用模块化设计原则和代码组织的最佳实践来引入高级功能。
          百年数学函数如何革新您的交易策略? 百年数学函数如何革新您的交易策略?
          本文聚焦R德马赫(Rademacher)函数与沃尔什(Walsh)函数。探讨如何将这两类诞生于20世纪初的数学工具应用于金融时间序列分析,并揭示其在交易策略中的创新应用场景。
          JSON 从入门到精通: 创建自己的 MQL5 版本 JSON 解读器 JSON 从入门到精通: 创建自己的 MQL5 版本 JSON 解读器
          体验分步指南,创建自定义的 MQL5 版本 JSON 解析器,囊括对象和数组处理、错误检查、及序列化。通过这款灵活的解决方案,在 MetaTrader 5 中处理 JSON,获取桥接交易逻辑与结构化数据的实用见解。