在计算智能的武林中,元启发式算法各显神通。今天我们要拆解的是三位重量级选手:灰狼优化器(GWO)、鲸鱼优化算法(WOA)和人工蜂群算法(ABC)。这些算法在解决高维非线性优化问题时,展现出截然不同的搜索策略和性能特征。我们选用CEC2021测试函数套件作为比武擂台——这套包含30个精心设计的基准函数,涵盖单峰、多峰、混合和复合类型,能全面检验算法的探索与开发能力。
测试环境统一采用MATLAB R2021a,硬件为i7-11800H处理器。关键参数设定:搜索空间维度D=30,种群规模N=50,最大迭代次数T=500。每个算法独立运行20次以消除随机性影响,最终统计中位数性能。特别说明,CEC2021的函数评价次数计算采用官方标准,与常规测试有所不同。
GWO模拟灰狼群体的社会等级和狩猎行为。算法将种群分为四个等级:
位置更新公式体现群体协作:
matlab复制a = 2 * (1 - iter/max_iter); % 线性递减的收敛因子
A = 2*a.*rand() - a; % 随机扰动系数
D_α = abs(2*rand().*X_α - X); % 与α狼的距离
X_new = (X_α - A.*D_α + ... % 三领导狼的加权平均
X_β - A.*D_β + ...
X_δ - A.*D_δ) / 3;
关键参数a控制探索与开发的平衡。原始论文采用线性递减策略,但实际测试发现:
WOA灵感来自座头鲸的泡泡网捕食策略,核心操作包含:
matlab复制D = abs(C.*X_best - X); % C=2*rand()
X_new = X_best - A.*D; % A=2*a*rand()-a
matlab复制l = (a-1)*rand()+1; % 随机螺旋参数
X_new = D.*exp(b*l).*cos(2*pi*l) + X_best;
螺旋系数b的调优实验显示:
ABC算法将种群分为三类角色:
matlab复制v = X + phi.*(X - X_k); % phi∈[-1,1]随机数
matlab复制prob = fitness./sum(fitness);
弃用阈值limit的设定原则:
| 函数 | GWO收敛代数 | WOA收敛代数 | ABC收敛代数 |
|---|---|---|---|
| F1 | 127 | 185 | >500 |
| F3 | 89 | 76 | 342 |
关键发现:

典型收敛曲线显示:
复合函数的复杂地形最考验算法:
matlab复制% F20的典型特征
function y = F20(x)
y = 0;
for i=1:num_func
z = x - o(i,:); % o为偏移向量
y = y + w(i)*fitness_func(z); % w为权重系数
end
y = y + 1800; % 故意设置的全局最优偏移
end
算法表现对比:
matlab复制% 原始线性递减
a = 2*(1 - iter/max_iter);
% 改进非线性递减(推荐)
a = 2*(1 - (iter/max_iter)^3); % 三次方曲线
a = 2*exp(-3*iter/max_iter); % 指数衰减
matlab复制% 原始等权重
X_new = (X_α + X_β + X_δ)/3;
% 动态权重(提升后期精度)
w_α = 0.6 - 0.2*iter/max_iter;
X_new = w_α*X_α + (1-w_α)/2*(X_β + X_δ);
螺旋系数b的调整经验:
收敛因子a的变体:
matlab复制% 加入随机扰动(避免僵化)
a = 2*(1 - iter/max_iter) + 0.1*randn();
弃用阈值limit的黄金法则:
matlab复制% 基础公式
limit = N * D; % N种群规模,D问题维度
% 动态调整(推荐)
limit = max(50, 0.2*N*D*(1 - iter/max_iter));
雇佣蜂搜索半径控制:
matlab复制% 原始随机搜索
phi = 2*rand() - 1;
% 自适应收缩
phi = (1 - iter/max_iter) * (2*rand() - 1);
根据实测数据,给出场景化推荐:
特别提醒:在CEC2021的F22"组合降落伞"函数中,三种算法都面临挑战。此时可考虑:
matlab复制% 混合策略示例
if iter < max_iter/2
% 前期用WOA全局搜索
else
% 后期切GWO精细开发
end
避免循环的矩阵运算:
matlab复制% 原始循环方式
for i=1:N
D(i,:) = abs(C.*X_alpha - X(i,:));
end
% 向量化改进
D = abs(C.*X_alpha - X); % 整体矩阵运算
针对CEC2021的昂贵函数:
matlab复制persistent fitness_cache;
if isKey(fitness_cache, x_str)
fitness = fitness_cache(x_str);
else
fitness = cec21_func(x);
fitness_cache(x_str) = fitness;
end
利用parfor加速种群评估:
matlab复制parfor i=1:N
fitness(i) = evaluate(X(i,:));
end
注意:在CEC2021官方计数规则下,需同步函数评价次数统计。
现象:适应度曲线提前平缓
解决方案:
现象:迭代速度明显慢于GWO
优化措施:
现象:连续多代无改进
突破策略:
matlab复制w_α = 0.5 + 0.3*cos(pi*iter/max_iter);
X_new = w_α*X_α + (1-w_α)*(0.6*X_β + 0.4*X_δ);
matlab复制% 用量子位表示位置
X = lb + (ub-lb).*(0.5 + 0.5*sin(θ));
matlab复制v = w*v + c1*rand().*(X_best - X) + ...
c2*rand().*(D.*exp(b*l).*cos(2*pi*l));
matlab复制if rand() < exp(-Δf/T)
X = X_new; % 接受劣解
end
T = T * 0.95;
matlab复制% 前期更多侦察蜂
if iter < max_iter/3
scout_ratio = 0.4;
else
scout_ratio = 0.1;
end
matlab复制if rand() < 0.2
v = X + 0.1*gradient(fitness,X);
end
这些改进在CEC2021的F21上测试,平均提升幅度: