Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Search 走在一棵巨大的野味树上_Search_Haskell_Timeout - Fatal编程技术网

Search 走在一棵巨大的野味树上

Search 走在一棵巨大的野味树上,search,haskell,timeout,Search,Haskell,Timeout,我有一棵树太大了,无法完整行走 如何编写一个函数来计算树,直到达到时间限制或深度限制?我认为,更详细一点会有所帮助。此外,您还提出了两个完全不同的问题——您是希望同时应用这两个限制,还是希望如何独立地应用这两个限制?也就是说,粗略地说: 时间限制:如果不首先使用IO,这显然是不可能的。假设你的游戏树遍历函数基本上是纯的,你可能不想把它和一堆决定控制流的时间跟踪纠缠在一起。我认为这里最简单的事情可能是让遍历产生一个逐渐更好的结果流,将每个“迄今为止最好的结果”放入一个MVar或诸如此类,并在一个

我有一棵树太大了,无法完整行走


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

我认为,更详细一点会有所帮助。此外,您还提出了两个完全不同的问题——您是希望同时应用这两个限制,还是希望如何独立地应用这两个限制?也就是说,粗略地说:

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

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


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

您还可以使用惰性编写器monad进行遍历,生成一个改进答案列表。现在,您已经将问题简化了一些,根据一些标准从列表中获取第一个“足够好”或“迄今为止最好”的结果。除此之外,您还可以使用所描述的
timeout
技巧,或者您认为合适的任何其他方法…

考虑算法,例如A*、min-max、alpha-beta和最近的GOAP。Heath,我目前使用的是minimax算法。但是在更大的树上,它需要花费太长的时间。哈,我建议在没有意识到
超时
已经存在的情况下完全这样做。哎呀。。。应该已经想到了,因为这是一个非常明显的方法。对于深度限制,不是保留深度计数器,而是使用辅助修剪功能?e、 g.
take
将列表修剪到指定的长度。@dave4420:True,当然这只是将计数器移到其他地方。如果可以懒洋洋地生成结构,那么它就相当于相同的东西,而且修剪功能更好。既然您提到了它,我可能一开始会这样做,但由于这里的问题部分是由有限的资源引起的,因此可能需要组合函数,以避免在内存中同时出现整个修剪树。