假设我有以下的Haskell树类型,其中“State”是一个简单的包装器:
我还有一个函数"expand :: Tree a -> Tree a",它接受一个叶节点并将其扩展为一个分支,或者接受一个分支并返回不变。这种树类型表示一个N叉搜索树。
深度优先搜索是浪费的,因为搜索空间显然是无限的,我可以很容易地通过使用expand在所有树的叶节点上不断扩展搜索空间,并且意外错过目标状态的可能性非常大...因此唯一的解决方案是广度优先搜索,在这里实现得相当不错,如果存在解决方案,它将找到解决方案。
但是我想要生成的是在找到解决方案之前遍历的树。 这是一个问题,因为我只知道如何进行深度优先搜索,这可以通过简单地在第一个子节点上反复调用"expand"函数来完成...直到找到一个目标状态。(这实际上只会生成一个非常不舒适的列表。)
是否有人能给我一些提示如何做到这一点(或整个算法),或者对于是否可能具有合理的复杂度给出裁决?(或任何关于此的来源,因为我发现非常少。)
data Tree a = Branch (State a) [Tree a]
| Leaf (State a)
deriving (Eq, Show)
我还有一个函数"expand :: Tree a -> Tree a",它接受一个叶节点并将其扩展为一个分支,或者接受一个分支并返回不变。这种树类型表示一个N叉搜索树。
深度优先搜索是浪费的,因为搜索空间显然是无限的,我可以很容易地通过使用expand在所有树的叶节点上不断扩展搜索空间,并且意外错过目标状态的可能性非常大...因此唯一的解决方案是广度优先搜索,在这里实现得相当不错,如果存在解决方案,它将找到解决方案。
但是我想要生成的是在找到解决方案之前遍历的树。 这是一个问题,因为我只知道如何进行深度优先搜索,这可以通过简单地在第一个子节点上反复调用"expand"函数来完成...直到找到一个目标状态。(这实际上只会生成一个非常不舒适的列表。)
是否有人能给我一些提示如何做到这一点(或整个算法),或者对于是否可能具有合理的复杂度给出裁决?(或任何关于此的来源,因为我发现非常少。)
State
,因为该名称在标准库中用于 State monad,这可能会让人们感到困惑。 - C. A. McCann