种群优化算法:鲸鱼优化算法(WOA)·进阶篇
鲸鱼算法里的位置更新与精英替换
这段逻辑是鲸鱼优化(WOA)变体在 MT5 EA 里的核心迭代:先按当前代数 epochNow 与总代数 epochs 算收敛系数 aKo = 2.0 - epochNow*(2.0/epochs),它从 2 线性降到 0,决定搜索是全局还是局部。
| 随机量 r 取自 [-1,1],A = 2*aKo*r - aKo、C = 2*r。当 | A | >1 时个体朝随机领导者或当前最优偏移做探索; | A | <=1 则朝 cB(历史最优坐标)收缩做开发。 |
|---|---|---|---|---|
| 若 p < refProb 走包围机制,否则按 spiralProb 切到螺旋方程:x = 原坐标 + | 原坐标-新坐标 | *exp(b*l)*cos(2π*l),b 即 spiralCoeff;不进螺旋时由 PowerDistribution 在 rangeMin 附近做幂分布扰动,增强跳出局部。 |
Revision() 在每代末扫一遍种群:若某个体适应度 a[i].f 优于记录值 fB,就更新 fB 并 ArrayCopy 其坐标进 cB;同时把更优的本次结果写回 agent[i].fPrev,供下一代算偏移基准。 外汇与贵金属行情噪声大,这类启发式寻参只给出参数空间的概率较优解,实盘前务必在 MT5 策略测试器用历史数据验证过拟合风险。
for (class="type">int i = class="num">0; i < popSize; i++) { for (class="type">int c = class="num">0; c < coords; c++) { class="type">class="kw">double aKo = class="num">2.0 - epochNow * (class="num">2.0 / epochs); class="type">class="kw">double r = u.RNDfromCI(-class="num">1, class="num">1); class="type">class="kw">double A = class="num">2.0 * aKo * r - aKo; class="type">class="kw">double C = class="num">2.0 * r; class="type">class="kw">double b = spiralCoeff; class="type">class="kw">double l = u.RNDfromCI(-class="num">1, class="num">1); class="type">class="kw">double p = u.RNDprobab(); class="type">class="kw">double x; if (p < refProb) { if (MathAbs(A) > class="num">1.0) { x = cB [c] - A * MathAbs(cB [c] - agent [i].cPrev [c]); class=class="str">"cmt">//Xbest - A * |Xbest - X| } else { class="type">int leaderInd = u.RNDminusOne(popSize); x = agent [leaderInd].cPrev [c] - A * MathAbs(agent [leaderInd].cPrev [c] - agent [i].cPrev [c]); class=class="str">"cmt">//Xlid - A * |Xlid - X|; } } else { if (u.RNDprobab() < spiralProb) { x = agent [i].cPrev [c] + MathAbs(agent [i].cPrev [c] - a [i].c [c]) * MathExp(b * l) * cos(class="num">2 * M_PI * l); class=class="str">"cmt">//XbestPrev + |XbestPrev - X| * MathExp(b * l) * cos(class="num">2 * M_PI * l) } else { x = u.PowerDistribution(cB [c], rangeMin [c], rangeMin [c], class="num">30); } } a [i].c [c] = u.SeInDiSp(x, rangeMin [c], rangeMax [c], rangeStep [c]); } } } class="type">void C_AO_WOAm::Revision() { class="type">int ind = -class="num">1; for (class="type">int i = class="num">0; i < popSize; i++) { if (a [i].f > fB) ind = i; } if (ind != -class="num">1) { fB = a [ind].f; ArrayCopy(cB, a [ind].c, class="num">0, class="num">0, WHOLE_ARRAY); } for (class="type">int i = class="num">0; i < popSize; i++) { if (a [i].f > agent [i].fPrev) { agent [i].fPrev = a [i].f;
「把上一根K线的特征塞进智能体记忆」
这段代码出现在多智能体结构里,作用是把当前 agent[i] 在数组 a[i].c 中算好的特征,整体搬进它的历史记忆区 agent[i].cPrev。 ArrayCopy 的第三、四参数都是 0,表示从源数组第 0 位、写到目标数组第 0 位;第五参数用 WHOLE_ARRAY,代表不指定长度、直接搬完整个数组。 在 MT5 里跑这套逻辑时,先确认 a[i].c 和 agent[i].cPrev 维度一致,否则复制可能截断或越界。外汇与贵金属波动剧烈、杠杆风险高,这类记忆机制只影响模型状态,不预示任何方向。
ArrayCopy(agent [i].cPrev, a [i].c, class="num">0, class="num">0, WHOLE_ARRAY); } } } class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————
◍ WOAm 基准跑分与排名实况
基础版鲸鱼优化在 10000 次函数求值下表现偏弱:Hilly(5/25/500) 得分 0.453 / 0.316 / 0.255,Forest 同配置 0.435 / 0.245 / 0.156,Megacity 离散项 0.340 / 0.188 / 0.101,总分仅 2.49007,相当于理论最优的 27.67%。 改进版 WOAm 换了两个关键动作:用每只鲸鱼的历史最佳位代替当前位作迭代起点,并引入迁移与幂律分布。同样 10000 次跑下来,Hilly(5) 跳到 0.845、Forest(5) 到 0.931、Megacity(5) 到 0.663,总分 4.47627(49.74%),较基础版提升超 22 个百分点。 值得盯一眼的是 Megacity 离散函数:多数算法在这里分布更散、更难收敛,WOAm 却给出 0.663 / 0.411 / 0.114 的集中结果。这大概率来自把群体协作拆成个体阶段行为,先各自找有前景区域再回灌种群。 横向排名表里 WOAm 列第 10,前面是 BGA、双 (P+O)ES、SDSm 等老牌元启发式,最终值 4.476、最大百分比 49.74%;ACOm 以 4.438 紧咬其后。Ackley 函数虽给了可视化但不计入排名评分,验证时别把它混进总分对照。 外汇与贵金属市场属高风险领域,此类优化器仅作策略参数搜索的辅助手段,实盘前务必在 MT5 策略测试器用历史数据复跑上述函数配置。
三组优化器在样本集上的实测指标对照
把 GWO、CSS、EM 三种群体智能优化器丢进同一组测试函数,跑出来的数值能直接看出偏好差异。GWO 的总误差 1.25326 偏高,但末列耗时 22.32 单位也最长;CSS 压缩到 1.14907,耗时降到 20.46;EM 更进一步,总误差 1.13129、耗时 19.85,三项核心偏差也普遍低于前两者。 具体看单维偏差:GWO 在第 9 维给出 0.37158,而 EM 同维仅 0.41085 却在第 7 维冲到 0.10057,说明不同算法对各维度的敏感度错开。做 MT5 参数寻优时,若你的目标函数维度稀疏,直接套 GWO 可能浪费算力。 外汇与贵金属实盘用这类优化器调参属高风险操作,过拟合历史窗口的概率不低;建议先把上面三行数据当基准,在策略测试器里复跑同周期样本,确认本地环境数值偏差不超过 5% 再谈迁移。
「把工具请下神坛」
WOAm 这套改写版鲸鱼优化算法,架构简单、实现门槛低,在陡峭的 Forest 函数和离散 Megacity 上拿到了稳定且良好的评分,对计算资源也不挑剔。但在 1000 个变量的平滑 Hilly 函数上,数值单元格颜色显示它为所列算法中表现最差的一项,说明高维平滑任务的可扩展性偏低,收敛性也到不了理论满分的 100%。 想继续压低陷入局部极值的概率,可以沿四条路做实验:维持种群多样化的变异或交叉机制;跨代保留若干精英解;同时跑多种搜索策略;把 WOA 与差分进化或粒子群杂交来改善探索阶段。这些都不是玄学,开 MT5 把附带的 WOAm.zip(24.34 KB)解包就能改参数复跑。 外汇与贵金属市场高风险,任何优化算法给出的都是概率倾向而非确定路径;把它当实验室里的扳手而不是圣物,才有机会在实盘里少交学费。