二进制灰太狼优化器(Binary Grey Wolf Optimizer, BGWO)
BGWO 将连续 GWO 的位置更新通过 传递函数(Transfer Function) 映射到二进制空间,适用于特征选择、维度缩减等离散优化问题。
一、算法原理简述
1.1 标准 GWO(连续)
灰太狼群体分为四层:α(最优)、β(次优)、δ(第三优)、ω(其余)。位置更新公式:
\[\mathbf{X}(t+1) = \frac{\mathbf{X}_\alpha + \mathbf{X}_\beta + \mathbf{X}_\delta}{3} - A \cdot D
\]
其中 (\(A = 2a \cdot r_1 - a\)),(\(C = 2 \cdot r_2\)),(\(a\)) 从 2 线性递减到 0。
1.2 二进制映射(BGWO)
使用 V 形传递函数(V-shaped transfer function)将连续位置转换为 0/1:
\[V(x) = \left|\tanh(x)\right|
\]
位置更新规则:
\[X_{new} =
\begin{cases}
1 - X_{old}, & \text{if } \text{rand} < V(\text{step}) \\
X_{old}, & \text{otherwise}
\end{cases}\]
其中 step 是连续位置变化量。
二、MATLAB 代码
2.1 主函数:binary_gwo.m
function [bestPos, bestFit, convergenceCurve] = binary_gwo(fitnessFunc, dim, lb, ub, nPop, maxIter)
% 二进制灰太狼优化器(BGWO)
% 输入:
% fitnessFunc - 适应度函数句柄 @(x) fitValue,x 为二进制向量 (1×dim)
% dim - 问题维度
% lb, ub - 边界(通常 0 和 1,但可保留)
% nPop - 狼群数量
% maxIter - 最大迭代次数
% 输出:
% bestPos - 最优二进制位置 (1×dim)
% bestFit - 最优适应度值
% convergenceCurve - 收敛曲线 (maxIter×1)
% 初始化
a = 2; % 控制参数,从2线性递减到0
positions = randi([0 1], nPop, dim); % 随机初始化二进制位置
fitness = zeros(nPop, 1);
% 计算初始适应度
for i = 1:nPop
fitness(i) = fitnessFunc(positions(i,:));
end
% 确定 α, β, δ 狼
[fitnessSorted, idx] = sort(fitness);
alphaPos = positions(idx(1),:); alphaFit = fitnessSorted(1);
betaPos = positions(idx(2),:); betaFit = fitnessSorted(2);
deltaPos = positions(idx(3),:); deltaFit = fitnessSorted(3);
convergenceCurve = zeros(maxIter, 1);
%% 主循环
for t = 1:maxIter
a = 2 - 2 * t / maxIter; % 线性递减
for i = 1:nPop
% 对每个维度独立更新
for j = 1:dim
% 计算三个头狼的引导分量(连续值)
r1 = rand; r2 = rand;
A1 = 2*a*r1 - a;
C1 = 2*r2;
D_alpha = abs(C1 * alphaPos(j) - positions(i,j));
X1 = alphaPos(j) - A1 * D_alpha;
r1 = rand; r2 = rand;
A2 = 2*a*r1 - a;
C2 = 2*r2;
D_beta = abs(C2 * betaPos(j) - positions(i,j));
X2 = betaPos(j) - A2 * D_beta;
r1 = rand; r2 = rand;
A3 = 2*a*r1 - a;
C3 = 2*r2;
D_delta = abs(C3 * deltaPos(j) - positions(i,j));
X3 = deltaPos(j) - A3 * D_delta;
% 连续位置平均值
X_avg = (X1 + X2 + X3) / 3;
% V 形传递函数:V(x) = |tanh(x)|
V = abs(tanh(X_avg));
% 二进制翻转规则
if rand < V
positions(i,j) = 1 - positions(i,j);
end
% 否则保持不变
end
% 边界处理(确保在 0/1)
positions(i,:) = round(positions(i,:));
positions(i,:) = max(lb, min(ub, positions(i,:)));
% 评估新位置
fitness(i) = fitnessFunc(positions(i,:));
end
% 更新 α, β, δ
[fitnessSorted, idx] = sort(fitness);
if fitnessSorted(1) < alphaFit
alphaPos = positions(idx(1),:); alphaFit = fitnessSorted(1);
end
if fitnessSorted(2) < betaFit
betaPos = positions(idx(2),:); betaFit = fitnessSorted(2);
end
if fitnessSorted(3) < deltaFit
deltaPos = positions(idx(3),:); deltaFit = fitnessSorted(3);
end
convergenceCurve(t) = alphaFit;
% 显示进度
if mod(t, 50) == 0
fprintf('迭代 %d, 最佳适应度 = %.4e\n', t, alphaFit);
end
end
bestPos = alphaPos;
bestFit = alphaFit;
end
2.2 适应度函数示例(二进制 Sphere 函数)
function fit = binary_sphere(x)
% 二进制 Sphere 函数:将二进制串解释为整数,然后计算平方和
% 用于测试 BGWO
dec = bi2de(x, 'left-msb'); % 二进制转十进制
fit = dec^2; % 极小值为 0
end
2.3 特征选择适应度示例(分类错误率)
function error = feature_selection_fitness(x, X_train, y_train, X_val, y_val)
% x: 二进制向量,1 表示选择该特征
% 使用 KNN 分类器评估(无需工具箱,用简单距离)
selected = logical(x);
if sum(selected) == 0
error = 1; % 未选择任何特征,错误率最大
return;
end
% 训练集和验证集
X_tr = X_train(:, selected);
X_va = X_val(:, selected);
% 简单最近邻(1-NN)
pred = knn_predict(X_tr, y_train, X_va);
error = sum(pred ~= y_val) / length(y_val);
end
function pred = knn_predict(X_train, y_train, X_test)
nTest = size(X_test,1);
pred = zeros(nTest,1);
for i = 1:nTest
dist = sum((X_train - X_test(i,:)).^2, 2);
[~, idx] = min(dist);
pred(i) = y_train(idx);
end
end
2.4 演示脚本:demo_binary_gwo.m
%% 二进制灰太狼优化器演示
clear; clc; close all;
% 问题设置
dim = 10; % 维度
lb = 0; ub = 1; % 二进制边界
nPop = 30; % 狼群数量
maxIter = 100; % 最大迭代次数
% 适应度函数(二进制 Sphere)
fitnessFunc = @(x) binary_sphere(x);
% 运行 BGWO
[bestPos, bestFit, curve] = binary_gwo(fitnessFunc, dim, lb, ub, nPop, maxIter);
fprintf('\n最优位置: %s\n', mat2str(bestPos));
fprintf('最优适应度: %.4e\n', bestFit);
% 收敛曲线
figure;
semilogy(curve, 'b-', 'LineWidth', 2);
xlabel('迭代次数'); ylabel('适应度值');
title('BGWO 收敛曲线');
grid on;
三、运行说明
- 将上述所有函数保存为
.m文件(文件名与函数名一致)。 - 运行
demo_binary_gwo.m。 - 程序将显示最优二进制串和适应度值,以及收敛曲线。
参考代码 实现二进制灰太狼优化器 www.youwenfan.com/contentcnv/81248.html
四、关键参数调优
| 参数 | 作用 | 建议值 |
|---|---|---|
nPop |
狼群规模 | 20 ~ 50 |
maxIter |
最大迭代次数 | 50 ~ 500(视维度而定) |
| 传递函数 | V 形 / S 形 | V 形(` |
| 边界处理 | 确保 0/1 | 使用 round + max/min 钳位 |
五、扩展建议
- S 形传递函数:
S(x) = 1/(1+exp(-x)),然后if rand < S(x), x=1; else x=0; end。 - 混合策略:引入交叉/变异操作增加多样性。
- 多目标 BGWO:修改为 Pareto 前沿优化。
- 并行计算:使用
parfor加速适应度评估。
浙公网安备 33010602011771号