我目前在Haskell中编写遗传算法,其中我的染色体是代表可执行系统的相当复杂的结构.
为了让我评估染色体的适应性,我必须运行一个evolution执行给定系统的一个计算周期的函数.然后通过计算evolution在系统中没有变化之前可以应用多少次来计算适应度(在这种情况下系统终止).
现在的问题如下:一些系统可以无限长时间运行并且永远不会终止 - 我想惩罚那些(通过给予它们很少的分数).我可以简单地对步骤数量设置一定的限制,但它不能解决另一个问题.
我的一些系统执行指数计算(即使对于它们增长到巨大尺寸的渐变步骤的小值)它们也会导致ERROR - Control stack overflow.对于人类观察者来说,很明显它们永远不会终止,但算法无法知道它是如何运行和粉碎的.
我的问题是:是否有可能从这样的错误中恢复?我希望我的算法在遇到这个问题后继续运行,并相应地调整染色体分数.
在我看来,最好的解决方案就是告诉程序:"嘿,试试这个,但如果你失败了就不要担心.我知道如何处理它".但是我甚至不确定这是否可能.如果没有 - 还有其他选择吗?
我已经找到了这个问题及其答案.
在接受的答案上,您可以看到我对该解决方案的评论.它似乎不适用于此功能:
fiblist = 0 : 1 : (zipWith (+) fiblist (tail fiblist))
fib :: (Integral a) => a -> String
fib n
| n < 10000 = show (genericIndex fiblist n)
| otherwise = error "The number is too high and the calculation might freeze your machine."
Run Code Online (Sandbox Code Playgroud)
它仍然使系统无法使用,即使我只提供GHCI 256Mb堆和256Mb堆栈空间.对于length(无限列表)的简单调用,它确实有效.
我现在的问题是:所有案例的解决方案是什么样的?(有吗?如果没有,为什么不呢?)
编辑#1:其他信息
stack ghci +RTS -M256m -K256mGHC版本:stack ghc -v结果:
Version 1.0.2, Git revision fa09a980d8bb3df88b2a9193cd9bf84cc6c419b3 (3084 commits) x86_64 …Run Code Online (Sandbox Code Playgroud)