最负盛名的人工协作搜索算法的改进版本(AXSm)·综合运用
◍ 二进制位翻转与越界回弹的实现细节
这段遗传算子里的第一组双重循环,对种群每个个体的每个维度做随机清零:当 u.RNDprobab() 小于 bioProbab 时,把 M[i].c[j] 直接置 0,相当于以概率触发二值基因的「关」操作。 第二组循环在同样条件下又嵌套了一次随机判断:若再次小于 bioProbab 则置 1,否则置 0。这意味着单次维度上发生翻转的概率约为 bioProbab 的平方,实际调参时若 bioProbab=0.1,翻转概率仅 0.01,mutation 强度会被压得很低。 第三组循环做全 1 防御:统计个体所有维度之和,若等于 coords(即全部激活),则随机挑一个维度强制置 0,避免解向量陷入饱和无法搜索。 真正的连续变异在「Mutation」段:a[i].c[j] 先按捕食者-猎物差分公式更新,若二进制掩码 M[i].c[j]>0 则回退为捕食者原值(交叉覆盖),越界时按区间长度随机重投。最后一组循环调用 u.SeInDiSp 按 rangeStep 做离散吸附,保证参数落在网格上。 在 MT5 里把 bioProbab 从 0.1 调到 0.3,能明显看到种群多样性上升,但回测耗时可能翻倍;外汇与贵金属参数优化属高风险实验,结果仅具概率意义。
for (class="type">int i = class="num">0; i < popSize; i++) { for (class="type">int j = class="num">0; j < coords; j++) { if (u.RNDprobab() < bioProbab) { M [i].c [j] = class="num">0; } } } for (class="type">int i = class="num">0; i < popSize; i++) { for (class="type">int j = class="num">0; j < coords; j++) { if (u.RNDprobab() < bioProbab) { if (u.RNDprobab() < bioProbab) { M[i].c[j] = class="num">1; } else { M[i].c[j] = class="num">0; } } } } for (class="type">int i = class="num">0; i < popSize; i++) { class="type">int sum = class="num">0; for (class="type">int c = class="num">0; c < coords; c++) sum += M [i].c [c]; if (sum == coords) { class="type">int j = MathRand() % coords; M [i].c [j] = class="num">0; } } class=class="str">"cmt">// Mutation for (class="type">int i = class="num">0; i < popSize; i++) { for (class="type">int j = class="num">0; j < coords; j++) { a [i].c [j] = Predator [i].c [j] + R * (Prey [i].c [j] - Predator [i].c [j]); class=class="str">"cmt">// Crossover if (M [i].c [j] > class="num">0) { a [i].c [j] = Predator [i].c [j]; } class=class="str">"cmt">// Boundary control if (a [i].c [j] < rangeMin [j] || a [i].c [j] > rangeMax [j]) { a [i].c [j] = rangeMin [j] + (rangeMax [j] - rangeMin [j]) * u.RNDprobab(); } } } class=class="str">"cmt">//---------------------------------------------------------------------------- for (class="type">int i = class="num">0; i < popSize; i++) { for (class="type">int j = class="num">0; j < coords; j++) { a [i].c [j] = u.SeInDiSp(a [i].c [j], rangeMin [j], rangeMax [j], rangeStep [j]); } }
「三版协作搜索的实测得分对比」
把人工协作搜索(ACS)的三个已知修改版逐一跑在 Hilly、Forest、Megacity 三类测试函数上,每函数固定 10000 次运行,能直接看出改参到底值不值。第一版(m1,协作系数 1.0 / 0.7)总得分 5.28986,折合 58.78%;相比基础版,在 1000 变量的 Hilly 与 50、1000 变量的 Forest 上改善明显,但 500 变量 Megacity 只拿到 0.139,依旧偏弱。 第二版(m2,2.0 / 0.7)总得分升到 5.34749(59.42%),50 与 1000 变量的测试函数几乎全线改善;唯独 5 变量 Megacity 从 0.660 掉到 0.617,且离散度极大。这个方向大概率有搞头,但小变量 Megacity 的稳定性要单独排雷。 第三版(m3,10.0 / 0.9)反而总得分 5.16139(57.35%),略输基础版;亮点只在 5 变量 Hilly 冲到 0.883,说明高协作系数配高变异率,只在少变量平滑函数上收敛更准,多变量场景会塌。 外汇与贵金属模型若借用这类协作搜索做参数寻优,须明白:回测得分差几个百分点就可能只是过拟合噪声,实盘高风险,建议先开 MT5 用文中三组数据做复跑,再决定调哪组系数。
ACS|人工协作搜索 m1|class="num">1.0|class="num">0.7| ============================= class="num">5 Hilly&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.7130880902279995 class="num">25 Hilly&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.7565145335137569 class="num">500 Hilly&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.31899537529427235 ============================= class="num">5 Forest&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.9999999999866176 class="num">25 Forest&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.9555551824899264 class="num">500 Forest&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.24186829565864398 ============================= class="num">5 Megacity&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.6607692307692307 class="num">25 Megacity&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.5038461538461539 class="num">500 Megacity&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.13922307692307825 ============================= 全部得分:class="num">5.28986 (class="num">58.78%) ACS|人工协作搜索 m2|class="num">2.0|class="num">0.7| ============================= class="num">5 Hilly&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.7682797921658492 class="num">25 Hilly&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.7664893907210706 class="num">500 Hilly&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.31831672493319296 ============================= class="num">5 Forest&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.9999997349437437 class="num">25 Forest&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.9534110489423269 class="num">500 Forest&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.24425762117784502 ============================= class="num">5 Megacity&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.6176923076923077 class="num">25 Megacity&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.5384615384615385 class="num">500 Megacity&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.14057692307692446 ============================= 全部得分:class="num">5.34749 (class="num">59.42%) ACS|人工协作搜索 m3|class="num">10.0|class="num">0.9| ============================= class="num">5 Hilly&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.8836798635515516 class="num">25 Hilly&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.715438105666966 class="num">500 Hilly&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.3011611038405591 ============================= class="num">5 Forest&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.9893902762645717 class="num">25 Forest&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.7954795408759185 class="num">500 Forest&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.21910399769909533 ============================= class="num">5 Megacity&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.6315384615384615 class="num">25 Megacity&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.49876923076923074 class="num">500 Megacity&class="macro">#x27;s;函数运行次数:class="num">10000;结果:class="num">0.12683076923077044 ============================= 全部得分:class="num">5.16139 (class="num">57.35%)
一点提醒
三次改动把 ACS 推到了不同方向的岔路口:A/B 矩阵扩展让 1000 变量 Hilly 与 Forest 函数解算更准;随机比较改写捕食者-猎物填充后,50 与 1000 变量测试全面改善,却让 10 变量 Megacity 结果更散;按拟合度组种群那版甚至略输原版,只在少变量平滑函数上收敛更稳。 外部参数仅一个、跨函数收敛不错是 ACS 的硬优点,低维离散偏大是绕不开的短板。后续若想再挤性能,可试自适应步长、混编进化或群体智能、以及给 A/B 种群加复杂信息共享结构。 附带的 ACS_mods.zip 里是现行代码,评级脚本把 0–100 分做了直方图,100 为理论上限;想自己复验,下完包直接在 MT5 跑脚本比对白底(≥0.99)格子即可。外汇与贵金属策略优化属高风险,回测亮眼不等于实盘稳健。