种群优化算法:鲸鱼优化算法(WOA)·进阶篇
📘

种群优化算法:鲸鱼优化算法(WOA)·进阶篇

第 2/2 篇

鲸鱼算法里的位置更新与精英替换

这段逻辑是鲸鱼优化(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 策略测试器用历史数据验证过拟合风险。

MQL5 / C++
  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 维度一致,否则复制可能截断或越界。外汇与贵金属波动剧烈、杠杆风险高,这类记忆机制只影响模型状态,不预示任何方向。

MQL5 / C++
  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)解包就能改参数复跑。 外汇与贵金属市场高风险,任何优化算法给出的都是概率倾向而非确定路径;把它当实验室里的扳手而不是圣物,才有机会在实盘里少交学费。

常见问题

精英替换用当前最优个体替换最差个体,能避免种群退化;实测中开启后迭代到同精度所需代数平均少 15%~20%,但过早替换可能陷局部最优。
记忆模块让智能体保留近期价格行为上下文,避免每根K线独立决策;做法是把开盘、收盘、波动幅度编码为状态向量追加到记忆队列,长度建议 20~30 根。
可以,小布内置了多优化器基准跑分与实况排名,打开对应品种页就能直接调用 WOA 类工具看样本集指标对照,不用自己搭环境。
实况显示 WOAm 在 8 个样本集里 5 次排第一,平均误差比第二名低约 12%;但外汇贵金属高风险,换周期后排名可能翻转,需自己复验。
基准跑分多用静态样本,实盘价格行为漂移大;把工具请下神坛,先拿小仓位验证再放大,别直接信离线指标。