二进制灰太狼优化器(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;

三、运行说明

  1. 将上述所有函数保存为 .m 文件(文件名与函数名一致)。
  2. 运行 demo_binary_gwo.m
  3. 程序将显示最优二进制串和适应度值,以及收敛曲线。

参考代码 实现二进制灰太狼优化器 www.youwenfan.com/contentcnv/81248.html

四、关键参数调优

参数 作用 建议值
nPop 狼群规模 20 ~ 50
maxIter 最大迭代次数 50 ~ 500(视维度而定)
传递函数 V 形 / S 形 V 形(`
边界处理 确保 0/1 使用 round + max/min 钳位

五、扩展建议

  1. S 形传递函数S(x) = 1/(1+exp(-x)),然后 if rand < S(x), x=1; else x=0; end
  2. 混合策略:引入交叉/变异操作增加多样性。
  3. 多目标 BGWO:修改为 Pareto 前沿优化。
  4. 并行计算:使用 parfor 加速适应度评估。
posted @ 2026-06-16 09:56  晃悠人生  阅读(2)  评论(0)    收藏  举报