圆搜索算法(CSA)
内容
概述
CSA是一种受圆几何特性启发的新型优化算法。其独特之处在于利用三角关系和几何原理来探索搜索空间。
CSA基于一个有趣的理念:每个搜索点沿圆的切线轨迹移动,实现全局探索与局部精修平衡。该方法的原创性在于圆具有恒定半径与连续导数等独特数学性质,确保智能体在搜索空间中平滑移动。
算法分“利用”与“探索”两个阶段。在利用阶段,智能体聚焦潜力区域,移动时方向性更强;在探索阶段,智能体则大胆跃入解空间未探索区域。阶段的切换由当前迭代与特殊参数“c”共同调节。
CSA最引人注目的优势在于:它能够在高维空间中保持高效搜索性能的同时,通过直观的几何模型实现算法逻辑的可解释性。种群中每个智能体沿自身独特轨迹行进,轨迹由搜索过程中动态调整的θ角决定。
CSA由Mohammad H. Kaiys、Hany M. Hasanien等研究者开发,于2022年发表。
算法实现
CSA旨在通过随机圆寻找最优解,以扩大搜索区域。它以圆心为目标点。其过程始于切线与圆夹角逐渐减小,使切线逼近圆心(图例1)。
为增加搜索多样性、避免陷入局部最优,切线接触角亦随机变化。在该算法中,Xt切点充当搜索智能体,Xc圆心代表迄今找到的最优解。

图例1. 圆的几何特性及其切线
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伪代码:
- 初始化:
- 设置种群大小(popSize = 50)
- 设置研究阶段常数(constC = 0.8)
- 初始化原始参数:
- w = π(角度参数)
- a = π
- p = 1.0
- θ = 0(原始角度)
- 当处于首次迭代(revision = false)时:
- 对于群体中的每个智能体i:
- 在给定边界内随机初始化坐标
- 根据变动步长调整坐标
- 将revision设置为true
- 返回起始点
- 对于群体中的每个智能体i:
- 否则(进入主优化循环):
- 递增迭代计数器(epochNow++)
- 参数更新:
- w = π × (1 - epochNow/epochs) // 线性下降
- a = π - π × (epochNow/epochs)²
- p = 1 - 0.9 × √(epochNow/epochs)
- 对于种群中的每个个体:
- 确定当前阶段:
- 如果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限制在给定边界内
- 确定当前阶段:
- 结果修正:
- 对于每个智能体:
- 如果智能体适应度 > 全局最优适应度 → 更新全局最优解
- 若智能体适应度 > 局部最优适应度 → 更新智能体局部最优解
- 对于每个智能体:
- 重复步骤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%)
可视化算法运行显示出其在收敛性上存在问题,并容易陷入局部极值。尽管如此,该算法仍然尽其所能地运行。尽管存在陷入“陷阱”的问题(从收敛图上的长水平段可清晰看出),但它在高维问题上仍展现出相当有效的运行能力。

CSA在Hilly测试函数上

CSA在Forest测试函数上

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 | #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
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
本文由网站的一位用户撰写,反映了他们的个人观点。MetaQuotes Ltd 不对所提供信息的准确性负责,也不对因使用所述解决方案、策略或建议而产生的任何后果负责。
您应当知道的 MQL5 向导技术(第 54 部分):搭配混合 SAC 和张量的强化学习
在MQL5中创建交易管理面板(第九部分):代码组织(5):分析面板(AnalyticsPanel)类
百年数学函数如何革新您的交易策略?
JSON 从入门到精通: 创建自己的 MQL5 版本 JSON 解读器