01
—
引言
前几期已推出了cec2017、cec2021、cec2022测试函数的快捷用法:
已初步积累了相关测试函数实操技能。那么,本期照猫画虎推出cec2019测试函数的使用,1分钟让你学会。
本期所有代码+数据在文末下载
该cec2019测试函数共有10个单目标测试函数。cec2017、cec2021、cec2022每个函数的变量维数是一样的,搜索区间也一样都在[-100,100]之间。而与其他测试函数不同的是,cec2019中每个函数的变量维数不一样,搜索区间也不一样。所有的测试函数都是解决最小化问题,D为维数,如下形式:
02
—
实操
首先需下载cec2019函数。函数的格式为cpp文件,cec19_func.cpp。在matlab里需要编译。在matlab的命令行输入:
mex cec19_func.cpp
提示MEX 已成功完成,编译生成了cec19_func.mexw64文件即可。这里我们已经为各位小伙伴下载并编译好了,文末可直接享用。
其次,加载cec2019测试函数。cec2019测试函数有10个,输入x的数据格式需为列向量,即N*1,调用方式为:
fobj = @(x) cec19_func(x,1);
数字1表示cec2019的第一个函数。当然,可以在1-10中任意选择一个数,就选择了对应的测试函数。
如果你的输入数据x是一个行向量,即1*N,调用方式为:
fobj = @(x) cec19_func(x',1);
考虑到大部分优化算法中x的格式为(nPop种群数,Dim维度),因此,我们采用了第二种fobj的调用方式。如果遇到的x是(Dim维度,nPop种群数),还需要小伙伴自行改写成第一种方式。
我们将所有cec2019函数的信息(上限ub,下限lb,维度dim,cec测试目标函数fobj)封装成了一个名为Get_Functions_cec2019.m的文件中,便于使用。
Function_name=2; % 函数名:1 - 10
% lb->下限,ub->上限,fobj->目标函数,dim-> 维度
[lb,ub,dim,fobj] = Get_Functions_cec2019(Function_name);
最后,调用算法测试应用。用以下7个算法简单试验一下:经典算法,粒子群优化算法PSO;高被引算法,鲸鱼优化算法WOA,灰狼优化算法GWO,哈里斯鹰优化算法HHO;最近发表的算法,蜣螂优化算法DBO(2022),长鼻浣熊优化算法COA(2022),杨氏双缝实验优化器YDSE(2022)。
粒子群优化算法(PSO下载地址:优化算法-20种动物园优化算法(附Matlab代码))
鲸鱼优化算法(WOA下载地址:优化算法-鲸鱼优化算法Whale Optimization Algorithm(附Matlab代码))
哈里斯鹰优化算法(HHO下载地址:优化算法-哈里斯鹰优化算法Harris hawks optimization(附Matlab代码))
灰狼优化算法(GWO下载地址:优化算法-灰狼优化算法 Grey Wolf Optimizer(附Matlab代码))
蜣螂优化算法(DBO下载地址:优化算法-蜣螂优化器 Dung beetle optimizer(附Matlab代码))
长鼻浣熊优化算法(COA下载地址:优化算法-长鼻浣熊优化算法Coati Optimization Algorithm(附Matlab代码))
杨氏双缝实验优化器(YDSE下载地址:优化算法-杨氏双缝实验优化器Young’s double-slit experiment (附Matlab代码))
整体的代码如下:
% 微信公众号:优化算法侠,Swarm-Opti
clc;clear;close all
%%
nPop=50; % 种群数
Max_iter=500; % 最大迭代次数
%% 选择函数
Function_name=2; % 函数名:1 - 10
% lb->下限,ub->上限,fobj->目标函数,dim-> 维度
[lb,ub,dim,fobj] = Get_Functions_cec2019(Function_name);
%% 调用算法
Optimal_results={}; % 保存Optimal results
index = 1;
% WOA
tic
[Best_score,Best_x,cg_curve]=WOA(nPop,Max_iter,lb,ub,dim,fobj);
Optimal_results{1,index}='WOA'; % 算法名字
Optimal_results{2,index}=cg_curve; % 收敛曲线
Optimal_results{3,index}=Best_score; % 最优函数值
Optimal_results{4,index}=Best_x; % 最优变量
Optimal_results{5,index}=toc; % 运行时间
index = index +1;
% HHO
tic
[Best_score,Best_x,cg_curve]=HHO(nPop,Max_iter,lb,ub,dim,fobj);
Optimal_results{1,index}='HHO';
Optimal_results{2,index}=cg_curve;
Optimal_results{3,index}=Best_score;
Optimal_results{4,index}=Best_x;
Optimal_results{5,index}=toc;
index = index +1;
% GWO
tic
[Best_score,Best_x,cg_curve]=GWO(nPop,Max_iter,lb,ub,dim,fobj);
Optimal_results{1,index}='GWO';
Optimal_results{2,index}=cg_curve;
Optimal_results{3,index}=Best_score;
Optimal_results{4,index}=Best_x;
Optimal_results{5,index}=toc;
index = index +1;
% DBO
tic
[Best_score,Best_x,cg_curve]=DBO(nPop,Max_iter,lb,ub,dim,fobj);
Optimal_results{1,index}='DBO';
Optimal_results{2,index}=cg_curve;
Optimal_results{3,index}=Best_score;
Optimal_results{4,index}=Best_x;
Optimal_results{5,index}=toc;
index = index +1;
% COA
tic
[Best_score,Best_x,cg_curve]=COA(nPop,Max_iter,lb,ub,dim,fobj);
Optimal_results{1,index}='COA';
Optimal_results{2,index}=cg_curve;
Optimal_results{3,index}=Best_score;
Optimal_results{4,index}=Best_x;
Optimal_results{5,index}=toc;
index = index +1;
% PSO
tic
[Best_score,Best_x,cg_curve]=PSO(nPop,Max_iter,lb,ub,dim,fobj);
Optimal_results{1,index}='PSO';
Optimal_results{2,index}=cg_curve;
Optimal_results{3,index}=Best_score;
Optimal_results{4,index}=Best_x;
Optimal_results{5,index}=toc;
index = index +1;
% YDSE
tic
[Best_score,Best_x,cg_curve]=YDSE(nPop,Max_iter,lb,ub,dim,fobj);
Optimal_results{1,index}='YDSE';
Optimal_results{2,index}=cg_curve;
Optimal_results{3,index}=Best_score;
Optimal_results{4,index}=Best_x;
Optimal_results{5,index}=toc;
index = index +1;
%% plot 绘图
figure
for i = 1:size(Optimal_results, 2)
% plot(Optimal_results{2, i},'Linewidth',2)
semilogy(Optimal_results{2, i},'Linewidth',2)
hold on
end
title(['Convergence curve, Dim=' num2str(dim)])
xlabel('Iteration');
ylabel(['Best score F' num2str(Function_name) ]);
ax = gca;
set(ax,'Tag',char([100,105,115,112,40,39,20316,32773,58,...
83,119,97,114,109,45,79,112,116,105,39,41]));
axis tight
grid on
box on
eval(ax.Tag)
set(gcf,'Position',[400 200 400 250])
legend(Optimal_results{1, :})
测试结果展示:
F1结果:
F2结果:
F3结果:
F10结果:
当然,如果你想一次性跑完cec2019所有10个函数,可以针对Function_name自写一个for循环解决。
可以发现:只定义了一个函数([lb,ub,dim,fobj] = Get_Functions_cec2019(Function_name))以获取cec函数信息,算法调用部分并未对PSO等等优化算法做任何改动,保留了算法的内在结构,保证算法的纯粹性。
本推文抛砖引玉仅展示了多种(7种)算法的对比方式。相信在此基础上,各位小伙伴可以利用270多种算法跑完cec2019测试函数。速看!突破270种!-Matlab版(截至2023.7.29)
03
—
Matlab代码下载
声明:
联系客服