灰狼优化算法(Grey Wolf Optimizer, GWO)MATLAB实现,包含种群初始化和29种基准函数测试。代码包含详细注释和可视化模块:
%% 灰狼优化算法主程序 (GWO.m)
function GWO()
clear; clc; close all;
% 参数设置
SearchAgents_no = 30; % 狼群数量
Max_iter = 100; % 最大迭代次数
lb = -100; % 下界
ub = 100; % 上界
dim = 30; % 问题维度
% 测试函数列表 (共29种)
Functions = {@Sphere, @Rosenbrock, @Ackley, @Rastrigin, @Griewank, ...
@Schwefel, @Zakharov, @Step, @Quartic, @Rosenbrock_rotated, ...
@Alpine, @Schaffer, @SumSquares, @Himmelblau, @Kowalik, ...
@SixHumpCamel, @Branin, @Colville, @Hartman_3, @Hartman_6, ...
@Shekel_5, @Shekel_7, @Shekel_10, @Trecanni, @SumSquares_4, ...
@Zakharov_3, @Zakharov_4, @Zakharov_5};
% 初始化结果存储
Convergence_curve = zeros(Max_iter, length(Functions));
Best_scores = zeros(1, length(Functions));
% 对每个测试函数进行优化
for func_idx = 1:length(Functions)
% 获取测试函数信息
[fobj, fmin, fmax, dim_info] = Functions{func_idx}(dim);
% 显示测试信息
fprintf('Testing Function: %s\n', func2str(Functions{func_idx}));
fprintf('Search Agents: %d, Max_iter: %d, Dim: %d\n', SearchAgents_no, Max_iter, dim);
% 运行GWO算法
[Best_score, Con_curve] = GWO_Optimization(fobj, dim, SearchAgents_no, Max_iter, lb, ub);
% 存储结果
Best_scores(func_idx) = Best_score;
Convergence_curve(:, func_idx) = Con_curve;
% 绘制收敛曲线
figure;
plot(Con_curve, 'LineWidth', 2);
xlabel('Iteration'); ylabel('Best score obtained so far');
title([func2str(Functions{func_idx}) ' Convergence Curve']);
end
% 绘制盒图比较
figure;
boxplot(100*(Best_scores - fmin)./fmax); % 标准化结果
title('Performance Comparison of GWO on 29 Benchmarks');
xlabel('Test Function'); ylabel('Normalized Error');
grid on;
end
%% 灰狼优化核心算法
function [Best_score, Con_curve] = GWO_Optimization(fobj, dim, SearchAgents_no, Max_iter, lb, ub)
% 初始化种群
Positions = initialization(SearchAgents_no, dim, ub, lb);
Alpha_pos = zeros(1,dim);
Alpha_score = inf;
Beta_pos = zeros(1,dim);
Beta_score = inf;
Delta_pos = zeros(1,dim);
Delta_score = inf;
Con_curve = zeros(1,Max_iter);
% 主循环
for iter = 1:Max_iter
a = 2 - iter * (2 / Max_iter); % 线性递减参数a
% 更新每个搜索代理的位置
for i = 1:size(Positions,1)
% 边界处理
Flag4ub = Positions(i,:) > ub;
Flag4lb = Positions(i,:) < lb;
Positions(i,:) = (Positions(i,:) .* ~(Flag4ub + Flag4lb)) + ub .* Flag4ub + lb .* Flag4lb;
% 计算适应度
fitness = fobj(Positions(i,:));
% 更新Alpha, Beta, Delta
if fitness < Alpha_score
Alpha_score = fitness;
Alpha_pos = Positions(i,:);
end
if fitness > Alpha_score && fitness < Beta_score
Beta_score = fitness;
Beta_pos = Positions(i,:);
end
if fitness > Alpha_score && fitness > Beta_score && fitness < Delta_score
Delta_score = fitness;
Delta_pos = Positions(i,:);
end
end
% 更新收敛曲线
Con_curve(iter) = Alpha_score;
% 更新位置参数
a2 = -1 + iter * (-1 / Max_iter);
for i = 1:size(Positions,1)
for j = 1:size(Positions,2)
r1 = rand();
r2 = rand();
A1 = 2*a*r1 - a;
C1 = 2*r2;
D_alpha = abs(C1*Alpha_pos(j) - Positions(i,j));
X1 = Alpha_pos(j) - A1*D_alpha;
r1 = rand();
r2 = rand();
A2 = 2*a*r1 - a;
C2 = 2*r2;
D_beta = abs(C2*Beta_pos(j) - Positions(i,j));
X2 = Beta_pos(j) - A2*D_beta;
r1 = rand();
r2 = rand();
A3 = 2*a*r1 - a;
C3 = 2*r2;
D_delta = abs(C3*Delta_pos(j) - Positions(i,j));
X3 = Delta_pos(j) - A3*D_delta;
Positions(i,j) = (X1 + X2 + X3)/3;
end
end
% 显示迭代信息
disp(['Iteration ' num2str(iter) ', Best Fitness = ' num2str(Alpha_score)]);
end
Best_score = Alpha_score;
end
%% 种群初始化函数
function Positions = initialization(SearchAgents_no, dim, ub, lb)
Boundary_no = size(ub, 2); % 边界数量
% 每个变量的边界
ub = ub(:);
lb = lb(:);
% 初始化位置矩阵
Positions = zeros(SearchAgents_no, dim);
% 每个维度使用不同的随机种子
for i = 1:dim
ub_i = ub(i);
lb_i = lb(i);
% 正态分布初始化
Positions(:,i) = randn(SearchAgents_no,1) .* (ub_i - lb_i)/6 + (lb_i + ub_i)/2;
% 边界处理
Flag4ub = Positions(:,i) > ub_i;
Flag4lb = Positions(:,i) < lb_i;
Positions(:,i) = (Positions(:,i) .* ~(Flag4ub + Flag4lb)) + ub_i .* Flag4ub + lb_i .* Flag4lb;
end
end
%% 基准函数定义 (部分示例)
function [fobj, fmin, fmax, dim_info] = Sphere(dim)
fobj = @(x) sum(x.^2);
fmin = 0; fmax = 1000;
dim_info = 'Sphere';
end
function [fobj, fmin, fmax, dim_info] = Rastrigin(dim)
fobj = @(x) 10*length(x) + sum(x.^2 - 10*cos(2*pi*x));
fmin = 0; fmax = 1000;
dim_info = 'Rastrigin';
end
% 其他27个基准函数的定义方式类似,此处省略...
% 需要完整实现29个测试函数(限于篇幅未全部展示)
%% 辅助函数
function name = func2str(f)
name = func2str(f);
name = strrep(name, '@(x)', '');
name = strrep(name, 'dim', '');
end
主要特点:
- 完整测试函数集:包含29种经典CEC/IEEE测试函数(需补充完整)
- 可视化分析:
- 每个函数的收敛曲线
- 标准化后的性能盒图比较
- 参数自适应:
- 自动边界处理
- 线性递减参数a
- 多种初始化策略:
- 正态分布初始化
- 边界处理机制
参考 灰狼算法源代码,包括初始化灰狼种群,29种基准函数的测试
扩展建议:
- 添加更多测试函数(完整29种):
function [fobj, fmin, fmax, dim_info] = Ackley(dim)
fobj = @(x) -20*exp(-0.2*sqrt(mean(x.^2)/dim)) - exp(mean(cos(2*pi*x))/dim) + 20 + exp(1);
fmin = 0; fmax = 1000;
dim_info = 'Ackley';
end
function [fobj, fmin, fmax, dim_info] = Griewank(dim)
fobj = @(x) sum(x.^2)/4000 - prod(cos(x./sqrt(1:dim))) + 1;
fmin = 0; fmax = 1000;
dim_info = 'Griewank';
end
- 性能优化选项:
% 在GWO_Optimization函数中添加:
Display = 'iter'; % 可选参数:'iter', 'final', 'none'
- 并行计算支持:
% 在主程序中添加:
if isempty(gcp('nocreate'))
parpool; % 启动并行池
end
parfor func_idx = 1:length(Functions) % 并行测试
使用方法:
- 将所有函数保存为单独的.m文件(或整合到一个文件中)
- 运行主程序GWO.m
- 查看生成的收敛曲线和性能比较图
注意事项:
- 需要MATLAB R2018b及以上版本
- 部分复杂函数可能需要更长的运行时间
- 可以通过调整SearchAgents_no和Max_iter参数平衡精度与速度
完整代码需要包含全部29个基准函数的实现,这里仅展示部分作为示例。实际应用中建议从权威来源获取完整的测试函数集合。