CEC2017 benchmark function调用接口

CEC2017 benchmark function能够从这里下载。web

导师最近给了个课题让我本身研究,跟智能优化算法相关的,必不可免的要用到最新的CEC2017 benchmark function,然而
笔者着实踩了不少坑,第一步编译都差点跪了。算法

坑一:abs

若是你下载了上面的CEC2017 benchmark function,并试着按照它的指示在matlab窗口运行mex cec17_func.cpp -DWINDOWS服务器

你会发现,编译根本不经过啊摔!!!!!并且错误提醒信息有几页啊摔!(′д` )…彡…彡函数

而后就会各类怀疑人生,是否是我下的matlab有问题啊,官方给的文件应该没问题才对啊,这个cec17_func.cpp这么长怎么debug啊?优化

后面我发现只是里面的一个函数调用出错了!什么鬼,官方文档都这么不正规吗?this

解决办法:打开cec17_func.cpp,搜索abs,将里面的abs通通改为fabs,对浮点数求绝对值应该用fabsdebug

坑二:This function(F2) has been deleted

编译经过了,试着运行main看看?而后就会提示错误信息:This function(F2) has been deleted.,这又是什么?
matlab为何会提示这样的信息?而后发现是cec17_func.cpp里把function2注释掉了,输出了这行信息...不知道
为何要这么作,解决方法就是把那行代码注释掉而且把function2的注释去掉。code

坑三:接口如何使用

其实只要知道这里的benchmark function就是用来求 fitness value的这一点再去阅读一下代码,就会很熟悉接口了。orm

让咱们先来看看PSO_func.mmain.m是如何调用cec17_func.cpp的。接口

先看一下main.m的这一行:

fhd=str2func('cec17_func');

这里用了str2func()函数,fhd成为了cec17_func的handle,以后调用fhd的时候就是在调用cec17_func

再来看PSO_func.

e=feval(fhd,pos',varargin{:});

这里用了一个feval函数,你只须要知道这里返回了当前pos的fitness value就好了,pos'是pos的转置矩阵,
因此pos'是一个DNP(维度种群大小)的矩阵,而varargin{:}是具体使用哪一个benchmark function。
那么这个cpp和m的交互是如何实现的呢?具体请查阅mex命令的相关知识。

总结一下上面那段代码的含义:返回pos'的fitness value给e,varargin=1...29,表明着第varargin个benchmark function。

坑四:大规模运算

总算解决了,那么咱们能够运行程序了,按照CEC2017的标准,种群大小为100,维度是10,30,100,迭代次数是维度*10000。
在我本身的电脑上跑10维的数据,每一个函数跑50遍取均值,我算了一下时间一次实验大概要跑一天一晚上...

而后我就去问老师要了一个实验室服务器的帐号,远程控制服务器运算,睡觉起来看结果就行了。

相关文章
相关标签/搜索