我有一个游戏树太大而无法完整行走。
如何在达到时间限制或深度限制之前编写将评估树的函数?
答案 0 :(得分:7)
我认为,这将有助于提供更多细节。此外,您提出了两个完全独立的问题 - 您是否希望同时应用这两个限制,或者您是否正在寻找如何独立完成每个限制?也就是说,粗略地说:
时间限制:如果不首先使用IO
,这显然是不可能的。假设您的游戏树遍历功能很大程度上是纯粹的,您可能不希望将它与一堆确定控制流的时间跟踪交织在一起。我认为这里最简单的事情可能是让遍历产生逐渐更好的结果流,将每个“迄今为止最好的结果”放入MVar
等,并在一个单独的线程上运行它。如果达到时间限制,只需终止线程并从MVar
获取当前值。
深度限制:最彻底的方法是简单地执行广度优先搜索,不是吗?如果由于某种原因这不可行,我认为没有比明显的解决方案更好的解决方案,只需保持一个计数器来指示当前深度,而不是在达到最大值时继续深入。请注意,这种情况下代码可以使用Reader风格的monad进行整理,其中每个递归调用都包含在local (subtract 1)
之类的内容中。
答案 1 :(得分:6)
基础包中的timeout
函数允许您在一段时间后终止计算。将timeout
与越来越深的结果交错,使得最近的结果存储在MVar
中是Haskell中搜索问题的一种相对常见的技巧。
答案 2 :(得分:1)
您还可以使用懒惰的编写器monad进行遍历,生成一个改进答案的列表。现在你已经简化了你的问题,只是按照一些标准从列表中取出第一个“足够好”或“迄今为止最好”的结果。最重要的是,你可以使用dons描述的timeout
技巧,或者你认为合适的任何其他方法......