有没有办法在Haskell中有效地进行最佳搜索?我想维护一个动态树。我有一个启发式函数,可以计算每个节点的数字和一个后续函数,它将返回一个节点的子节点列表。
在每一步,我都想采用具有最佳启发式的叶节点并将其替换为其子节点。重复此过程,直到我得到一个“足够好”的节点。
为此,我需要维护叶子的优先级队列。但有没有办法可以有效地从优先级队列中的叶子到树中的位置,以便我可以修改树?
答案 0 :(得分:6)
一个可能的答案是使用Haskell最可靠的可变性: laziness 。如果您懒洋洋地生成整个树(即使它无限),然后根据您的优先级队列重复查看树中的不同点,那么您将只生成尽可能多的树来执行您的最佳搜索。
您仍然需要为树的下部分支重复遍历付费,但也许您可以更改搜索结构,以便做得更好。
答案 1 :(得分:2)
您不需要显式树来获得最佳的首次搜索。只是优先级队列应该做。使队列的节点携带尽可能多的上下文来计算后继节点和成本函数。如果你真的需要树,那么正如其他人所说,拉链是要走的路。您将拉链保留在优先级队列中,而不仅仅是树节点。由于优先级队列包含所有叶子,因此您不需要修改共享树。
答案 2 :(得分:1)
查看weighted-search包,它实现了优先搜索monad。它允许您表达所需的解决方案,在此过程中添加weight
以指示您何时知道解决方案的费用增加,并且包将首先找到最小权重解决方案。在您的情况下,创建要搜索的整个树(可能是无限的),然后使用加权搜索来构建通过该树的所有路径并为它们赋予权重。然后你将首先获得最小权重路径。