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遍取均值,我算了一下時間一次實驗大概要跑一天一晚上...

而後我就去問老師要了一個實驗室服務器的帳號,遠程控制服務器運算,睡覺起來看結果就行了。

相關文章
相關標籤/搜索