走在一棵巨大的游戏树上



我有一个游戏树太大了,无法完整行走。

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

我认为有更多的细节会有所帮助。此外,你提出了两个完全独立的问题——你是希望同时应用两个限制,还是在寻找如何独立应用?也就是说,粗略地说:

  • 时间限制:如果不使用IO,这显然是不可能的。假设你的游戏树遍历函数在很大程度上是纯的,你可能不想把它和决定控制流的一堆时间跟踪纠缠在一起。我认为这里最简单的事情可能是让遍历产生一个逐渐更好的结果流,将每个"迄今为止最好的结果"放入一个MVar或类似的文件中,并在一个单独的线程上运行它。如果达到时间限制,只需终止线程并从MVar中获取当前值。

  • 深度限制:最彻底的方法是简单地执行广度优先搜索,不是吗?如果无论出于何种原因,这都是不可行的,我认为没有什么比简单地保留一个计数器来指示当前深度而在达到最大值时不继续更深的解决方案更好的了。注意,在这种情况下,可以使用Reader风格的monad来整理代码,其中每个递归调用都封装在类似local (subtract 1)的东西中。

基本包中的timeout函数允许您在一段时间后终止计算。对于Haskell中的搜索问题,将timeout与越来越深的结果流交错,以便将最新的结果存储在MVar中是一种相对常见的技巧。

您还可以使用惰性编写器monad进行遍历,生成一个改进答案列表。现在,您已经在一定程度上简化了您的问题,只根据某些标准从列表中选择第一个"足够好"或"迄今为止最好"的结果。最重要的是,你可以使用上面描述的timeout技巧,或者你认为合适的任何其他方法。。。

相关内容

  • 没有找到相关文章

最新更新