走一棵巨大的游戏树

4 search haskell timeout

我有一个游戏树太大而无法完整行走.

如何编写一个评估树的函数,直到达到时间限制或深度限制为止?

C. *_*ann 7

我想,这将有助于提供更多细节.此外,您提出了两个完全独立的问题 - 您是否希望同时应用这两个限制,或者您是否正在寻找如何独立完成每个限制?也就是说粗略地说:

  • 时间限制:IO开始时,如果不使用,这显然是不可能的.假设您的游戏树遍历功能很大程度上是纯粹的,您可能不希望将其与一堆确定控制流的时间跟踪交织在一起.我认为这里最简单的事情可能是让遍历产生逐渐更好的结果流,将每个"迄今为止最好的结果"放入一个MVar或那样的,并在一个单独的线程上运行它.如果达到时间限制,只需终止线程并从中获取当前值MVar.

  • 深度限制:最彻底的方法是简单地执行广度优先搜索,不是吗?如果由于某种原因这不可行,我认为没有比明显的解决方案更好的解决方案,只需保持一个计数器来指示当前的深度,而不是在达到最大值时继续深入.请注意,这种情况下代码可以使用Reader风格的monad进行整理,其中每个递归调用都包含在类似的内容中local (subtract 1).


Don*_*art 6

timeout基础包中的函数允许您在一段时间后终止计算.交叉timeout与越来越深的结果流,使得最近的结果存储在一个MVar是Haskell中搜索问题的相对常见的技巧.