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

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

回答是NO!

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

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

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

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

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

6b0e8b7f0f382b272837b964d881462b.png

69b46644d3f667ceb2ca070df8efd475.png

1a0f71594bda0a045b1698e1f1f07bdb.png

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


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

话不多说,先看结果!

bb6476a0087dc6d75061403c065a284c.png

e57d8034662174cc25e39d5daf853f16.png

7751ddece511b5b63c8f04e37d96e742.png

a06253dfbb7aa791415520b104ddb803.png

4abe856b084e52844716925e6d6fdb33.png

597827e3808cab10c46d5bd2f5c5cf80.png

7202e617e244dd4805c0a8413da7f2f9.png

69badbae6e3e278975eecc28ccc967f7.png

1b06381156ce82820b3e62c664ec9630.png

abc69bfe69fa7f15f83e5a7e2702afed.png

c53dabd7778e5244e0454a97d25ab44d.png

48e56e6c6b2848363d9e4e903e34cda7.png

95df7fc6c0cbba3e43202f801d5d7710.png

9be0222f1087937025d5b603453decd8.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])

代码目录如下:

56bb49963bf8fae5835507bf4b68fe56.png

代码获取方式:支付后会显示网盘链接!
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

今天吃饺子

不想刀我的可以选择爱我

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

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

打赏作者

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

抵扣说明:

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

余额充值