2024年12月8日更新记录
更新了算法主函数的调用方式,方便且简介:
(2)改进版本
原始版本看起来代码超级长,光修改都要好久,这次更新主要是 直接修改算法列表中的算法名称即可,不需要再像上面一样去针对每个函数构造存储值。也就是你想对比哪些,直接在里面改名称就可以,不比较的直接删掉。方便又快捷。
% 算法列表
params.algorithms = {'HHO','FHO','WOA','GWO','NRBO','SHADE'};
主循环如下,原来几百行,现在几行。,同时在代码中新增了几十种算法,方便调用。
for j = 1:params.q
% 开始计时
t_start = tic;
% 使用feval根据字符串名称调用对应的算法函数
[Best_score, Best_pos, cg_curve] = feval(algName, params.nPop, params.Max_iter, lb, ub, dim, fobj);
all_Bestscore(j,:) = Best_score;
% 结束计时
all_time(j,:) = toc(t_start);
all_cg_curve(j,:) = cg_curve;
% 显示结果
display(['The best optimal value of the objective function found by ', algName, ' for F', num2str(Function_name), ' is : ', num2str(Best_score)]);
fprintf('Best solution obtained by %s: %s\n', algName, num2str(Best_pos, '%e '));
end

原始版本
考虑到部分人实在没有编程基础,每次做算法都要跑数据,用Excel函数统计平均值、秩和检验和Friedman排名实在是太麻烦。还有就是跑数据和运行出来的图需要花时间去跑,当迭代次数很多次时就显得很花时间。因此昨晚抽空写了个程序,一键运行可以实现以下的功能:
(1)记录每个函数每次运行的适应度值,并写出Excel
(2)绘制运行多次后的平均适应度曲线,并保存至文件夹
(3)绘制每次运行的箱线图, 并保存至文件夹
(4)得出算法的秩和检验数值,并将P值和 Friedman 排 名写出Excel
(5)便捷替换其余函数,保证实时可更换,没代码能力也可以上手(会点运行就好)
一句话形容:你只需要点击运行,剩下的交给时间!下面详细讲讲怎么用。
NO.1|初始化参数
这个部分其实就是定义一些基本参数(1)包括种群数量,迭代次数和最大迭代次数,维度(2)运行之后,需要有一个保存文件和数据的路径,这里包括图片和文件的相关路径,我已经设置好,可以直接不管。

之后就是绘制收敛图的配色还有就是运行时间做个柱状图的配色里面,可以配自己喜欢的颜色,最主要的就是这个算法列表的部分。他其实就是一个把你要运行的所有算法放在一起,方便管理。后面的绘图和数据记录等等都是根据这个列表进行循环(你要跑哪些算法就把那些算法写进去,就类似我以这几个举例,HHO替换为自己的算法,后面绘制收敛图会重点区分颜色。其余的对比算法放在“优化算法”这个文件夹内。
% 算法列表
params.algorithms = {'HHO','FHO','WOA','GWO','NRBO','SHADE'};
% 初始化参数函数
function params = initialize_parameters()
params.nPop = 30; % 种群数
params.Max_iter = 1000; % 最大迭代次数
params.dim = 10; % 可选 10, 30, 50, 100
% 运行p个函数,% 循环运行q次(p为测试函数数量、q为循环运行的次数)
params.p = 3; %最大为23
params.q = 2; %循环迭代次数
% Excel数据存储路径
params.rawdata = 'cec2019result\未处理前的完整数据\cec2019完整数据.xlsx'; %完整数据,未处理过
params.filename = 'cec2019result\cec2019.xlsx'; % 处理后的数据
params.filenamepvalue = 'cec2019result\P值\P_value_cec2019.xlsx'; % 输出p值路径
params.filepathFriedman = "cec2019result\含排名的平均值数据\含排名的平均值数据.xlsx"; %运行时间保存路径
% 图片保存路径
params.dpi = 300; %全局图片dpi设置
params.save_path = 'cec2019result\figure'; %收敛图保存路径
params.save_path_box = 'cec2019result\箱线图'; %箱线图保存路径
params.save_path_bar = "cec2019result\运行时间"; %运行时间保存路径
% 算法列表
params.algorithms = {'HHO','FHO','WOA','GWO','NRBO','SHADE'};
params.colors = {
'#329D9C', '#51cb86', '#569dab', '#56C596', '#57a45d', '#5AA7A7', '#60b393', '#657D81', ...
'#69b368', '#6d7cba', '#706364', '#7BE495', '#85CBCC', '#879259', '#8d59ad', '#9467bf', ...
'#96D7C6', '#96bdca', '#A7D676', '#A8DEE0', '#BAC94A', '#CFF4D2', '#F9E2AE', '#FBC78D', ...
'#a15e5c', '#a395a7', '#a89e61', '#a9828b', '#ada58b', '#ae875f', '#af7587', '#af8982', ...
'#af965a', '#b76688', '#b87359', '#b970af', '#ba7563', '#c15890', '#c4b87b', '#c5c2b2'
};
% 运行时间柱状图配色方案
n_colors = 40; % 颜色数量
params.colorbar = rand(n_colors, 3); % 随机生成 40 种不同的颜色,每个颜色由RGB三元组表示
end
NO.2|主循环
(1)初始化成后,开始设置算法运行主体:
Function_name = x; % 函数名: 1 [lb, ub, dim, fobj] = Get_cec2005_details(Function_name);
(2)记录算法运行后的适应度值、最优适应度值及运行时
%%记录的运行值
% HHO
t_start_HHO = tic; % 开始计时tic
[HHO_Best_score,HHO_Best_pos,HHO_cg_curve]=HHO(params.nPop,params.Max_iter,lb,ub,dim,fobj);
HHO_time(j,:) = toc(t_start_HHO); % 结束计时并记录时间
display(['The best optimal value of the objective function found by HHO for F' num2str(Function_name),' is : ', num2str(HHO_Best_score)]);
fprintf ('Best solution obtained by HHO: %s\n', num2str(HHO_Best_pos,'%e '));
HHO_Best_score_all(j, :) = HHO_Best_score;
HHO_cg_curve_all(j, :) = HHO_cg_curve;
% WOA
t_start_WOA = tic; % 开始计时tic
[WOA_Best_score,WOA_Best_pos,WOA_cg_curve]=WOA(params.nPop,params.Max_iter,lb,ub,dim,fobj);
WOA_time(j,:) = toc(t_start_WOA); % 结束计时并记录时间
display(['The best optimal value of the objective function found by WOA for F' num2str(Function_name),' is : ', num2str(WOA_Best_score)]);
fprintf ('Best solution obtained by WOA: %s\n', num2str(WOA_Best_pos,'%e '));
WOA_Best_score_all(j, :) = WOA_Best_score;
WOA_cg_curve_all(j, :) = WOA_cg_curve;
% FHO(火鹰优化算法)
t_start_FHO = tic; % 开始计时tic
[FHO_Best_score,FHO_Best_pos,FHO_cg_curve]=FHO(params.nPop,params.Max_iter,lb,ub,dim,fobj);
FHO_time(j,:) = toc(t_start_FHO); % 结束计时并记录时间
display(['The best optimal value of the objective function found by FHO for F' num2str(Function_name),' is : ', num2str(FHO_Best_score)]);
fprintf ('Best solution obtained by FHO: %s\n', num2str(FHO_Best_pos,'%e '));
FHO_Best_score_all(j, :) = FHO_Best_score;
FHO_cg_curve_all(j, :) = FHO_cg_curve;
% GWO(灰狼优化算法)
t_start_GWO = tic; % 开始计时tic
[GWO_Best_score,GWO_Best_pos,GWO_cg_curve]=GWO(params.nPop,params.Max_iter,lb,ub,dim,fobj);
GWO_time(j,:) = toc(t_start_GWO); % 结束计时并记录时间
display(['The best optimal value of the objective function found by GWO for F' num2str(Function_name),' is : ', num2str(GWO_Best_score)]);
fprintf ('Best solution obtained by GWO: %s\n', num2str(GWO_Best_pos,'%e '));
GWO_Best_score_all(j, :) = GWO_Best_score;
GWO_cg_curve_all(j, :) = GWO_cg_curve;
% NRBO
t_start_NRBO = tic; % 开始计时tic
[NRBO_Best_score,NRBO_Best_pos,NRBO_cg_curve]=NRBO(params.nPop,params.Max_iter,lb,ub,dim,fobj);
NRBO_time(j,:) = toc(t_start_NRBO); % 结束计时并记录时间
display(['The best optimal value of the objective function found by NRBO for F' num2str(Function_name),' is : ', num2str(NRBO_Best_score)]);
fprintf ('Best solution obtained by NRBO: %s\n', num2str(NRBO_Best_pos,'%e '));
NRBO_Best_score_all(j, :) = NRBO_Best_score;
NRBO_cg_curve_all(j, :) = NRBO_cg_curve;
% SHADE
t_start_SHADE = tic; % 开始计时tic
[SHADE_Best_score,SHADE_Best_pos,SHADE_cg_curve]=SHADE(params.nPop,params.Max_iter,lb,ub,dim,fobj);
SHADE_time(j,:) = toc(t_start_SHADE); % 结束计时并记录时间
display(['The best optimal value of the objective function found by SHADE for F' num2str(Function_name),' is : ', num2str(SHADE_Best_score)]);
fprintf ('Best solution obtained by SHADE: %s\n', num2str(SHADE_Best_pos,'%e '));
SHADE_Best_score_all(j, :) = SHADE_Best_score;
SHADE_cg_curve_all(j, :) = SHADE_cg_curve;
(3)结果保存到results结构体中
%% 将各算法的结果保存到results结构体中
for i = 1:length(params.algorithms)
algorithm = params.algorithms{i};
results.(algorithm).Best_score_all = eval([algorithm '_Best_score_all']);
results.(algorithm).cg_curve_all = eval([algorithm '_cg_curve_all']);
results.(algorithm).time = eval([algorithm '_time']);
end
(4)如何增加、替换算法
很简单,以下面这个SHADE为例,假如不对比这个,对比PSO,直接在MATLAB界面中Ctrl+H调出替换,直接将SHADE替换为"PSO",就完成了。
% SHADE
t_start_SHADE = tic; % 开始计时tic
[SHADE_Best_score,SHADE_Best_pos,SHADE_cg_curve]=SHADE(params.nPop,params.Max_iter,lb,ub,dim,fobj);
SHADE_time(j,:) = toc(t_start_SHADE); % 结束计时并记录时间
display(['The best optimal value of the objective function found by SHADE for F' num2str(Function_name),' is : ', num2str(SHADE_Best_score)]);
fprintf ('Best solution obtained by SHADE: %s\n', num2str(SHADE_Best_pos,'%e '));
SHADE_Best_score_all(j, :) = SHADE_Best_score;
SHADE_cg_curve_all(j, :) = SHADE_cg_curve;
那要增加对比算法咋整嘞?原理都是一样的,比如增加一个DE算法,你只需要修改一下两个地方,直接再复制一下SHADE粘贴在下面,然后将下面这部分替换为DE的即可,效果如下:
% SHADE
t_start_SHADE = tic; % 开始计时tic
[SHADE_Best_score,SHADE_Best_pos,SHADE_cg_curve]=SHADE(params.nPop,params.Max_iter,lb,ub,dim,fobj);
SHADE_time(j,:) = toc(t_start_SHADE); % 结束计时并记录时间
display(['The best optimal value of the objective function found by SHADE for F' num2str(Function_name),' is : ', num2str(SHADE_Best_score)]);
fprintf ('Best solution obtained by SHADE: %s\n', num2str(SHADE_Best_pos,'%e '));
SHADE_Best_score_all(j, :) = SHADE_Best_score;
SHADE_cg_curve_all(j, :) = SHADE_cg_curve;
% DE
t_start_DE = tic; % 开始计时tic
[DE_Best_score,DE_Best_pos,DE_cg_curve]=DE(params.nPop,params.Max_iter,lb,ub,dim,fobj);
DE_time(j,:) = toc(t_start_DE); % 结束计时并记录时间
display(['The best optimal value of the objective function found by DE for F' num2str(Function_name),' is : ', num2str(DE_Best_score)]);
fprintf ('Best solution obtained by DE: %s\n', num2str(DE_Best_pos,'%e '));
DE_Best_score_all(j, :) = DE_Best_score;
DE_cg_curve_all(j, :) = DE_cg_curve;
第二个位置就是刚刚说的算法初始化列表,直接在里面的任意位置加上DE即可。
% 算法列表
params.algorithms = {'HHO','FHO','WOA','GWO','NRBO','SHADE','DE'};
关键的部分都介绍了,其余就是等着运行结束拿结果就可以
NO.3|绘图和数据写
之前已经给出准备好了路径,现在只需要直接运行即可。
(1)计算平均时间并绘制柱状图
plot_execution_time(params, results, Function_name);

(2)计算统计量并保存结果
results = compute_statistics(params, results, Function_name);
(3)计算P值并保存结果
results = compute_pvalues(params, results, Function_name);
(4)绘制收敛曲线
plot_convergence_curve(params, results, Function_name);
(5)绘制箱线图
plot_boxplot(params, results, Function_name);
NO.4|更换其他数据集
本次提供了cec2005、cec2017、cec2019、cec2020、cec2022测试集,点击阅读全文即可全部下载。
