大气云模型优化(ACMO):实战·综合运用
(3/3)·从水滴分布到全局解更新,用实测数据看元启发式在测试函数上的真实表现
水滴间信息传递让收敛分数跳涨
先跑原版大气云模型(ACMO)做基准:5/25/500 维 Hilly 函数得分 0.602 / 0.343 / 0.253,Forest 为 0.478 / 0.261 / 0.173,Megacity 为 0.351 / 0.162 / 0.096,总分 2.718(30.20%)。作者判断收敛性差,核心原因是水滴(解)之间缺少直接交互,没有把较优解的湿度信息传给较差解。 改成 ACMOm 后,逻辑上加了一条:以一定概率把最佳水滴的信息丢给最差水滴。同样 10000 次运行下,Hilly 5维从 0.602 升到 0.903,Forest 5维从 0.478 升到 0.803,Megacity 5维从 0.351 升到 0.623;总分拉到 4.041(44.90%),提升约 14.7 个百分点。 在 45 种算法横向表里,改版 ACMO 排第 27 位。前一名 ABHA 是 4.127,后一名 ASBO 是 3.657,夹在中间算稳定段。随着表内算法增多,相邻分差会持续收窄,这个区间可看作已知顶级方法的密集区。 收敛图显示:低维(如 5 维)长平直段明显,说明算法仍可能陷局部极值;维数加到 500 后该缺陷倾向消失。RainProcess 方法按 drops 数组累加每朵云落下的水滴数来更新湿度指标,可视化的云簇形态会随区域数、云数、初始熵和干燥阈值变化。
◍ 从表尾算法看降水过程的落点逻辑
上面那串横向对比里,排在第29到45位的算法实测得分跨度很大:Micro-AIS 综合分 3.379、排名 37.54,而 PSO 只有 2.230、排名 24.77,Boids 虚拟生物算法也仅 2.229。越靠后的元启发式在外汇样本上的收敛质量倾向更弱,但这不代表不能拿来做降水式参数扩散的底子。 RainProcess 这个函数就是云滴下落的调度核心。rev 为 false 时所有云初始化为满湿度 1.0,相当于冷启动均匀撒点;rev 为 true 时才按区域湿度累加,缺失湿度用 minGp 兜底,这一步决定了优化初期探索是否偏向历史湿润区。 落点不是均匀随机,而是用 GaussDistribution 按云的熵距和超熵做高斯扰动,越界就拉回区间。外汇与贵金属市场高风险,这种基于云模型的采样在 MT5 里跑 EURUSD 15M 回测时,可能比纯 PSO 少陷进局部极值,但概率优势依赖 coords 与 cloudsNumber 的配比,建议直接抄下面代码改 cloudsNumber 验证。
class=class="str">"cmt">//—————————————————————————————————————————————————————————————————————————————— class="type">void C_AO_ACMO::RainProcess(class="type">bool &rev) { class=class="str">"cmt">//to shed drops from every cloud---------------------------------------------- class="type">class="kw">double cloud []; class="type">int drops []; ArrayResize(cloud, cloudsNumber); ArrayResize(drops, cloudsNumber); if (!rev) { ArrayInitialize(cloud, class="num">1.0); } else { ArrayInitialize(cloud, class="num">0.0); class="type">class="kw">double humidity; for (class="type">int i = class="num">0; i < cloudsNumber; i++) { for (class="type">int c = class="num">0; c < coords; c++) { humidity = areas [c].regions [clouds [i].regionIndex [c]].humidity; if (humidity != -DBL_MAX) cloud [i] += humidity; else cloud [i] += minGp; } } } DropletsDistribution(cloud, drops); class=class="str">"cmt">//ArrayPrint(drops); class="type">class="kw">double dist = class="num">0.0; class="type">class="kw">double centre = class="num">0.0; class="type">class="kw">double xMin = class="num">0.0; class="type">class="kw">double xMax = class="num">0.0; class="type">class="kw">double x = class="num">0.0; class="type">int dCNT = class="num">0; for (class="type">int i = class="num">0; i < cloudsNumber; i++) { for (class="type">int dr = class="num">0; dr < drops [i]; dr++) { for (class="type">int c = class="num">0; c < coords; c++) { dist = clouds [i].entropy [c]; centre = clouds [i].center [c]; xMin = centre - dist; xMax = centre + dist; x = u.GaussDistribution(centre, xMin, xMax, clouds [i].hyperEntropy); if (x < rangeMin [c]) x = u.RNDfromCI(rangeMin [c], centre);
「变异与择优的落点写进种群」
上面这段是云滴生成循环收尾,核心在做两件事:越界回拉、以及用概率择优覆盖劣解。x 若超出当前维度的 rangeMax,就由 RNDfromCI 在 centre 与 rangeMax[c] 之间重抽,再用 SeInDiSp 夹回步长网格,保证不跑出可行域。 随后随机挑一个下标 p,若它的适应度 a[p].f 优于当前最差滴 a[dCNT].f,则以 0.95 概率直接继承 p 的同维参数;否则把刚生成的 x 写回。这个 0.95 不是拍脑袋,是留 5% 扰动空间防止早收敛,外汇与贵金属回测里过早收敛常导致样本外崩坏,属高风险区。 循环末尾 dCNT 自增,内层走完再把 drops[i] 累加到 clouds[i].droplets,完成一代云滴注入。开 MT5 把 0.95 改成 0.80 对比代际多样性,能直观看到收敛速度变化。
if (x > rangeMax [c]) x = u.RNDfromCI(centre, rangeMax [c]); x = u.SeInDiSp(x, rangeMin [c], rangeMax [c], rangeStep [c]); class="type">int p = u.RNDminusOne(popSize); if (a [p].f > a [dCNT].f) { if (u.RNDprobab() < class="num">0.95) a [dCNT].c [c] = a [p].c [c]; } else { a [dCNT].c [c] = x; } } dCNT++; } clouds [i].droplets += drops [i]; } } class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————
画得少,看得清
ACMO 这套群体优化思路,原始版靠云在高压区被推去低压区来躲局部极值,改版把种群内信息交换概率提到 95%,收敛性上去了,却也把陷进局部最优的概率抬了上来——核心矛盾一直是「别困死」和「找得准」之间的拉锯。 测试直方图里评分封顶是 100(理论最高),颜色等级 ≥0.99 的结果用白色标出,说明真跑到极优解的样本并不多;想稳一点,直接把代码里那 95% 的交换概率调小就行。 它参数多、实现重,但区域湿度规则、压力分布、云质量相关的加速度惯性这些物理 trick 确实给后续改算法留了底子。外汇与贵金属优化回测高风险,拿去跑 EA 前先在 MT5 策略测试器里用作者附的 ZIP 验一遍收敛曲线再谈实盘。