我目前正在Haskell中編寫遺傳算法,其中我的染色體是代表可執行系統的相當複雜的結構。在Haskell程序中從堆棧溢出或堆耗盡中恢復
爲了讓我評估我的染色體的適應性,我必須運行一個evolution
函數,它執行給定系統的一個計算週期。然後通過計算在系統沒有變化(在這種情況下系統終止)之前應用evolution
多少次來計算適應度。
現在的問題如下:一些系統可以運行無限長,永遠不會終止 - 我想懲罰那些(通過給他們一點分數)。我可以簡單地對步數設定一定的限制,但它不能解決另一個問題。
我的一些系統執行指數計算(即使對於它們增長到巨大尺寸的evloution步驟的小值)並且它們導致ERROR - Control stack overflow
。對於人類觀察者來說,很明顯,他們永遠不會終止,但算法無法知道,因此它運行和壓碎。
我的問題是:是否有可能從這樣的錯誤中恢復?我希望我的算法在遇到這個問題後繼續運行,並相應地調整染色體得分。
在我看來,最好的解決方案是告訴程序:「嘿,試試這個,但如果你失敗了,別擔心,我知道如何處理它」。但我甚至不確定這是否可能。如果沒有 - 是否有其他選擇?
你可以發佈一個運行你的程序的結果+ RTS-s -K100m -H5M -A5M嗎?我認爲GHC運行時不會輸出「ERROR - 控制堆棧溢出」之類的東西。 – Tener 2011-04-19 15:10:14
哦,你正在Hugs中運行你的代碼!請確實使用GHC,它速度更快,而且通常先進。 – Tener 2011-04-19 15:17:46
再次嘗試使用GHC,通過Haskell平臺 - 它是一個更好的編譯器 - http://haskell.org/platform – 2011-04-19 16:25:47