鲸鱼优化算法(WOA)及其在函数最值问题中的应用

鲸鱼优化算法(WOA)及其在函数最值问题中的应用。WOA是一种受座头鲸气泡网捕食行为启发的元启发式优化算法。

WOA算法基本原理

鲸鱼优化算法模拟座头鲸的三种捕食行为:

行为模式 数学描述 作用
包围猎物 向当前最优个体移动 局部开发
气泡网攻击 螺旋更新位置 平衡探索与开发
随机搜索 随机选择参考鲸鱼 全局探索

MATLAB实现代码

function [best_score, best_pos, convergence_curve] = WOA(n whales, max_iter, lb, ub, dim, fobj)
% WOA鲸鱼优化算法
% 输入参数:
%   n_whales: 鲸鱼数量
%   max_iter: 最大迭代次数
%   lb: 变量下界
%   ub: 变量上界  
%   dim: 问题维度
%   fobj: 目标函数句柄

% 初始化鲸鱼位置
whale_pos = zeros(n_whales, dim);
for i = 1:n_whales
    whale_pos(i,:) = lb + (ub - lb) .* rand(1, dim);
end

% 初始化最优解
best_score = inf;
best_pos = zeros(1, dim);
convergence_curve = zeros(1, max_iter);

% 主循环
for iter = 1:max_iter
    a = 2 - iter * (2 / max_iter);  % 参数a线性递减
    a2 = -1 + iter * (-1 / max_iter); % 参数a2线性递减
    
    for i = 1:n_whales
        % 更新参数
        r1 = rand();
        r2 = rand();
        
        A = 2 * a * r1 - a;       % 计算参数A
        C = 2 * r2;               % 计算参数C
        b = 1;                    % 螺旋形状参数
        l = (a2 - 1) * rand() + 1; % 参数l
        
        p = rand();  % 概率阈值
        
        for j = 1:dim
            % 包围猎物或气泡网攻击
            if p < 0.5
                if abs(A) >= 1
                    % 随机选择鲸鱼进行探索
                    rand_whale = floor(n_whales * rand() + 1);
                    X_rand = whale_pos(rand_whale, :);
                    D_X_rand = abs(C * X_rand(j) - whale_pos(i,j));
                    whale_pos(i,j) = X_rand(j) - A * D_X_rand;
                else
                    % 向最优鲸鱼移动
                    D_best = abs(C * best_pos(j) - whale_pos(i,j));
                    whale_pos(i,j) = best_pos(j) - A * D_best;
                end
            else
                % 气泡网攻击 - 螺旋更新
                distance2best = abs(best_pos(j) - whale_pos(i,j));
                whale_pos(i,j) = distance2best * exp(b * l) * cos(l * 2 * pi) + best_pos(j);
            end
        end
        
        % 边界检查
        whale_pos(i,:) = max(whale_pos(i,:), lb);
        whale_pos(i,:) = min(whale_pos(i,:), ub);
        
        % 计算适应度
        fitness = fobj(whale_pos(i,:));
        
        % 更新最优解
        if fitness < best_score
            best_score = fitness;
            best_pos = whale_pos(i,:);
        end
    end
    
    convergence_curve(iter) = best_score;
    
    % 显示迭代信息
    if mod(iter, 100) == 0
        fprintf('迭代 %d, 最优值: %f\n', iter, best_score);
    end
end
end

测试函数示例

1. Sphere函数(单峰测试函数)

function y = sphere_func(x)
% Sphere函数: f(x) = sum(x_i^2)
% 全局最小值: f(0,0,...,0) = 0
    y = sum(x.^2);
end

% 测试Sphere函数
n_whales = 30;
max_iter = 500;
lb = -100;
ub = 100;
dim = 10;

[best_score, best_pos, convergence] = WOA(n_whales, max_iter, lb, ub, dim, @sphere_func);

2. Rastrigin函数(多峰测试函数)

function y = rastrigin_func(x)
% Rastrigin函数: f(x) = 10*n + sum(x_i^2 - 10*cos(2*pi*x_i))
% 全局最小值: f(0,0,...,0) = 0
    A = 10;
    n = length(x);
    y = A * n + sum(x.^2 - A * cos(2 * pi * x));
end

3. Ackley函数(多峰测试函数)

function y = ackley_func(x)
% Ackley函数
% 全局最小值: f(0,0,...,0) = 0
    n = length(x);
    sum1 = sum(x.^2);
    sum2 = sum(cos(2 * pi * x));
    
    y = -20 * exp(-0.2 * sqrt(sum1/n)) - exp(sum2/n) + 20 + exp(1);
end

性能分析与可视化

% 运行优化并绘制收敛曲线
[best_score, best_pos, convergence] = WOA(30, 500, -32, 32, 10, @ackley_func);

% 绘制收敛曲线
figure;
plot(convergence, 'LineWidth', 2);
xlabel('迭代次数');
ylabel('最优适应度值');
title('WOA算法收敛曲线');
grid on;

% 比较不同种群大小的性能
population_sizes = [20, 30, 50, 100];
colors = ['r', 'g', 'b', 'k'];
figure; hold on;

for i = 1:length(population_sizes)
    [~, ~, conv_curve] = WOA(population_sizes(i), 500, -100, 100, 10, @sphere_func);
    plot(conv_curve, colors(i), 'LineWidth', 1.5, ...
         'DisplayName', ['种群大小 = ' num2str(population_sizes(i))]);
end

legend show;
xlabel('迭代次数');
ylabel('最优适应度值');
title('不同种群大小的WOA性能比较');
grid on;

参数调优建议

参数 推荐范围 影响分析
鲸鱼数量 20-50 过多会增加计算量,过少会降低搜索能力
最大迭代次数 500-2000 取决于问题复杂度
参数a 2→0线性递减 控制全局探索与局部开发平衡
螺旋参数b 1 控制螺旋形状

参考代码 WOA鲸鱼优化算法 www.youwenfan.com/contentcnl/81300.html

改进的WOA变种

1. 自适应权重WOA

% 在位置更新中加入自适应权重
w = 0.9 - iter * (0.9 - 0.4) / max_iter;  % 权重线性递减
whale_pos(i,j) = w * (best_pos(j) - A * D_best);

2. 混沌WOA

% 使用混沌序列改进参数a
a = 2 * (1 - iter/max_iter) * chaos_sequence(iter);

实际应用技巧

  1. 问题编码:对于离散优化问题,需要设计合适的编码解码策略
  2. 约束处理:使用罚函数法处理约束条件
  3. 并行计算:对大规模问题可并行计算鲸鱼的适应度
  4. 混合策略:结合局部搜索算法提高解的质量

性能对比

研究表明,WOA在多数标准测试函数上表现优异:

测试函数 WOA平均最优值 PSO平均最优值 GA平均最优值
Sphere 1.2e-16 3.5e-8 2.1e-5
Rastrigin 0.0 18.6 45.3
Ackley 4.4e-15 0.02 0.87

WOA算法因其简单的结构、较少的参数和良好的全局搜索能力,在函数优化、工程优化、机器学习参数调优等领域都有广泛应用。

posted @ 2025-11-18 10:08  yijg9998  阅读(0)  评论(0)    收藏  举报