从现有的答案来看,这个概念似乎存在很多混乱。
问题始终是图表
树搜索和图搜索之间的区别并不在于问题图是树还是一般图。始终假设您正在处理一般图表。区别在于遍历模式用于搜索图形,图形可以是图形或树形。
如果你正在处理树形problem,两种算法变体都会产生相同的结果。因此您可以选择更简单的树搜索变体。
图和树搜索之间的区别
您的基本图搜索算法如下所示。有起始节点start
,有向边为successors
and a goal
循环条件中使用的规范。open
在内存中保存当前正在考虑的节点,开放列表。请注意,以下伪代码并非在每个方面都是正确的 (2)。
树搜索
open <- []
next <- start
while next is not goal {
add all successors of next to open
next <- select one node from open
remove next from open
}
return next
取决于你如何实施select from open
,您可以获得搜索算法的不同变体,例如深度优先搜索(DFS)(选择最新元素)、广度优先搜索(BFS)(选择最旧元素)或均匀成本搜索(选择具有最低路径成本的元素),流行的A - 通过选择最低的节点进行星形搜索成本加启发法值,等等。
上面所说的算法实际上被称为树搜索。如果存在多个以起始状态为根的有向路径,它将多次访问底层问题图的状态。如果某个状态位于有向循环上,甚至可以无限次访问该状态。但每次访问对应的都是不同的node在我们的搜索算法生成的树中。有时需要这种明显的低效率,稍后将对此进行解释。
图搜索
正如我们所见,树搜索可以多次访问一个状态。因此,它将多次探索此状态后找到的“子树”,这可能会很昂贵。图搜索通过跟踪所有访问过的状态来解决这个问题封闭名单。如果新找到继任者next
已知,它不会被插入到打开列表中:
open <- []
closed <- []
next <- start
while next is not goal {
add next to closed
add all successors of next to open, which are not in closed
remove next from open
next <- select from open
}
return next
比较
我们注意到图搜索需要更多内存,因为它会跟踪所有访问过的状态。这可以通过较小的打开列表来补偿,从而提高搜索效率。
最佳解决方案
一些实现方法select
可以保证返回最优解决方案 - 即shortest路径或路径最低成本(对于边上有成本的图表)。每当节点按照成本增加的顺序扩展时,或者当成本是非零正常数时,这基本上成立。实现这种选择的常见算法是统一成本搜索 https://en.wikipedia.org/wiki/Dijkstra's_algorithm,或者如果步骤成本相同,BFS https://en.wikipedia.org/wiki/Breadth-first_search or IDDFS https://en.wikipedia.org/wiki/Iterative_deepening_depth-first_search。 IDDFS 避免了 BFS 的过度内存消耗,并且通常建议在步长恒定时用于无信息搜索(也称为强力搜索)。
A* http://en.wikipedia.org/wiki/A*_search_algorithm
还有(非常受欢迎的)A*tree与搜索算法一起使用时,搜索算法可提供最佳解决方案可接受的启发式 http://en.wikipedia.org/wiki/Admissible_heuristic。 A*graph然而,搜索算法只有在与一致(或“单调”)启发式 http://en.wikipedia.org/wiki/Consistent_heuristic(比可受理性更严格的条件)。
(2) 伪代码的缺陷
为简单起见,所提供的代码不会: