二进制灰太狼优化器(Binary Grey Wolf Optimizer, BGWO)
BGWO 将连续 GWO 的位置更新通过 传递函数(Transfer Function) 映射到二进制空间,适用于特征选择、维度缩减等离散优化问题。
一、算法原理简述
1.1 标准 GWO(连续)
灰太狼群体分为四层:α(最优)、β(次优)、δ(第三优)、ω(其余)。位置更新公式:
X(t+1)=Xα+Xβ+Xδ3−A⋅D\mathbf{X}(t+1) = \frac{\mathbf{X}_\alpha + \mathbf{X}_\beta + \mathbf{X}_\delta}{3} - A \cdot DX(t+1)=3Xα+Xβ+Xδ−A⋅D
其中 (A=2a⋅r1−aA = 2a \cdot r_1 - aA=2a⋅r1−a),(C=2⋅r2C = 2 \cdot r_2C=2⋅r2),(aaa) 从 2 线性递减到 0。
1.2 二进制映射(BGWO)
使用V 形传递函数(V-shaped transfer function)将连续位置转换为 0/1:
V(x)=∣tanh(x)∣V(x) = \left|\tanh(x)\right|V(x)=∣tanh(x)∣
位置更新规则:
Xnew={1−Xold,if rand<V(step)Xold,otherwiseX_{new} = \begin{cases} 1 - X_{old}, & \text{if } \text{rand} < V(\text{step}) \\ X_{old}, & \text{otherwise} \end{cases}Xnew={1−Xold,Xold,ifrand<V(step)otherwise
其中 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线性递减到0positions=randi([01],nPop,dim);% 随机初始化二进制位置fitness=zeros(nPop,1);% 计算初始适应度fori=1:nPopfitness(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);%% 主循环fort=1:maxIter a=2-2*t/maxIter;% 线性递减fori=1:nPop% 对每个维度独立更新forj=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));% 二进制翻转规则ifrand<Vpositions(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);iffitnessSorted(1)<alphaFit alphaPos=positions(idx(1),:);alphaFit=fitnessSorted(1);endiffitnessSorted(2)<betaFit betaPos=positions(idx(2),:);betaFit=fitnessSorted(2);endiffitnessSorted(3)<deltaFit deltaPos=positions(idx(3),:);deltaFit=fitnessSorted(3);endconvergenceCurve(t)=alphaFit;% 显示进度ifmod(t,50)==0fprintf('迭代 %d, 最佳适应度 = %.4e\n',t,alphaFit);endendbestPos=alphaPos;bestFit=alphaFit;end2.2 适应度函数示例(二进制 Sphere 函数)
functionfit=binary_sphere(x)% 二进制 Sphere 函数:将二进制串解释为整数,然后计算平方和% 用于测试 BGWOdec=bi2de(x,'left-msb');% 二进制转十进制fit=dec^2;% 极小值为 0end2.3 特征选择适应度示例(分类错误率)
functionerror=feature_selection_fitness(x,X_train,y_train,X_val,y_val)% x: 二进制向量,1 表示选择该特征% 使用 KNN 分类器评估(无需工具箱,用简单距离)selected=logical(x);ifsum(selected)==0error=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);endfunctionpred=knn_predict(X_train,y_train,X_test)nTest=size(X_test,1);pred=zeros(nTest,1);fori=1:nTest dist=sum((X_train-X_test(i,:)).^2,2);[~,idx]=min(dist);pred(i)=y_train(idx);endend2.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/contentcsv/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加速适应度评估。
