圆搜索算法(CSA)·进阶篇
群体智能里的权重与相位切换
这段代码实现了一个基于布谷鸟搜索思路的优化器核心方法,关键在几个系数随迭代进度的非线性变化。 CalculateW 让 w 从 M_PI 线性降到 0,公式为 M_PI * (1.0 - epochNow / epochs);CalculateA 则用平方曲线从 M_PI 降到 0;CalculateP 从 1.0 按平方根曲线降到 0.1(1.0 - 0.9 * pow(epochNow/epochs, 0.5))。 IsExplorationPhase 以 constC(通常 0.8)为界:前 80% 迭代算探索期,theta 取 currentW * 随机概率;之后进入开发期,theta = currentW * currentP。Revision 方法在个体适应度 a[i].f 优于历史最优 fB 时,用 ArrayCopy 把该个体解 cB 覆盖更新。 在 MT5 里把 constC 从 0.8 调到 0.6,探索期缩短,开发期提前,贵金属回测中可能更快收敛但也可能陷局部最优,外汇品种同样属高风险验证。
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]); } } } class=class="str">"cmt">//—————————————————————————————————————————————————————————————————————————————— class=class="str">"cmt">//—————————————————————————————————————————————————————————————————————————————— class="type">void C_AO_CSA::Revision() { for (class="type">int i = class="num">0; i < popSize; i++) { class=class="str">"cmt">// Update the best global solution if (a [i].f > fB) { fB = a [i].f; ArrayCopy(cB, a [i].c, class="num">0, class="num">0, WHOLE_ARRAY); } } } class=class="str">"cmt">//—————————————————————————————————————————————————————————————————————————————— class=class="str">"cmt">//—————————————————————————————————————————————————————————————————————————————— class="type">class="kw">double C_AO_CSA::CalculateW() { class=class="str">"cmt">// Linear decrease of w from the initial value(M_PI) to class="num">0 class="kw">return M_PI * (class="num">1.0 - (class="type">class="kw">double)epochNow / epochs); class=class="str">"cmt">//class="kw">return w * u.RNDprobab() - w; } class=class="str">"cmt">//—————————————————————————————————————————————————————————————————————————————— class=class="str">"cmt">//—————————————————————————————————————————————————————————————————————————————— class="type">class="kw">double C_AO_CSA::CalculateA() { class="kw">return M_PI - M_PI * MathPow((class="type">class="kw">double)epochNow / epochs, class="num">2); } class=class="str">"cmt">//—————————————————————————————————————————————————————————————————————————————— class=class="str">"cmt">//—————————————————————————————————————————————————————————————————————————————— class="type">class="kw">double C_AO_CSA::CalculateP() { class="kw">return class="num">1.0 - class="num">0.9 * MathPow((class="type">class="kw">double)epochNow / epochs, class="num">0.5); } class=class="str">"cmt">//—————————————————————————————————————————————————————————————————————————————— class=class="str">"cmt">//—————————————————————————————————————————————————————————————————————————————— class="type">class="kw">double C_AO_CSA::CalculateTheta(class="type">class="kw">double currentW, class="type">class="kw">double currentP) { class=class="str">"cmt">// Use the aParam parameter to adjust the angle if (IsExplorationPhase()) class="kw">return currentW * u.RNDprobab(); else class="kw">return currentW * currentP; } class=class="str">"cmt">//—————————————————————————————————————————————————————————————————————————————— class=class="str">"cmt">//—————————————————————————————————————————————————————————————————————————————— class="type">bool C_AO_CSA::IsExplorationPhase() { class=class="str">"cmt">// Research in the first part of the iterations(constC is usually class="num">0.8) class="kw">return (epochNow <= constC * epochs); } class=class="str">"cmt">//—————————————————————————————————————————————————————————————————————————————— class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————
◍ CSA 实测跑分与排名落点
把 Circle Search Algorithm 接进 MT5 优化框架后,作者原想的「高效」并没有兑现。它在三组测试函数上各跑 10000 次,Hilly 下 5/25/500 维得分 0.666 / 0.453 / 0.291,Forest 同维度 0.688 / 0.414 / 0.205,Megacity 离散场景 0.375 / 0.236 / 0.106,总分 3.43537,折算百分比 38.17%。 收敛图暴露了硬伤:长水平段意味着算法卡在局部极值出不来。但在 500 维高维问题上,它仍跑出了相对有效的搜索轨迹,不是完全不可用。 横向拉表看,头名 ANS 跨邻域搜索总分 6.134(68.15%),CSA 排第 41 位,落后第一档接近 30 个百分点。外汇与贵金属参数寻优属高风险场景,这类易陷局部解的算法直接上实盘优化可能漏掉全局更优参数组合,建议先在小样本回测对比。 别把正态当圣经 榜尾 ASBO 也有 3.657 分,说明测试函数集区分度有限;CSA 的 38.17% 不代表绝对垃圾,只是当前基准下不占优,换目标函数可能翻盘。
「优化算法横向跑分里的随机游走底线」
上面这组对照把 40~45 号元启发式算法和 RW 随机游走放在同一张表里:Micro-AIS 的综合得分 3.379、胜率类指标 0.79547,COAm 综合 3.349、SDOm 综合 3.280,而 RW 随机游走综合只有 2.348、胜率类 0.48754,相对最低。 从数值看,RW 的第三列收益类指标 0.25781、回撤类 1.06694,明显弱于 MEC 的 0.32661 / 1.55569 与 IWO 的 0.33123 / 1.58058;这说明无记忆的纯随机基准在样本内大概率跑不赢带搜索结构的算法。 外汇与贵金属波动具有跳变和杠杆放大特征,这类回测高分算法实盘仍可能失效,高风险的属性不会因优化得分高而消失。 开 MT5 把 RW 逻辑写成基准脚本来跑一遍,用同周期同品种验证 2.348 这个综合分是否在你本地环境复现,比直接信表更实在。
圆切搜索的可用边界
CSA 在 45 种优化算法横向对比里排第 41,说明当前这套沿圆切线找点的实现确实偏弱。低维简单问题上它最容易卡进局部极值,种群直接坍缩成单点,即便在主方程里塞了随机乘数做扰动也没救回来。 constC 控着的探索与利用平衡没给出足够多样性,是坍缩的主因之一。如果你在 MT5 里跑 Test_AO_CSA.mq5,会看到评分直方图里它多数落在中下区,100 分是理论上限、实际拿不到。 它并非完全没用:目标函数平坦、维度低时仍有点搜索力。真要上生产,建议把它当组件嵌进别的算法,而不是单独扛优化。外汇与贵金属参数优化高风险,回测排第 41 的算法直接实盘等于裸奔。 作者归档里给了 CSA.zip 和统一测试台,想验证上面结论,下下来跑一遍 Testing AOs.mq5 就知道差距在哪。