我是一個新手,我正在創建一個框架,用進化算法演化C++中的對象。 演化算法演化對象並測試它們以獲得最佳解決方案(例如,演進權重神經網絡並對樣本數據進行測試,以便最終獲得具有良好準確性的網絡,而無需對其進行培訓) 。框架的用戶定義參數應該在哪裏?
我的問題是,有很多參數爲算法(選擇類型/交叉/突變,每個人的概率...),並且由於它是一個框架,用戶應該能夠輕鬆地訪問和修改它們。
當前的解決方案
現在,我創造了這個形式的頭文件parameters.h:
// DON'T CHANGE THESE PARAMETERS
//mutation type
#define FLIP 1
#define ADD_CONNECTION 2
#define RM_CONNECTION 3
// USER DEFINED
static const int TYPE_OF_MUTATION = FLIP;
用戶修改靜態變量TYPE_OF_MUTATION然後我突變功能測試工作的價值TYPE_OF_MUTATION是並且調用正確的變異函數。
這種運作良好,但它有一些缺點:
- 當我改變這個頭的參數,然後調用「作」,沒有變化考慮進去,我要叫「做清潔「然後」製造「。從我所看到的,這不是makefile中的問題,而是建築的工作原理。即使我在更改參數時重新構建,也意味着重新編譯整個項目,因爲這些參數在任何地方都可以使用;它絕對沒有效率。
- ,如果你想運行遺傳算法數次使用不同的參數,你必須運行它第一次然後保存結果,更改參數,然後運行它第二次等
其他的可能性
我想過把這些參數作爲頂層函數的參數。問題是,函數然後需要20個參數左右,它似乎並不真正可讀...
我的意思是頂級函數是現在,進化算法只是通過做這樣的:
PopulationManager myPop;
myPop.evolveIt();
如果我定義的參數作爲參數,我們會碰到這樣的:
PopulationManager myPop;
myPop.evolveIt(20,10,5,FLIP,9,8,2,3,TOURNAMENT,0,23,4);
你可以看到它可能如何地獄總是定義正確的順序參數!
結論
我知道讓你從預定義功能,建立自己的算法框架,但用戶不應該經歷的所有代碼更改參數一個接一個。
指出這個框架將在內部使用,用於一組確定的項目可能是有用的。
歡迎任何關於定義這些參數的最佳方式的輸入!
如果你有很多參數,你可以將它們包裝在某種結構中並傳遞它們。 –