图搜索和树搜索有什么区别?


Answers:


176

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

问题永远是图

树型搜索和图型搜索之间的区别并不基于问题图是树型图还是普通图型这一事实。始终假定您正在处理一般图形。区别在于用于搜索图的遍历模式,该遍历模式可以是图形或树形。

如果您正在处理树型问题,则两种算法变体都会得出相同的结果。因此,您可以选择较简单的树搜索变体。

图和树搜索之间的区别

您的基本图形搜索算法如下所示。在起始节点处start,有向边为as,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星搜索,依此类推。

上述算法实际上称为树搜索。如果有多个指向其的根源始于起始状态,它将多次访问基础问题图的状态。如果状态位于有向循环中,则甚至有可能无数次访问状态。但是每次访问都对应于由我们的搜索算法生成的树中的不同节点。有时需要这种明显的低效率,如后面所述。

图搜索

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

一个*

同样,(非常流行的)A * 搜索算法与可允许的启发式算法一起使用时,可以提供最佳解决方案。但是,A * 图形搜索算法仅在与一致(或“单调”)启发式(比可容许性更强的条件一起使用时才做出此保证。

(2)伪代码的缺陷

为简单起见,给出的代码没有:

  • 处理失败的搜索,即,只有找到解决方案,它才起作用

1
很好的答案!您能否详细说明树状问题的含义?另外,您如何建议存储算法为达到目标而不是完全遍历所经过的路径?
布莱恩(Brian)

1
@Brian树形问题意味着您正在搜索的图形是一棵树。关于第二个问题:这取决于问题。一种可行的方法是,如果可行,只需将到节点的路径与每个扩展节点一起存储。
ziggystar 2013年

5
更正式地说,树搜索可以多次访问“单一状态”,而不是节点。因为搜索树中的每个节点都对应于沿着状态空间图的单个路径,并且树搜索最多访问一次。(尽管对于深度不断增加的树遍历的迭代加深搜索而言,这不是正确的,但在这种情况下,每次迭代中每个节点也只会被访问一次)
Nader Ghanbari

1
@NaderhadjiGhanbari无论statenode对于的顶点更充分的潜在问题曲线图,而相比之下,遍历图形,取决于上下文。但是state,对于问题图顶点和node遍历图使用,可以绝对提高答案的清晰度。我会尽快改写。谢谢。
ziggystar

TL; DR:图搜索使用的是封闭数据结构,而树搜索未使用。
shinzou

7

树是图的一种特例,因此对一般图有效的方法对树均有效。树是在每对节点之间恰好有一条路径的图。这意味着它不包含任何循环,如先前的答案所述,但是没有循环的有向图(DAG,有向无环图)不一定是树。

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

对于有向图和无向图,无向图是有向图的一种特例,即遵循以下规则的情况:“如果存在从uv的边(链接,过渡),也有从vu的边。

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


嗯,问题的内容对我来说还不是很清楚,但是在看到你的答案@ziggystar之后再看一遍,我确实感觉到提到A *和AI表示你可能是对的,我的答案你离题了。我将“树搜索”解释为“搜索树”。不是“用树形遍历模式搜索一般图形”,这是您的答案所暗示的。
njlarsson

@njlarsson我的回答中已包含您的措辞。这对澄清很有帮助。
ziggystar 2013年

在答案中添加了对此的注释。我怀疑我的答案对许多通过Google等在这里找到自己的方式的人来说是正确的,即使这可能与Rayhanur Ra​​hman追求的背景无关。
njlarsson

我见过很多学生在研究搜索算法时遇到困难,而您的回答却误导了他们。
Nader Ghanbari

1
答案也与搜索算法有关,但确实这并非发布者所要求的。请参阅答案中的“更新” –我在2014年3月意识到自己误解了这个问题。我之所以不删除答案,是因为它对于通过搜索来到这里的人可能仍然有用。
njlarsson

3

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

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


3
除此之外,如果您确实有树,则无需在A *中进行重复检测。但是,您仍然需要一种提取最终路径的方法,因此您可能仍然有一个封闭列表。
内森·S。

一般而言,树是有向图,在任何两个顶点之间最多具有一条路径。也就是说,图和树之间有两个区别:有向和路径唯一性。在DAG上运行的算法无需检查周期,而在树上运行的算法则无需检查重复项。
thiton

1
术语各不相同,但并非总是将树木当做方向。对于有根的树,即当一个节点被指定为根时,存在隐含的方向,但树不必是有根的。同样,一般图形可以是有向的或无向的。此外,如果仅需要两个顶点之间的最多一条路径,则还包括forests。树通常被定义为一个连通图,即必须有精确地一条路径。
njlarsson

在图论中,这个答案更多地体现在树和图之间的差异上,但对于不同类型的搜索算法而言,并没有真正的区别。
mlibby

1

图形与树

  • 图有周期
  • 树木没有循环“例如,想象您头上的任何一棵树,分支没有与根的直接连接,但是分支与其他分支向上有连接”

但是在AI图搜索与树搜索的情况下

图搜索具有良好的属性,只要算法探索一个新节点并将其标记为已访问,“无论使用哪种算法”,该算法通常都会探索可从当前节点访问的所有其他节点。

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

AB,BC和CA,从C到A有一个循环,

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

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

考虑具有3个顶点的这棵树,并考虑以下边缘

A-B-C向下植根于A。假设我们正在使用DFS算法

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

但是,您是否注意到了一些问题,我们正在研究无方向的边缘,即AB与BA之间存在联系。当然,这不是一个循环,因为该循环意味着顶点必须> = 3,并且除了第一个和最后一个节点之外,所有顶点都是不同的。

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

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

最后,您可以实现树搜索算法,以防止两次浏览同一节点。但这有后果。


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

1

简而言之,树不包含循环,而图不包含循环。因此,当我们进行搜索时,我们应该避免图形中的循环,以免陷入无限循环。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.