2013-05-12 93 views
2

我正在使用遺傳算法在Matlab優化計算昂貴的適應度函數也有約束。我現在將懲罰限制在目標函數中,因爲違反約束只能在函數求值的末尾計算。我想用nonlcon來滿足約束條件。使用Matlab遺傳算法優化昂貴的適應度函數約束

但我的問題是,健身功能評估是昂貴的,我不能再次做檢查違反約束。我已經看到了一些嵌套的函數公式,其中使用輸出函數I可以累積每一代的所有單個變量值。

根據我的想法,是否有可能有一個矩陣,我可以將所有的個人價值存儲在一代生成更新開始時矩陣,而我的健身評估和當我調用nonlcon的約束評估,然後查找更新後的矩陣來約束違規。當我試圖實現這一點時,我有一些疑問。

1)我記得我在一些論壇上outputfcn遺傳算法中讀書可以被稱爲無論是在開始一代年底。默認情況下,它在最後。如果它在最後調用,我將無法執行我的方法。可悲的是,我無法在一開始就找到如何調用outputfcn,​​而不是一代人的結束。

2)由於我的健身功能在計算上很昂貴,我正在使用並行評估。那麼,在Matlab中使用並行選項時可能會實現上述想法,否則會產生一些困難?

回答

0

你還在尋找答案?我有一個類似的問題,並解決了它here。我在ga中使用了兩個匿名函數fitnessFunctionnonlconFunction,它們都指向我的switchOutput函數。他們只是傳遞一個額外的標誌,要求輸出。在switchOutput中,對於具有特定輸入集的第一次調用完成了昂貴的計算,並且存儲結果。如果有另一個具有相同輸入集的調用,則返回存儲的結果。

使用此設置,無論您將哪種順序稱爲健身功能和約束功能都無關緊要。對於第一次使用新輸入集的調用,結果將被計算出來,並且對於具有相同輸入的任何後續調用,保存的結果將被返回!