47种常用测试函数,对应详细公式!MATLAB代码

关于智能优化算法的文章,80%以上会在文章里介绍经典的CEC测试集函数,然而请问在写文章的时候必须得用这个CEC函数集的函数吗?

回答是NO!

当你的文章是将改进的智能算法用于实际工程案例的时候,不宜使用过大的篇幅介绍改进的智能算法,因为你还得讲清楚改进的算法用于实际案例时效果如何。

此时怎么解决呢?小淘在查阅了很多论文发现,很多聪明的作者会简单地将智能算法只在几种单峰函数和多峰函数进行比较。这样既能说明清楚改进智能算法的优势,还能控制篇幅。

本篇文章总结常用的47种经典测试函数,有些是在CEC函数集能找到,有些是找不到的。函数集的来源网址:http://www.sfu.ca/~ssurjano/optimization.html

这里只总结常用的CEC函数集!点击这个网址可以看到,一共47种。

这个网址中有非常多的测试函数集,基本上常用的不常用的全在里边了!而且每个函数都有公式说明和对应的理论最小值。简单截几张图:

f7824bbe6e73d4c4818c66a915e90251.png

d1c2f108a045c96dde923a28bbdfea6a.png

e5cae160d98272ee33220a0272c2a0a5.png

可以看到,不仅有图片绘制,详细公式,还有理论值,最佳值位置,自变量范围等。这不妥妥的科研宝藏网站!


本篇文章要做的事情就是:复现这些图形,用matlab跑出来,并将47个函数整理成集合,方便智能算法像调用CEC测试集一样调用每个函数!

话不多说,先看结果!

bb984f9a3c52a18baf08a10d86f39301.png

a03590fa9df05f92632fb5eec07729dc.png

ca5db74c417d13a9f824022756545805.png

7f9920a449d715defa1c2b4b7b9bfb5b.png

bdc59220ef5eaa5c6f696c734a55d65a.png

70ec4da58541e5a9c480e950cdabfa62.png

9ecd2016ebd9896a687f957d8cbcab32.png

bf308e6d4c10666b8128c63c3174b5fd.png

9ba2e4cd92f24bed6a637dc79d4d2f41.png

4c5253467df3ed87788d512686338fc4.png

9e1d407723d905091d584fbe75b0e19d.png

ede6b5c5fe683a8bb17b658de5ef9e1a.png

4fc5577fb1f09a055713b40350ab07fe.png

9a947041ffdb5d176bd4481d6d386b17.png

由于篇幅原因,这里就给大家截这么一些图,其他图片都可以复现,且可以直接采用智能算法调用!

代码展示

clear
clc
close all
warning off
addpath(genpath(pwd));
number='F1'; %选定优化函数,自行替换:F1~F47  
[lower_bound,upper_bound,variables_no,fobj]=Get_Functions_details(number);  % [lb,ub,D,y]:下界、上界、维度、目标函数表达式
pop_size=30;                      % population members 
max_iter=100;                  % maximum number of iteration
%% PSO
[PSO_Best_score,~,PSO_curve]=PSO(pop_size,max_iter,lower_bound,upper_bound,variables_no,fobj);  % Calculating the solution of the given problem using PSO 
display(['The best optimal value of the objective funciton found by PSO  for ' [num2str(number)],'  is : ', num2str(PSO_Best_score)]);
%% SSA
[SSA_Best_score,~,SSA_curve]=SSA(pop_size,max_iter,lower_bound,upper_bound,variables_no,fobj);  % Calculating the solution of the given problem using SSA 
display(['The best optimal value of the objective funciton found by SSA  for ' [num2str(number)],'  is : ', num2str(SSA_Best_score)]);
%% DE
[DE_Best_score,~,DE_curve]=DE(pop_size,max_iter,lower_bound,upper_bound,variables_no,fobj);
display(['The best optimal value of the objective funciton found by DE  for ' [num2str(number)],'  is : ', num2str(DE_Best_score)]);
%% GWO
[GWO_Best_score,~,GWO_curve]=GWO(pop_size,max_iter,lower_bound,upper_bound,variables_no,fobj);
display(['The best optimal value of the objective funciton found by GWO  for ' [num2str(number)],'  is : ', num2str(GWO_Best_score)]);
%% DBO
[DBO_Best_score,~,DBO_curve]=DBO(pop_size,max_iter,lower_bound,upper_bound,variables_no,fobj);
display(['The best optimal value of the objective funciton found by DBO  for ' [num2str(number)],'  is : ', num2str(DBO_Best_score)]);
%% Figure
if strcmp(number,'F45')==1
    disp('☆☆☆官方没给F45的图,因此这个三维图请忽略☆☆☆')
end


figure1 = figure('Color',[1 1 1]);
G1=subplot(1,2,1,'Parent',figure1);
func_plot(number)
title(number)
xlabel('x')
ylabel('y')
zlabel('z')
subplot(1,2,2)
G2=subplot(1,2,2,'Parent',figure1);
CNT=20;
k=round(linspace(1,max_iter,CNT)); %随机选CNT个点
% 注意:如果收敛曲线画出来的点很少,随机点很稀疏,说明点取少了,这时应增加取点的数量,100、200、300等,逐渐增加
% 相反,如果收敛曲线上的随机点非常密集,说明点取多了,此时要减少取点数量
iter=1:1:max_iter;
if ~strcmp(number,'F23') &&~strcmp(number,'F26') %这里是因为这几个函数收敛太快,不适用于semilogy,直接plot
    semilogy(iter(k),PSO_curve(k),'k-o','linewidth',1);
    hold on
    semilogy(iter(k),SSA_curve(k),'c-v','linewidth',1);
    hold on
    semilogy(iter(k),DE_curve(k),'b-^','linewidth',1);
    hold on
    semilogy(iter(k),GWO_curve(k),'m-*','linewidth',1);
    hold on
    semilogy(iter(k),DBO_curve(k),'y-p','linewidth',1);


else
   plot(iter(k),PSO_curve(k),'k-o','linewidth',1);
    hold on
    plot(iter(k),SSA_curve(k),'c-v','linewidth',1);
    hold on
    plot(iter(k),DE_curve(k),'b-^','linewidth',1);
    hold on
    plot(iter(k),GWO_curve(k),'m-*','linewidth',1);
    hold on
    plot(iter(k),DBO_curve(k),'y-p','linewidth',1);
end
grid on;
title('收敛曲线')
xlabel('迭代次数');
ylabel('适应度值');
box on
legend('PSO','SSA','DE','GWO','DBO')
set (gcf,'position', [300,300,800,330])

代码目录如下:

44678373e0de263c051082c8235b2679.png

点击下方卡片关注,获取更多代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淘个代码_

不想刀我的可以选择爱我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值