灰狼优化算法MATLAB实现,包含种群初始化和29种基准函数测试
灰狼优化算法(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_itera = 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, Deltaif fitness < Alpha_scoreAlpha_score = fitness;Alpha_pos = Positions(i,:);endif fitness > Alpha_score && fitness < Beta_scoreBeta_score = fitness;Beta_pos = Positions(i,:);endif fitness > Alpha_score && fitness > Beta_score && fitness < Delta_scoreDelta_score = fitness;Delta_pos = Positions(i,:);endend% 更新收敛曲线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;endend% 显示迭代信息disp(['Iteration ' num2str(iter) ', Best Fitness = ' num2str(Alpha_score)]);endBest_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:dimub_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';
endfunction [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';
endfunction [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个基准函数的实现,这里仅展示部分作为示例。实际应用中建议从权威来源获取完整的测试函数集合。