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

代码获取方式:支付后会显示网盘链接!
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在转换公式MATLAB 代码时,需要了解一些 MATLAB 的基本语法。可以遵循以下步骤: 1. 确定公式中所有的变量,并将它们声明为 MATLAB 中的变量。 2. 将公式中的运算符,如加、减、乘、除等,替换为 MATLAB 中的对应运算符。 3. 如果公式中使用了函数,需要在 MATLAB 代码中使用同样的函数。 4. 如果公式中使用了矩阵或数组,则需要在 MATLAB 代码中使用同样的矩阵或数组运算。 5. 调试代码并验证结果是否正确。 请注意,公式代码的转换可能需要一些编程经验,但只要您了解基本语法,并且认真对待,就可以完成这个过程。 ### 回答2: 将公式转换为Matlab代码可以按照以下步骤进行: 1. 了解公式:仔细阅读并理解给定的公式,确保清楚公式的含义和计算过程。 2. 定义变量:根据公式中的变量,为每个变量分配一个合适的变量名。确保变量名能够清晰地表达其含义。 3. 编写代码:根据公式中的计算步骤,使用Matlab的语法编写代码。可以使用控制结构(如循环或条件语句)来实现复杂的计算过程。 4. 引入库函数:根据需要,可以使用Matlab的库函数来简化计算过程。在使用库函数之前,确保已经正确导入相应的库。 5. 调试和测试:编写完代码后,进行调试和测试以确保代码的正确性。可以将一些测试数据输入到代码中,并与手动计算的结果进行比较。 6. 优化代码:根据需要,可以对代码进行进一步的优化,以提高计算效率。例如,可以使用向量化操作或并行计算等技术来加快代码的执行速度。 7. 添加注释:在代码中添加注释,以解释每个步骤的目的和计算过程。这样可以方便后续的代码维护和理解。 8. 文档化代码:对于复杂的算法或项目,建议编写文档来说明代码的使用方法、输入输出格式和功能。 总之,将公式转换为Matlab代码需要深入理解公式Matlab语法,并灵活运用各计算技巧和库函数。通过调试、测试和优化,确保代码的正确性和效率。 ### 回答3: 将数学公式转换成MATLAB代码需要以下步骤: 1. 理解问题:首先需要理解数学公式的含义和目标,确保能正确地将其转换成代码。 2. 编写伪代码:使用自然语言编写伪代码来描述将要实现的算法和步骤。伪代码充当了将公式转换为实际代码的桥梁。 3. 选择MATLAB函数:在MATLAB中寻找适当的函数来实现所需的数学运算。例如,MATLAB中的power函数可用于计算幂运算。 4. 创建变量:根据公式中的变量,创建具有相应类型和值的MATLAB变量。变量的命名应与公式中的符号相对应。 5. 编写代码:根据伪代码将实际代码编写成MATLAB语言。确保使用正确的语法和函数来执行所需的数学运算。 6. 调试和测试:运行所编写的代码,并进行适当的调试和测试,以确保其正确性和准确性。可以使用具体值或向量/矩阵进行测试。 7. 优化和改进:根据需要对代码进行优化和改进,以提高其效率和可读性。可以使用MATLAB中的内置函数或其他方法来实现优化。 8. 文档记录:为了方便日后的使用和参考,对代码进行适当的文档记录,注释和说明代码的用途、输入和输出等信息。 总之,将数学公式转换成MATLAB代码需要理解问题、编写伪代码、选择合适的函数、创建变量、编写实际代码、调试和测试、优化和改进,以及文档记录。这样可以将抽象的数学公式转化为具体的、可执行的MATLAB代码

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

今天吃饺子

不想刀我的可以选择爱我

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

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

打赏作者

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

抵扣说明:

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

余额充值