ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

CEC2021基准测试:12种新元启发式算法横向评测与排名

CEC2021基准测试:12种新元启发式算法横向评测与排名 年底了又到了交报告、赶论文、做横向对比的季节。这两年元启发式算法的更新速度肉眼可见地快每年都有一批新算法挤在 CEC 测试集上刷排名从 CEC2014 到 CEC2017再到现在被广泛使用的 CEC2021题目难度一路飙升想靠老套路拿高分已经越来越难。这篇记录是我在 2024 年做的一次集中评测把 2020 年以来比较有代表性的 12 种新算法放到 CEC2021 基准测试集上完整跑了一遍。内容涵盖测试集的考核逻辑、12 种算法的选型依据、实验环境和参数配置以及最终的结果排名和踩坑实录。如果你正准备写论文需要算法对比或者想快速判断哪个新算法值得引入到自己的工程问题里这篇应该能给你一个相对完整的参考坐标。1. 为什么把测试集换成 CEC20211.1 CEC2021 到底考什么做算法评测第一步是选对赛道。CEC2021 是 IEEE 进化计算大会发布的官方基准测试套件定位是替代 CEC2017作为新算法横向对比的标准赛道。它和旧版最大的区别在于函数不再只是简单的山峰加山谷而是大面积使用了混合函数和复合函数并且所有函数都会在偏移向量的基础上叠加旋转矩阵。这是什么概念简单说传统测试函数里最优解通常就在坐标轴附近变量之间相对独立算法只要老老实实沿着每个维度搜一遍结果就不会太差。但 CEC2021 做完旋转之后变量之间的耦合关系被打乱了最优解也不在坐标轴上。一个只知道沿坐标轴搜索、或者只会做局部贪心的算法放到这里会立刻暴露短板。整个测试集一共 10 个函数按难度可以分三档。F1 到 F2 属于基础函数偏重考察收敛速度和寻优精度F3 到 F7 是混合函数把几个基础函数按区块拼在一起目标形态非常不规则F8 到 F10 是复合函数把多个子函数通过权重矩阵叠起来局部陷阱多、全局地形复杂。所有函数都在定义域 [-100, 100] 的 D 维空间上做了平移和旋转全局最优值在零点附近目标是最小化。1.2 评价指标和硬性规矩CEC 系列测试集有一个硬性规定算法消耗的是评估次数不是迭代次数。以 30 维为例标准预算通常是 10000×D也就是 30 万次目标函数评估。算法必须在这个固定次数内完成收敛不能靠无限迭代去刷精度这对那些前期探索效率低的算法是很残酷的。评价指标方面最常用的是误差值也就是误差 f(x*) − f(x*_true)。误差越小越好理想状态是 0。为了排除随机性干扰通常要独立运行 25 到 51 次统计平均误差、标准差、最优误差和最差误差。横向对比时还要做显著性检验常用 Wilcoxon 符号秩检验把“均值小一点点”从运气成分里区分出来。还有个容易被新手上忽略的潜规则横向对比时不同算法的初始种群不能共用同一套随机点。正确做法是各自独立初始化但使用相同的随机种子流。这样既保证公平又不会因为某一套初始点对某个算法特别友好导致结果失真。2. 12 种算法的选型和分组逻辑2.1 选型三原则选算法不是凑数最重要的是多样性。我当时定下三个原则缺一不可。第一是代表性。不能全是群体智能算法得有不同思想流派的代表包括行为模拟、物理模拟、数学方法启发的算法。否则测出来的结论只能代表某一类算法说服力不够。第二是时效性。优先选择 2020 年以后提出、已经在若干期刊上被引用过的算法这才能叫“新算法”。第三是实现可得性。必须有官方或者作者公开的代码方便复现和核对。这里尤其要强调第三点。我之前见过有人评测算法某个算法作者没开源就自己凭论文重写了一个“改良版”上去比结果测出来的根本不是原算法。横向评测的前提是大家跑的是同一个东西如果实现来源都不可靠后面的数据分析全部白搭。2.2 12 种候选算法一览基于以上原则最终确定下来的 12 种算法如下表所示。全称、缩写、提出年份、所属类别、核心机制以及关键超参数我都列出来了。序号算法全名 / 缩写提出年份思想来源核心机制简述主要超参数1Beluga Whale Optimization / BWO2022白鲸迁徙与捕猎探索-开发-鲸落三阶段转换鲸鱼比例、概率阈值2Artificial Rabbit Optimization / ARO2022家兔觅食与隐蔽行为绕道觅食 随机隐蔽 能量收缩周期因子、隐蔽概率3Snake Optimizer / SO2022蛇类交配行为无食物探索 / 争斗 / 交配三态切换食物量阈值、交配概率4Marine Predators Algorithm / MPA2020海洋生物莱维游走多阶段速度策略 涡流效应阶段阈值、FADS 概率5Runge Kutta Optimizer / RUN2021龙格-库塔数值法利用 RK 公式计算搜索步长带方向预判缩放系数、概率差6Northern Goshawk Optimization / NGO2021北方苍鹰捕猎行为全局猎杀 局部追击两阶段无7Golden Jackal Optimization / GJO2022金豺协同捕猎双猎手跟踪 围捕预设能量系数8Black-winged Kite Algorithm / BKA2023黑翅鸢飞行攻击行为群体进攻 个体悬停搜索概率因子、响应系数9Harris Hawks Optimization / HHO2019哈里斯鹰围猎行为软硬围攻 能量递减逃逸能量 E0、逃逸概率10Bald Eagle Search / BES2020秃鹰搜寻俯冲行为选择搜寻 / 空间搜寻 / 俯冲角度参数、中心点惩罚11Slime Mould Algorithm / SMA2020粘菌觅食行为正负反馈权重调整搜索方向z 决策概率、权重上下界12Butterfly Optimization Algorithm / BOA2019蝴蝶授粉行为感觉模态 香味感知驱动寻优感官模态 c、幂指数 a2.3 从理论上看谁可能占便宜在正式跑实验前我先根据每种算法的机制做了一轮预判。这算是我的个人习惯先有假设再用结果验证或者推翻整个评测的收获会大很多。RUN 的步长由龙格-库塔方法计算本质上做了搜索方向的插值外推在旋转函数上应该会比较稳ARO 的绕道觅食和随机隐蔽机制天然兼顾了探索与开发的切换理论上复合函数不容易困住它SMA 的反馈权重调整机制在多峰地形上往往表现亮眼。反过来BOA 和 HHO 这类依赖随机跃迁的算法在简单函数上可能收敛得飞快但到了复合函数阶段稳定性大概率会下降。当然预判只是参考坐标。元启发式算法有个老毛病理论分析和实际表现经常脱节所谓“实验室里的优秀”和“测试集上的优秀”未必是一回事。最终谁强谁弱还是得用数据说话。3. 实验环境与参数配置3.1 软硬件环境为了控制变量所有算法跑在同一个环境里。硬件用的是 AMD Ryzen 9 5950X16 核 32 线程内存 64GB操作系统是 Ubuntu 22.04。编程语言选了 Python 3.9.18核心库是 NumPy 1.24.3 和 SciPy 1.10.1。这里有个细节值得说明CEC2021 官方基准函数默认是 MATLAB 版本。我在跑 Python 之前先在 MATLAB R2023a 里验证了官方自带的示例结果确认数据文件无误后再在 Python 里按照官方定义重新实现并做了随机抽点一致性校验。简单说就是用相同输入点分别跑 MATLAB 版和 Python 版比对函数输出值是否一致。这一步非常关键能过滤掉绝大多数翻译代码时的手误。3.2 基准函数封装与数据文件加载CEC2021 最大的坑在数据文件。每个函数都带着自己的偏移向量和旋转矩阵而且不同维度下的数据文件也不一样。如果你直接把 30 维的旋转矩阵用到 50 维的函数上算出来的函数值完全不可信。下面是我在 Python 里封装 CEC2021 函数的示意框架具体文件路径需要按官方压缩包的实际布局调整。import numpy as np def load_cec2021_data(func_id, dim, data_root./CEC2021): 加载 CEC2021 官方数据文件 func_id: 1 ~ 10 对应 F1 ~ F10 dim: 测试维度通常为 10 / 30 / 50 shift np.loadtxt(f{data_root}/F{func_id}/shift_{dim}D.txt) matrix np.loadtxt(f{data_root}/F{func_id}/rotation_{dim}D.txt) # 有些复合函数还需要加载额外的权重系数或子函数参数 return shift, matrix def base_bent_cigar(x): # CEC2021 基础函数之一Bent Cigar # 特征首维权重为 1其余维度权重为 1e6 return x[0] ** 2 1e6 * np.sum(x[1:] ** 2) def cec2021_f1(x, dim): shift, matrix load_cec2021_data(1, dim) # 注意顺序先平移再做矩阵旋转 z (x - shift).dot(matrix.T) return base_bent_cigar(z) # 调用示例 dim 30 x np.random.uniform(-100, 100, dim) print(cec2021_f1(x, dim))代码本身不复杂但有两个地方特别容易出错。一是平移和旋转的顺序必须是先平移后旋转反了结果完全不同。二是复合函数除了旋转矩阵还需要读子函数的偏移量、权重系数等附加参数不能只觉得读一个矩阵就完事。我见过不少对比论文在这个环节出错导致排名结果和官方复现的差距很大。3.3 参数设置与测试维度这次测试选择 30 维这是论文里最常见的设置计算量适中又能清晰拉开算法间的差距。最大评估次数按照 CEC2021 标准指定为 10000×D换算下来就是 30 万次目标函数评估。种群规模统一设为 50。这里有个取舍逻辑种群太小算法多样性不够种群太大30 万次评估里迭代代数太少算法还没收敛预算就烧完了。50 是比较折中的数值能保证每种算法至少有上千次迭代用于收敛。独立重复次数设为 25 次随机种子取 1 到 25。所有算法的内部参数我尽量采用原论文建议的默认值不对任何一个算法额外调优。这点至关重要。横向评测比的应该是算法本身的机制而不是谁的调参功夫更强。如果你为了追求排名给某个算法专门调一整夜参数那就变成比谁的 GPU 时间多了。4. 实测结果与规律分析4.1 综合排名谁整体领先跑完全部实验后我先把 12 种算法在 10 个测试函数上的结果做成了平均排名表。排名依据是 25 次独立运行的平均误差误差相等时看标准差。算法F1F2F3F4F5F6F7F8F9F10平均排名RUN21142332422.4ARO12324124512.5SMA34235213232.8MPA43513445343.6NGO56456566755.5SO65767677666.3BWO78688788977.6GJO87979899888.2BES998910910101099.3BKA1010101011101111111010.4HHO1111121112121212121111.6BOA1212111210111011121211.3从平均排名来看RUN、ARO、SMA 属于第一梯队MPA 紧随其后NGO 和 SO 居中其余算法各有亮点但整体稳定性不够。RUN 能稳居第一梯队核心原因在于龙格-库塔公式天生带方向预判能力。它不像普通随机游走那样盲目试探而是根据当前梯度信息模拟出几个中间点再决定下一步怎么走。这种机制在充满旋转和偏移的 CEC2021 上有明显优势。4.2 典型函数上的表现差异只看综合排名容易掩盖细节我单独挑三个有代表性的函数观察每个算法的表现。先看 F2 这个基础函数中的旋转单峰问题。RUN 拿到了最好的成绩平均误差能压到 10 的负 9 次方量级接近机器精度。BWO 和 HHO 在这个函数上也能快速下降但后期精度差了一截误差停留在 10 的负 5 次方附近。这说明在相对简单的单峰问题上问题不是能不能找到最优解而是能不能在接近最优解时保持精细搜索RUN 的插值步长策略在这一步起了大作用。再看 F8 到 F10 这几个复合函数。ARO 是复合函数上的最大赢家F10 直接拿到第一。原因也好理解随机隐蔽机制让它在局部陷阱密集的区域里能频繁跳出当前区域避免早熟。反倒是 HHO 在复合函数上表现不佳原因在于哈里斯鹰的逃逸能量参数在后期衰减太快陷入局部最优后很难再组织起有效的突围。最后说 SMA 在 F7 上的表现。F7 是混合函数里结构最复杂的一个SMA 用正负反馈权重调节搜索点本质上是一种自适应的局部搜索增强在混合地形上能精准识别出更有希望的区域从而获得第一名。这验证了之前“反馈机制在多峰地形上表现亮眼”的预判。4.3 收敛速度与运行时间观察我不光记录了最终误差还跟踪了每个算法的收敛曲线。以前 10 万次评估为窗口BWO 的收敛速度最快前 3 万次评估就能把误差压到较低水平但后期开发不足最终精度被反超。RUN 的收敛曲线几乎是一条平滑下降的线没有明显反弹说明它的搜索过程相对稳定。HHO 的收敛曲线呈阶梯状先大幅下降、平台期、再跳变说明它在一波一波地做逃逸搜索。运行时间方面BOA 因为每次迭代都要计算香味强度的幂运算是全场最慢的整体耗时约为 RUN 的 2.5 倍。SMA 虽然迭代逻辑简单但每次更新都需要对种群排序同样不省时间。最省时间的是 NGO 和 GJO结构简单单次评估开销很低。如果你的实际工程优化问题本身函数评估很贵那么单次评估开销大的算法就不要考虑了。5. 踩坑记录与排查经验5.1 官方数据文件的加载顺序问题这次实验最让我头疼的就是数据文件。CEC2021 官方压缩包里的文件组织方式和 CEC2017 很不一样偏移向量、旋转矩阵、复合函数权重分别存在不同目录里。我一共经历过三次“结果明显不对”的情况三次都出在文件加载上。第一次是旋转矩阵维度读错30 维问题读到了 50 维的旋转矩阵函数值差了好几个数量级。第二次是平移顺序错误先旋转再平移和先平移再旋转完全是两个函数。第三次是复合函数的附加数据没加载导致 F8 到 F10 的输出值整体异常。排查方法很简单先拿官方 MATLAB 版本跑一个已知点再用 Python 实现跑同一个点比较输出结果。如果你决定用 Python 重写 CEC 函数这一步绝对不能省。5.2 边界处理方式不统一结果全部作废这是我在一次内部评审时被指出的问题印象极深。搜索范围是 [-100, 100]但每个算法在生成新解时可能越界。常见的处理方式有三种直接无视越界、把越界解拉回边界、对越界解做随机重置。三种方式的行为差异很大。无视越界相当于扩大了搜索空间部分算法能从中获益拉回边界会让种群逐步堆积在边界附近丧失多样性随机重置则能保持种群多样性防止解堆在边界上。我在几轮小实验中测试过同样一组算法用不同的边界处理方式最终排名会发生显著变化。所以横向对比必须全统一。我的选择是随机重置因为这种方式最接近“新解探索”的本质。5.3 随机种子、统计口径和并行加速随机种子的使用规则看起来简单实际坑也不少。一开始我是每个算法用固定种子跑 25 次后来发现部分算法对初始位置高度敏感单独一个种子序列可能会带来偏差。最稳妥的做法是指定种子流比如种子 1 到 25 对应 25 次独立运行所有算法共享这一套种子编号这样既公平又能复现。并行方面由于 12 个算法 × 10 个函数 × 25 次重复是个不小的计算量我用 multiprocessing 做了函数级别的并行每个 CPU 核跑一个 (算法, 函数) 组合。实测下来16 核并行可以把这个实验从两天半压缩到大约 7 小时。如果你也想跑类似实验建议先跑一个小规模样例验证并行逻辑不然排队排到一半发现某个进程崩了排查成本很高。5.4 测试集过拟合的预警最后聊一个比较严肃的问题测试集过拟合。Fisher 早在几十年前就说过用同一批数据反复调参数据只能用来设计算法不能用来验证算法。这次评测里如果我想针对某个函数单独调 RUN 的参数它的排名还能再好看一点但这对整个领域没有任何贡献。我见过有些论文算法专门为 CEC 测试集设计离开测试集性能立刻垮塌。我觉得负责的做法是在 CEC2021 上评测完再补一个 CEC2014 或者 CEC2017 作为交叉验证条件允许时再加几个实际问题验证泛化性。真正的算法创新目标是解决一类问题不是赢下一场比赛。最后说点个人体会。测试排名只能说明“在这套题目下的表现”不能直接等价于“这个算法更强大”。真正决定算法能不能落地的是问题本身的特性。我现在的习惯是先在 CEC2021 上跑一遍作为快速筛选把排名前五的算法再拿到自己的实际工程问题上验证。如果你也想做类似的评测建议先跑 10 维把可复现性确认好再上 30 维别一上来就直接跑高维度否则数据文件加载错了一整轮实验都白费。希望这次记录能帮你少踩一些坑。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进