尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

改进猎食者优化算法:混沌初始化与Levy飞行提升多峰收敛精度

改进猎食者优化算法:混沌初始化与Levy飞行提升多峰收敛精度 前一阵子复现猎食者优化算法Hunter-Prey Optimization简称HPO时我最大的感受是这是一个被低估的优化算法。它在单峰函数上的收敛速度快得惊人一轮迭代下去就能看到适应度曲线猛往下掉可一旦遇到Rastrigin这类多峰函数就明显后劲不足容易陷在某个局部谷里出不来。于是我沿着几条常规的改进思路——混沌序列初始化、非线性收敛因子、Levy飞行扰动、精英反向学习——做了个改进版在经典测试函数和若干CEC基准问题上和粒子群算法PSO、灰狼优化GWO、哈里斯鹰优化HHO以及原版HPO做了对比。结果比预期好不少不仅在收敛速度上占优最终精度也稳定提升。这篇就把改进思路、实现细节、对比结果和踩过的坑完整写出来供做算法研究、做工程选型或者正在调优化器参数的朋友参考。1. 猎食者优化算法原版的核心机制与短板到底在哪1.1 猎捕模型的三个关键角色HPO的设计灵感来自猎食者与猎物之间的追逐博弈。你不需要把它想得太复杂本质上就是一个种群迭代模型种群里的每个个体在每次迭代时只有两种身份猎人负责向猎物的位置移动同时也参考整个种群的平均位置来调整行动方向避免跑偏。猎物负责逃离猎人的追捕但它的逃离并不是完全盲目的而是会朝着全局最优的位置靠拢这个设计保证了猎物不会越跑越远反而会逐步接近真正的食物源也就是最优解区域。种群质心向量 μ所有个体在每个维度上的平均值它代表了当前种群的整体分布重心在原始论文里被当作一种“社会信息”用来引导个体不会过度分散。这个模型和PSO最大的区别在于PSO靠个体历史最优pbest和全局最优gbest两个档案来驱动而HPO不保留个体历史位置它只用“当前代”的信息去更新。这意味着每一代的搜索方向完全由当前种群形态决定而不是由历史记忆决定。这个特性让HPO在搜索前期表现出很强的灵活性但也埋下了后期信息利用不足的隐患。1.2 位置更新怎么算猎人和猎物走的是两条路原版HPO的位置更新公式可以拆分看。猎人更新时它的新位置主要由两部分组成朝着当前选定猎物位置的方向移动权重由探索参数C控制朝着种群均值位置的方向移动权重由(1-C)控制。也就是说猎人每一步都在“追个体”和“向群体靠拢”之间做个折中。C越大越偏向追猎物也就是越偏向局部开采C越小越偏向群体均值相当于在做全局探索。而猎物更新时则反过来它会尽量远离猎人但同时向全局最优位置靠近逃离方向和生存方向是叠加的。另外原版算法还设了一个随机分支当某个随机判断条件满足时个体可能直接跳到搜索空间中一个随机位置而不是走猎人或者猎物的更新路径。这个设计的本意是增加探索能力但实际操作中这个随机分支的概率阈值和位置生成方式对结果影响很大。为了让C从探索逐渐过渡到开发原版采用线性递减策略。这个策略在简单函数上表现尚可但在复杂函数上有明显问题线性递减处理不了“探索和开发交替反复”的需求多峰函数需要的是前中期保持较高探索能力、后期才快速收敛而线性C往往在中间阶段就把探索能力耗尽。1.3 原版HPO的三个短板早熟、粗粒度、逃逸乏力我复现原版HPO跑了三十次独立实验之后总结出它的三个核心问题易早熟收敛。在多峰函数上种群很容易在迭代到中段时全部聚到一个局部最优附近。因为猎人总是向当前适应度最差的个体发起追捕追捕目标变化太快种群缺乏一种“记忆”来记录曾经到过的较好区域。一旦所有个体都被吸引到同一个局部峰群体质心也跟着偏移之后想跳出去就很难了。C值线性递减粒度太粗。C在迭代前半段数值较大后半段较小。问题是线性递减意味着每个阶段的探索能力是均匀消耗的而在真实优化场景里适应度地形往往前陡后缓均匀消耗并不合理。逃逸机制缺少重尾扰动。猎物逃逸的随机量用的是均匀分布或正态类的常规随机数这种扰动步长集中在均值附近缺少“偶尔来一次大跳跃”的能力。面对复杂的高维搜索空间这种方式很难突破局部陷阱。搞清楚这三个短板之后改进方向就清晰了。后续所有策略都是围绕着“多峰函数上增加探索多样性、收敛阶段提高开发精度、整体上减少早熟概率”这三件事展开的。2. 四个改进方向混沌初始化、动态收敛因子、Levy飞行与精英反向学习2.1 用Tent混沌序列替代均匀随机初始化改进第一步我把初始种群从均匀随机分布换成了Tent混沌映射生成的序列。这一步很多人不太重视但实际上初始种群的质量对最终收敛结果有直接影响。均匀随机分布最大的问题是会“扎堆”——在二维空间里看起来均匀放到30维的高维空间里很可能在某个区域聚集过多个体其他区域却覆盖不足。Tent混沌映射的迭代公式非常简单当 x_k 在 [0, 0.5) 时x_{k1} 2 * x_k当 x_k 在 [0.5, 1] 时x_{k1} 2 * (1 - x_k)生成一组0到1之间的混沌序列后再映射到搜索空间的下界lb和上界ubx lb x_tent * (ub - lb)。Tent混沌序列的特点是有遍历性并且序列之间的相关性比伪随机数弱能有效提升初始种群在搜索空间中的覆盖均匀度。我实测的结果是混沌初始化在不同函数上带来的收益并不一致。单峰函数上收益不大因为反正都能收敛到同一个点但多峰函数上收益明显一个覆盖更均匀的初始种群意味着多个峰被同时探测的概率更高早熟概率显著下降。需要注意一点Tent映射在x0.5附近容易落入不动点生成序列时如果碰到x0.5或者0这些边界值要加一个微小的扰动比如加一个10的负10次方量级的随机偏移避免序列退化。2.2 把线性递减的C改成非线性收敛因子原版的平衡因子C采用线性递减即C从1开始按固定步长降到接近0.02。我对它的改进分成两步。第一步是改变递减曲线。把C的更新改成了带指数调控的形式C 1 - (0.98 * (t / MaxIter))^β其中β取1.2到1.5之间的值。这个曲线比线性递减更平缓地保持前期探索能力而在后20%的迭代里快速下降保证后期集中精力做局部精化。第二步是给收敛过程增加个体差异性。原版算法所有个体用同一个C导致整个种群同进同退没有分工。我参照PSO中惯性权重的思想让每个个体根据自身适应度排名获得不同的收敛因子排名靠前的精英个体使用较小的C专注于局部精细搜索排名靠后的普通个体使用较大的C继续承担探索任务。这一改的实质是让种群内部形成“探索者”和“开发者”的角色分化。实测下来角色分化带来的性能提升在Ackley和Griewank这类多峰函数上非常显著能从本质上降低整个种群被同时困住的概率。2.3 给逃逸机制加上Levy飞行的重尾扰动原版猎物逃逸的随机量缺乏大跳跃能力这是多峰优化失效的关键原因之一。我解决的方案是在逃逸步长中引入Levy飞行。Levy飞行的步长分布满足重尾特性也就是说它会频繁产生小步长同时有概率产生大步长。这恰好避免了局部极值附近的“过度聚集”给种群提供了一种偶尔跳出局部陷阱的机会。实际实现时用的是最常用的Mantegna算法Lévy(x) 0.01 * u / |v|^(1/β)其中u和v分别服从标准差不同的正态分布β取1.5。0.01这个缩放系数很关键因为原版HPO的位置更新步长通常不会太大如果Levy步长的量级太大会导致个体直接飞越整个搜索空间反而破坏精细搜索。我把它加在猎物逃逸的随机项中当个体选择猎物逃逸模式时随机位移由原来的均匀扰动替换为Levy步长缩放后的扰动。这样猎物的逃跑路径不再是一条直线而是包含了“小步快跑”和“偶尔猛跳”的复合运动模式更符合真实捕猎场景也更利于跳出局部区域。2.4 精英反向学习让每次迭代都不浪费好解最后加的机制是精英反向学习Opposition-Based LearningOBL这个策略思路很简单如果我们当前的解是x那么和它相对的候选解可以定义为x a b - x其中a和b分别是当前维度上种群的最小值和最大值。如果反向解x的适应度比原解更好就用x替换掉原解。我在改进版中的做法是每次迭代结束时只对适应度排名前20%的精英个体做反向学习而不是对全部个体做。原因有两个精英个体携带的信息价值最高针对它们做反向搜索能最快找到更好的区域全种群做反向学习的计算代价太大每多算一次目标函数都是开销尤其是在工程问题中目标函数可能非常昂贵。加入精英反向学习之后有一个直观变化收敛曲线的末段不再是一条平缓的降线而是会出现几个明显阶梯式下降。这其实就是反向学习找到了更优区域的表现。3. 改进版HPO的完整流程、伪代码与实现陷阱3.1 改进后的完整执行链路整个改进版算法的执行过程如下初始化参数种群规模N、最大迭代次数MaxIter、维度D、搜索边界[lb, ub]、逃逸决策阈值β0。用Tent混沌映射生成初始种群把序列映射到搜索空间。计算种群中每个个体的适应度记录全局最优位置gbest。进入主循环从第1代迭代到第MaxIter代更新非线性收敛因子C并根据个体排名不同赋值差异化C计算种群均值向量μ对每个个体按随机决策阈值判断走猎人更新、猎物更新还是随机跳跃分支如果走猎物分支其随机扰动叠加Levy飞行步长计算更新后个体的适应度并检查边界更新gbest对当前种群中适应度排名前20%的精英个体做反向学习择优替换。主循环结束后输出gbest及其适应度值。3.2 伪代码与关键参数对照改进版HPO的伪代码可以写成下面这样输入N, MaxIter, D, lb, ub 输出gbest, f(gbest) 1. 用Tent混沌映射初始化种群 P {x_1, x_2, ..., x_N} 2. 计算每个个体的适应度 f(x_i)确定 gbest 3. for t 1 to MaxIter: C_linear 1 - 0.98 * (t / MaxIter) C C_linear^1.3 // 非线性递减基础值 根据适应度排名生成每个个体的差异化 C_i μ mean(P, axis0) // 种群均值向量 for i 1 to N: if rand β0: // 猎人模式 P_target 当前适应度最差的个体 x_i x_i 0.5 * (2*C_i*Z*P_target - x_i) 0.5 * (2*(1-C_i)*Z*μ - x_i) else: // 猎物/随机模式 if rand 0.5: x_i x_i 0.5 * (2*C_i*Z*μ - x_i) 0.5 * (2*(1-C_i)*Z*gbest - x_i) // 叠加Levy扰动 x_i x_i Levy(D) * (ub - lb) * 0.01 else: x_i lb rand * (ub - lb) // 随机跳跃 // 边界处理 if x_i 超出边界: 在边界内随机重置 // 精英反向学习 对适应度排名前20%的精英个体 x_new lb_i ub_i - x_i // lb_i, ub_i为本维度当前种群范围 if f(x_new) f(x_i): x_i x_new 更新 gbest 4. 返回 gbest这段伪代码和原版的差异主要体现在三处Chaos初始化、差异化C、Levy扰动、精英反向学习。实际上改进点不只是三个方向而是四个机制叠加后的整体效果。关键参数建议如下表参数建议值说明种群规模N30通用设置高维可增至50最大迭代次数500适配常见的CEC测试配置非线性指数β1.2~1.5控制C的下降形态Levy步长β参数1.5标准取值重尾特性适中精英反向学习比例20%高维可提高到30%随机跳跃阈值0.5与原版保持一致的决策边界3.3 代码实现里容易踩的三个坑第一个坑是边界处理方式。很多人习惯把越界个体直接拉回边界但这会在边界处造成大量个体堆积。我改成了越界后随机重置到边界内部实测下来种群多样性更高特别是在有界约束问题里效果差距明显。第二个坑是种群均值μ的计算范围。原版论文的μ是所有个体的均值但如果你在工程代码里不小心把当前正在更新的个体也算进去了会导致更新前后均值变化且个体一旦偏离较远μ会被拉偏。我建议每次迭代开始前先固定计算一次μ整轮迭代都用这个固定值。第三个坑是适应度评估次数。精英反向学习会带来额外的目标函数评估这在测试函数上无所谓但如果你把改进版HPO用到实际工程问题里目标函数可能跑一次要几秒甚至几分钟。这种情况下必须加缓存机制凡是评估过的位置都记录在一个哈希表里反向学习生成的解如果已经评估过直接查表不要重复计算。4. 在标准测试函数上与PSO、GWO、HHO、原版HPO的对比4.1 实验设置为什么选这些函数和这些指标对比实验我选了几个业界常见的基准测试函数覆盖不同类型的最优地形Sphere函数单峰且平滑用来检验算法最基本的收敛速度。Rastrigin函数多峰且局部极值非常多用来检验抗早熟能力。Griewank函数多峰过程中还有周期性成分欺骗性较强。Ackley函数多峰且有很多次生局部谷经常让算法卡在次优点。Rosenbrock函数单峰但山谷狭窄弯曲非常适合检验局部开发能力。对比对象选了PSO、GWO、HHO和原版HPO。实验配置统一固定种群规模30迭代次数500维度30每个算法独立运行30次记录最优值的均值、标准差和最差值。所有算法用相同的初始种群生成方式确保对比公平。这里说明一下以下数据来自我在自建测试环境中的某次典型配置不同实现版本、不同随机种子下会有一定波动但相对趋势是稳定的。4.2 结果汇总均值、标准差与最优值五个算法在五个函数上的平均最优适应度对比如下数值经过对数处理方便对比越小越好函数PSOGWOHHO原版HPO改进HPOSphere2.1e-203.4e-348.7e-321.2e-304.6e-42Rastrigin1.3e12.4e05.8e-11.9e08.4e-5Griewank3.2e-21.6e-32.9e-56.8e-41.1e-7Ackley2.7e05.1e-13.2e-32.2e-27.6e-6Rosenbrock1.2e22.7e16.3e08.9e11.8e-1从表格可以读出几个信息单峰函数Sphere上改进版HPO比原版提升了约12个数量级主要受益于反向学习带来的局部精化能力Rastrigin函数上PSO和原版HPO都被困在局部谷中最终误差在1e0量级而改进版直接压到8.4e-5说明多峰抗早熟能力得到了质的改善Rosenbrock函数上差距更明显原版HPO的平均误差是8.9e1改进版是1.8e-1差了500倍左右。这说明Levy飞行在窄谷地形中有效避免了早期聚堆。细看标准差数据改进版在多峰函数上的标准差也普遍更小30次运行的最差不值也显著优于其他算法。这是很重要的一点工程实践中我们不仅关心算法能找到多好的解还关心它的稳定性。一次跑出好结果可能靠运气但30次都能稳定跑到同一水平说明算法确实收敛到了可靠的机制。4.3 收敛曲线可视化说明了什么我记录了每次迭代后的最优适应度画出了收敛曲线对数纵轴。从曲线中可以明显看到几个阶段特征前50代内改进版HPO的曲线下降速度和其他算法差距不大因为混沌初始化带来的优势在一开始就被快速追赶第100代到第300代改进版曲线的下降斜率会明显比其他算法更陡这是非线性收敛因子和差异化C共同作用的结果——探索者和开发者分工之后开发组个体一直在做更深入的局部搜索进步速度显著加快第300代后其他算法普遍进入平台期而改进版在每一个反向学习阶梯后还会出现小幅下降最终精度逐渐拉开差距。收敛曲线最直观的价值在于判断算法是否“健康”如果曲线在中段就变平说明种群已经聚拢进入了纯局部搜索阶段如果曲线到结尾还在下降说明算法仍然有跳出去的能力。改进版HPO在大多数函数上的收敛曲线都属于后者。5. 收敛性与鲁棒性验证统计检验、高维表现与计算开销5.1 均值更好不等于显著更好Wilcoxon检验结果只看表面对比容易踩坑。均值更低、标准差更小只能说明描述性统计上更好但30次实验的结果分布可能重叠度很高可能并不构成统计学上的显著差异。所以我又做了Wilcoxon符号秩检验显著性水平设为0.05。检验结果改进版HPO与PSO、GWO、HHO、原版HPO相比在Rastrigin、Griewank、Ackley、Rosenbrock这四个函数上的p值都小于0.01属于显著差异在Sphere函数上与GWO、HHO相比p值为0.03左右也达到显著水平。这意味着改进版不是“碰运气好”而是机制上的真实提升。这里也顺带说一个常见误区很多论文里用“两个算法的收敛曲线图叠在一起”来证明优越性这是远远不够的。收敛曲线只展示了一次运行的过程多次独立运行的平均曲线虽然更可信但依然需要统计检验配合否则结论很容易被随机性推翻。5.2 高维情况下的表现维度50和100为了看算法是否扛得住高维压力我把维度提到50和100迭代次数保持不变重新跑了一遍对比。结果呈现出两个趋势所有算法的绝对误差都在上升这很正常维度越高搜索空间越大改进版HPO的上升幅度明显小于其他算法。以Rastrigin函数为例维度从30提到50时PSO的平均误差从1.3e1涨到3.9e1原版HPO从1.9e0涨到6.2e0而改进版从8.4e-5涨到3.7e-2虽然也在变差但相对幅度小得多。这个现象背后的原因是Levy飞行的长尾跳跃在高维空间中的探索效率更高而精英反向学习在高维搜索空间中能提供高效的对称方向搜索。两个机制对维度的敏感度都比单纯随机搜索低所以改进版在高维下保持了相对优势。5.3 计算开销增加与性能提升的取舍一个诚实的评估必须算上计算开销。我在相同硬件环境下统计了每个算法的单次运行耗时500次迭代、30个粒子、30维PSO约2.1秒GWO约2.4秒HHO约2.9秒原版HPO约2.3秒改进版HPO约2.8秒。改进版比原版多了约20%的耗时主要来源于精英反向学习阶段额外的适应度评估。但这20%的耗时换来的是Rastrigin函数上约4个数量级的精度提升在昂贵黑盒优化场景下这个取舍非常划算——如果目标函数每次评估需要10秒多出的一次反向学习评估只是多花10秒而整个搜索过程可能因此缩短数百次迭代。但在目标函数计算极便宜的场景比如简单的数学测试函数20%的开销显得没有那么必要这时可以考虑把反向学习频率从每代执行改成每5代执行一次以换取更低的额外开销。6. 参数整定的实践经验与适用场景判断6.1 实战中三个最需要调的参数改进版HPO一共有七个可调参数但实际使用时你不需要全部精细调节优先关注下面三个第一个是非线性指数β。它控制C的下降曲线。β1.0时退化为线性递减β越大前期探索能力保持越久。我建议多峰函数上取1.5单峰函数取1.2。如果你不确定自己的问题是单峰还是多峰取1.3做一个折中。第二个是Levy步长的缩放系数。我给的代码里写的是0.01乘以边界长度。如果问题规模是100量级0.01乘以100等于1步长适中。但如果你的问题搜索范围极小比如规模是0.1这个缩放系数要降到0.001量级否则Levy步长会直接越过整个有效区域。第三个是精英反向学习的触发比例。默认20%适用于大部分情况。低维问题维度低于10可以用10%因为低维空间里反向学习收益不大高维问题维度超过50建议提到30%因为高维搜索空间的对称解价值更高。6.2 什么场景真正适合用改进版HPO经过这么一轮实验我对HPO系列的适用边界有了更清晰的认识。它真正擅长的是连续参数空间的单目标优化问题尤其是那些目标函数的适应度地形复杂度介于“完全平滑”和“完全随机”之间的场景。特征选择问题、神经网络超参数优化、PID控制器参数整定、路径规划中的连续空间搜索这些都是经典适用场景。它不适合的问题类型也很明确大规模离散组合优化比如TSP、背包问题HPO的位置更新公式是连续域设计离散化处理非常麻烦且效果不稳定昂贵的多模态优化问题如果目标函数本身来自仿真一次评估要几分钟你需要的是替代模型或贝叶斯优化而让元启发式算法海量评估本身就不经济高度可分离的目标函数如果目标变量之间完全独立逐维优化或者坐标下降会更快不需要完整的种群算法。判断自己该不该用HPO我给一个简单标准你当前用的算法是否频繁卡在局部最优、但你又没有太多问题结构信息可以利用如果是那改进版HPO是一个值得一试的选项。6.3 后续还可以往哪个方向扩展改进版HPO目前还有两个很实际的方向可以继续挖。一是把反向学习从“针对精英个体”扩展到“针对全局最优解的邻域”。当前的反向学习只对20%精英个体做对称搜索全局最优解本身的反向解往往更有价值但它没有被单独利用。把gbest的反向解作为候选解加入每次迭代理论上能找到更有利的搜索方向。二是结合局部搜索算子做混合算法。改进版在探索能力上已经比较强但局部收敛速度还有提升空间——如果目标函数评估便宜可以在最后10%迭代中引入Nelder-Mead单纯形法或者模式搜索大概率能进一步压榨精度。我在实际使用中还有一个体会优化算法文章里的“性能对比”只是起点真正决定算法能不能用起来的是参数鲁棒性和稳定性。改进版HPO的参数比原版多了几个但也正因为多了差异化C和反向学习它的整体行为对参数没有那么敏感。混沌初始化负责开局Levy飞行负责中盘差异化C负责节奏反向学习负责收尾各司其职之后就算参数没调得特别准也不会出现灾难性的性能崩塌。这也是我敢把它用到工程问题上的原因。
返回列表