图搜索和树搜索有啥区别?

Posted

技术标签:

【中文标题】图搜索和树搜索有啥区别?【英文标题】:What is the difference between graph search and tree search?图搜索和树搜索有什么区别? 【发布时间】:2012-05-27 15:42:06 【问题描述】:

图搜索树搜索版本在人工智能中的DFS、A*搜索有什么区别?

【问题讨论】:

【参考方案1】:

图和树之间的唯一区别是循环。图可能包含循环,树不能。因此,当您要在树上实现搜索算法时,您不需要考虑循环的存在,但是在处理任意图时,您需要考虑它们。如果不处理循环,算法最终可能会陷入无限循环或无限递归。

要考虑的另一点是您正在处理的图形的方向属性。在大多数情况下,我们处理代表每个边缘的父子关系的树。 DAG(有向无环图)也显示出类似的特征。但是双向图是不同的。双向图中的每条边代表两个邻居。所以这两种图的算法方法应该会有所不同。

【讨论】:

补充一点,如果你真的有树,你不需要在A*中做重复检测。不过,您仍然需要一种方法来提取最终路径,因此您可能仍然有一个封闭的列表。 在正常情况下,树是一个有向图,在任意两个顶点之间最多有一条路径。也就是说,图和树之间有两个的区别:有向和路径唯一性。处理 DAG 的算法不需要检查循环,处理树的算法不需要检查重复项。 术语不同,但树并不总是被认为是定向的。对于有根树,即当一个节点被指定为根时,有一个隐含的方向,但树不必有根。此外,一般图可以是有向图或无向图。此外,如果您只要求最多两个顶点之间的一条路径,则还包括森林。一棵树通常被定义为一个连通图,即必须精确地有一条路径。 这个答案在图论中树和图之间的区别更多,但对于不同类型的搜索算法却并非如此。【参考方案2】:

树是图的一个特例,所以任何适用于一般图的东西都适用于树。树是一个图,其中每对节点之间恰好有一条路径。这意味着它不包含任何循环,如先前的答案所述,但是没有循环的有向图(DAG,有向无环图)不一定是树。

但是,如果您知道您的图表有一些限制,例如如果它是树或 DAG,通常可以找到比无限制图更有效的搜索算法。例如,在树上使用 A* 或其非启发式对应物“Dijkstra 算法”可能没有多大意义(无论如何只有一个路径可供选择,您可以通过 DFS 或 BFS 找到)或在一个有向无环图中(可以通过按照拓扑排序获得的顺序考虑顶点来找到最优路径)。

对于有向图与无向图,无向图是有向图的一种特殊情况,即遵循“如果存在从u到v 从 vu 还有一条边。

更新:请注意,如果您关心的是搜索的遍历模式,而不是图本身的结构,那么这不是答案。参见,例如,@ziggystar 的回答。

【讨论】:

嗯,这个问题的上下文我不是很清楚,但是看到你的答案后再次看,@ziggystar,我确实感觉提到A*和AI表明你可能是对的,我的回答断章取义。我将“树搜索”解释为“搜索树”。不是“使用树形遍历模式搜索一般图”,这就是您的答案所暗示的。 @njlarsson 我已将您的改写包含在我的回答中。这有助于澄清。 在答案中添加了一个注释。我怀疑我的答案对于许多通过谷歌等找到自己的方式的人来说是正确的,即使它可能与 Rayhanur Ra​​hman 所追求的内容无关。 我看到很多学生在学习搜索算法时遇到困难,而你的回答只会误导他们。 答案也与搜索算法有关,但确实不是发帖人所问的。请参阅答案中的“更新”——我在 2014 年 3 月意识到我误解了这个问题。我不删除答案的原因是它可能对通过搜索来到这里的人仍然有用。【参考方案3】:

从现有的答案来看,这个概念似乎有很多混淆。

问题始终是图表

树搜索和图搜索之间的区别并不在于问题图是树还是一般图这一事实。总是假设您正在处理一般图表。区别在于遍历模式是用来搜索图的,可以是图形也可以是树形。

如果您处理的是树形问题,两种算法变体都会产生相同的结果。因此,您可以选择更简单的树搜索变体。

图搜索和树搜索的区别

您的基本图形搜索算法如下所示。使用起始节点start,定向边为successors,并在循环条件中使用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-star搜索,等等。

上述算法实际上称为树搜索。如果在起始状态中有多个指向它的有向路径,它将多次访问底层问题图的状态。如果它位于有向循环上,甚至可以无限次访问一个状态。但是每次访问都对应于我们的搜索算法生成的树中的不同节点。有时需要这种明显的低效率,稍后会解释。

图表搜索

正如我们所见,树搜索可以多次访问一个状态。因此,它将多次探索在此状态之后找到的“子树”,这可能会很昂贵。图搜索通过跟踪封闭列表中的所有访问状态来解决此问题。如果新找到的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 的方法可以保证返回最优解——即最短路径或具有最小成本的路径(对于带有附加到边的成本的图) .只要节点按成本增加的顺序扩展,或者成本是非零正常数,这基本上就成立。实现这种选择的常用算法是uniform cost search,或者如果步骤成本相同,则为BFS 或IDDFS。 IDDFS 避免了 BFS 的大量内存消耗,并且通常建议在步长不变时用于不知情的搜索(也称为蛮力)。

A*

当与admissible heuristic 一起使用时,(非常流行的)A* 搜索算法提供了最佳解决方案。然而,A* graph 搜索算法仅在与 consistent (or "monotonic") heuristic 一起使用时才做出此保证(比可接纳性更强的条件)。

(2)伪代码缺陷

为简单起见,提供的代码没有:

处理失败的搜索,即仅在找到解决方案时才有效

【讨论】:

不错的详尽答案!您能否详细说明 树形问题 的含义?另外,您如何建议存储算法所经过的路径以达到目标,而不是完整的遍历? @Brian 树形问题意味着您正在搜索的图形是一棵树。对于您的第二个问题:这取决于问题。如果可行,一种可能性是简单地将节点的路径与每个扩展节点一起存储。 更正式的说法是,树搜索可以多次访问“单一状态”,而不是节点。因为搜索树中的每个节点都对应于状态空间图上的一条路径,并且树搜索最多访问一次。 (尽管对于遍历深度限制增加的树的迭代深化搜索来说这不是真的,但在这种情况下,在每次迭代中每个节点只被访问一次) @NaderhadjiGhanbari 与遍历图相比,statenode 是否更适合底层 问题图的顶点,取决于上下文。但是将state 用于问题图顶点,将node 用于遍历图,无疑可以提高答案的清晰度。我会尽快重写它。谢谢。 @berimbolo 是的,这是可能的。请注意,您可以通过更改一些小事实来创建这些算法的许多不同变体。就像通过将开放列表视为有限封闭列表来使树搜索的行为有点像图搜索。并非所有这些调整都有名称。【参考方案4】:

图形与树

图表有循环 树没有循环“例如,想象一下你头脑中的任何一棵树,分支与根没有直接连接,但分支与其他分支有向上的连接”

但在 AI Graph-search vs Tree-search 的情况下

图搜索有一个很好的特性,即每当算法探索一个新节点并将其标记为已访问时,“无论使用何种算法”,该算法通常都会探索从当前节点可到达的所有其他节点。

例如考虑以下具有 3 个顶点 A B 和 C 的图,并考虑以下边

A-B、B-C、C-A,嗯,从C到A有一个循环,

当从 A 开始进行 DFS 时,A 会生成一个新的状态 B,B 会生成一个新的状态 C,但是当探索 C 时,算法会尝试生成一个新的状态 A,但 A 已经被访问过,因此它会被忽略。酷!

但是树呢?好树算法不会将访问节点标记为已访问,但树没有循环,它如何进入无限循环?

考虑这棵树有 3 个顶点并考虑以下边

A - B - C 以 A 为根,向下。假设我们使用的是 DFS 算法

A 会产生一个新的状态 B,B 会产生两个状态 A 和 C,因为 Trees 没有“标记一个节点是否已被探索”,因此 DFS 算法可能会再次探索 A,从而产生一个新的状态B,因此我们陷入了无限循环。

但是您注意到了吗,我们正在研究无向边,即 A-B 和 B-A 之间存在连接。当然这不是一个循环,因为循环意味着顶点必须 >= 3 并且所有顶点都是不同的,除了第一个和最后一个节点。

ST A->B->A->B->A 它不是一个循环,因为它违反了循环属性 >= 3。但实际上 A->B->C->A 是一个循环 >= 3 不同节点检查,第一个和最后一个节点是相同的检查。

再次考虑树的边缘,A->B->C->B->A,当然它不是一个循环,因为有两个 B,这意味着并非所有节点都是不同的。

最后,您可以实现树搜索算法,以防止对同一节点进行两次探索。但这会产生后果。

【讨论】:

这个答案令人困惑,因为它似乎将问题是树还是图的情况与搜索算法本身在搜索过程中使用树还是图混合在一起。【参考方案5】:

简单来说,树不包含循环,而图形可以包含在哪里。所以当我们进行搜索时,我们应该避免在图中出现循环,以免陷入无限循环。

另一方面,树通常具有某种拓扑排序或类似于二叉搜索树的属性,与图相比,这使得搜索变得如此快速和容易。

【讨论】:

【参考方案6】:

您可以查看slide 13 的伪代码。

【讨论】:

【参考方案7】:

我将添加到@ziggystar 的答案(其他答案将树和图之间的差异称为数据结构,这不是问题所在,问题是指用于遍历您的 tree VS graph 算法图表!)。

这个有点令人困惑的术语来自 Russell 和 Norvig 的Artificial Intelligence A Modern Approach”:

树搜索算法 - 是用于解决搜索问题的任何特定算法。图形搜索算法 - 是一种树搜索算法 增加了一组探索状态

这两种算法都表示为一棵树!我们将 Graph-Search algorithm 称为 Graph-Search 算法的原因是因为它可以直接在我们的搜索问题的图上表示(再次 - 作为树)。 p>


看看罗马尼亚的地图。这是我们的搜索问题的图表。

现在,我们可以应用许多算法来找到从阿拉德到布加勒斯特的路径(广度优先搜索、深度优先搜索、贪婪搜索 - 任何我们内心想要的)。然而,所有这些算法都可以分为Tree-Search算法Graph-Search算法

树搜索算法将我们的 Arad-to-Bucharest 问题的解决方案表示为一棵树。注意重复的“Arad”节点。

图形搜索算法也将我们的 Arad-to-Bucharest 问题的解决方案表示为一棵树 - 除了我们从树中删除重复的“Arad”节点。 但是,由于删除了重复状态,我们有了更好的表示方式 - 直接在我们的搜索问题的图表上,在罗马尼亚的地图上!因此,“图搜索算法”中的“图”。


这里有一些伪代码。请注意,Tree-Search 算法和 Graph-Search 算法的唯一区别是增加了探索状态集。

【讨论】:

以上是关于图搜索和树搜索有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

爬山搜索和最佳优先搜索有啥区别?

线性搜索和二分搜索有啥区别?

pip搜索和conda搜索有啥区别[重复]

交叉验证和网格搜索有啥区别?

基本算法——深度优先搜索(DFS)和广度优先搜索(BFS)

!= null 和 !== null 有啥区别? [复制]