图搜索和树搜索版本之间有什么区别DFS,A *搜索人工智能?
答案 0 :(得分:158)
从现有的答案来看,似乎对这个概念存在很多困惑。
树搜索和图搜索之间的区别并不在于问题图是树还是普通图的事实。总是假设您正在处理一般图表。区别在于遍历模式,用于搜索图形,可以是图形或树形。
如果您正在处理树形问题,则两种算法变体都会产生相同的结果。因此,您可以选择更简单的树搜索变体。
您的基本图搜索算法如下所示。使用起始节点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 * 图搜索算法仅在与consistent (or "monotonic") heuristic一起使用时才具有此保证(条件比可接受性更强)。
为简单起见,所提供的代码不会:
答案 1 :(得分:5)
树是图形的特例,因此适用于一般图形的树适用于树。树是一个图,其中每对节点之间只有一条路径。这意味着它不包含任何周期,如前面的答案所述,但是没有周期的有向图(DAG,有向非循环图)不一定是树。
但是,如果您知道图表有一些限制,例如它是树或DAG,您通常可以找到比非限制图更高效的搜索算法。例如,在一棵树上使用A *或其非启发式对应物“Dijkstra算法”可能没有多大意义(无论如何只有一条路可供选择,您可以通过DFS或BFS找到)或在DAG上(通过考虑拓扑排序获得的顺序可以找到最佳路径)。
对于有向vs无向,无向图是有向图的一种特殊情况,即遵循规则的情况“如果存在从 u 到<的边缘(链接,转换) em> v 还有 v 到 u 的边缘。
更新:请注意,如果您关心的是搜索的遍历模式而不是图表本身的结构,那么这不是答案。参见,例如@ ziggystar的回答。
答案 2 :(得分:2)
图形和树之间的唯一区别是循环。图表可能包含循环,树不能。因此,当您要在树上实现搜索算法时,您不需要考虑周期的存在,但在使用任意图时,您需要考虑它们。如果你不处理循环,算法最终可能会陷入无限循环或无限递归。
要考虑的另一点是您正在处理的图形的方向属性。在大多数情况下,我们处理代表每个边缘的父子关系的树。 DAG(有向无环图)也显示出类似的特征。但是双向图表是不同的。双向图中的每个边表示两个邻居。因此,对于这两种类型的图,算法方法应该有所不同。
答案 3 :(得分:1)
简单来说,树不包含循环以及图形可以包含的位置。因此,当我们进行搜索时,我们应该避免图形中的循环,这样我们就不会进入无限循环。
另一个方面是树通常会有某种拓扑排序或像二叉搜索树这样的属性,这使得搜索与图形相比变得如此快速和简单。
答案 4 :(得分:0)
GRAPH VS TREE
但是在AI Graph-search vs Tree-search
的情况下图搜索具有良好的属性,只要算法探索新节点并将其标记为已访问,“无论使用何种算法”,该算法通常会探索从当前节点可到达的所有其他节点。
例如,考虑以下带有3个顶点A B和C的图形,并考虑以下边缘
A-B,B-C和C-A,从C到A有一个循环,
当DFS从A开始,A将生成新状态B时,B将生成新状态C,但是当探索C时,算法将尝试生成新状态A但是A已经被访问因此它将被忽略了。酷!
但树怎么样?井树算法不会将访问节点标记为已访问,但树没有循环,它将如何进入无限循环?
考虑具有3个顶点的树,并考虑以下边
< - > A - B - C根据A向下,向下。我们假设我们正在使用DFS算法A将生成新状态B,B将生成两个状态A&amp; C,因为树没有“如果它被探索就标记一个访问过的节点”,因此DFS算法可能会再次探索A,从而生成一个新的状态B,因此我们进入一个无限循环。
但是你注意到了什么,我们正在研究无向边缘,即A-B和B-A之间存在联系。当然,这不是一个循环,因为循环意味着顶点必须> = 3并且除了第一个和最后一个节点之外所有顶点都是不同的。
ST A-> B-> A-> B-> A它不是循环,因为它违反了循环特性> = 3.但实际上A-> B-> C->。 A是一个循环&gt; = 3个不同的节点Checked,第一个和最后一个节点是相同的Checked。
再次考虑树边缘,A-> B-> C-> B-> A,当然它不是循环,因为有两个B,这意味着并非所有节点都是不同的。
最后,您可以实现树搜索算法,以防止两次探索同一节点。但这会产生后果。
答案 5 :(得分:0)
您可以检查 slide 13 以获取伪代码。