不用怀疑,这年头还在调鲸鱼优化算法(WOA)的人,要么是刚入门拿它练手,要么就是被真实问题逼到墙角——标准WOA在低维测试函数上表现还行,一上高维、多峰、复杂约束的工程优化问题,立刻就露馅。我这次改进的IWOA(Improved Whale Optimization Algorithm),就是在被逼急的情况下折腾出来的,断断续续改了两周,把混沌映射、收敛因子非线性化、莱维飞行这几套东西按自己的思路揉在了一起,名字也是随便取的,对,就是标题里那个破涕为笑。
先说结论:IWOA比原版WOA在收敛精度和稳定性上都有看得见的提升,尤其是在F10、F11这类多峰函数上,最优值能稳定到理论值的位数比原版多出三到四个数量级。而这个过程里最值钱的不是那几个公式,是搞清楚“为什么原版不行”以及“每一步改动到底在解决什么”。这篇文章就把我的完整思路、所有改进公式、参数计算过程、实测数据和踩过的坑一次性倒出来,给同样在做群智能优化算法改进的朋友一个能直接参考的样本。
1. 为什么我要动手改鲸鱼优化算法
1.1 WOA在标准测试集上的三宗罪
先把原版WOA的问题说透,不然你根本不知道改进的每个公式在干嘛。鲸鱼优化算法是Mirjalili在2016年提出的群智能算法,核心是模仿座头鲸的泡泡网捕猎行为,包含三个阶段:包围猎物、气泡网攻击、随机搜索。它的位置更新公式有三个核心版本,这是后面所有讨论的基础:
包围猎物的公式为:
code复制X(t+1) = X*(t) - A * D
D = |C * X*(t) - X(t)|
其中A = 2a * r1 - a,C = 2 * r2,a从2线性递减到0。
气泡网攻击的螺旋更新公式为:
code复制X(t+1) = D' * e^(bl) * cos(2πl) + X*(t)
D' = |X*(t) - X(t)|
随机搜索的公式为:
code复制X(t+1) = X_rand - A * D
D = |C * X_rand - X(t)|
这套机制在二维、低维问题上很漂亮,但实际用起来有三宗罪:
第一,收敛因子a是线性递减的,从2匀速掉到0,导致算法前半段的全局探索和后半段的局部开发被强行切成了两段,切换得很机械,翻遍文献,这种线性策略在复杂地形上的适应能力都很差。第二,种群初始化用纯随机数,如果初始解分布得不好,比如在Rastrigin这种密密麻麻的多峰函数上,可能整个种群都落在同一个局部洼地里,后面怎么迭代也跳不出来。第三,螺旋更新虽然能精细化搜索,但缺少跳出机制,一旦沦陷到局部最优,没有任何力量能把鲸鱼拽出来。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
1.2 一个改进算法的底线思维
我对改进算法的态度是:你可以不是最顶尖的算法,但必须有清晰的边界、可解释的改进逻辑,以及能复现的公式。很多论文里的改进算法改了一堆东西,结果只是把收敛曲线修得漂亮一点,换一个函数就翻车,这种改进没意义。
所以我在设计IWOA时给自己定了三条底线:
第一,改进点要能对应到WOA的具体缺陷,每加一个策略都得说清楚它在解决什么问题,不能为了加而加。第二,增加的参数要尽量少,计算复杂度不能明显上升。第三,所有改进后的公式在极限情况下要能退化为原版WOA,不然算法性质就变了,没法对比评价。
基于这三条,我最终敲定了三层改进结构,后面每一层都有一个明确的靶子。
2. IWOA的三层改进架构
2.1 第一层:Tent混沌映射初始化种群
原始WOA用rand函数生成初始种群,分布完全不可控。在低维问题上这不算致命伤,但在高维问题上,随机种子稍微差一点,收敛结果能差出好几个数量级。我的解决方案是用Tent混沌映射来替代随机初始化。
Tent映射的递推公式是:
code复制x(n+1) = x(n) / u, 0 < x(n) < u
x(n+1) = (1 - x(n)) / (1 - u), u <= x(n) < 1
常规取u = 0.5,此时它退化为:
code复制x(n+1) = 2 * x(n), 0 < x(n) < 0.5
x(n+1) = 2 * (1 - x(n)), 0.5 <= x(n) < 1
在我的实现里,我会先用一个随机数r1作为种子,然后迭代生成整条混沌序列作为初始化位置。关键点在于:Tent映射生成的序列虽然也是0到1之间的小数,但它比随机数分布更均匀,且具有确定性——同样的种子一定会生成完全相同的序列。这带来的好处有两个:第一,初始种群在搜索空间里的覆盖更均匀,降低了种群扎堆的概率;第二,实验可以复现,别人用同样的参数设置能跑出完全一样的结果,这在写论文或者做工程交付时非常重要。
实际代码中我还会加一个边界处理:如果混沌序列中出现了0或者1这样的端点值,就加入一个微小的扰动,因为Tent映射在0和1处会落入不动点,导致后续序列全部退化为0,这是一个容易被忽视的小坑。
2.2 第二层:非线性收敛因子与自适应惯性权重
这一层是整个IWOA的核心,针对的是原版WOA中a从2线性递减到0的问题。线性递减的数学本质是:算法在任何迭代阶段,探索和开发的比例都是固定的时间函数,跟种群当前的真实状态没有任何关系。这就像开车时不管前面是直道还是弯道,都一律用同样的速度,肯定不合理。
我的做法是把线性递减改成非线性衰减,并引入一个随机权重来控制衰减速率,公式如下:
code复制a_current = a_initial * exp(-k * (t / T_max))^mu
其中a_initial取2,k是一个控制衰减速度的常数,我的默认值是0.4
