关于人工智能中的 DFS,A *搜索,图搜索和树搜索版本之间有何区别?
关于人工智能中的 DFS,A *搜索,图搜索和树搜索版本之间有何区别?
Answers:
从现有的答案来看,这个概念似乎有很多困惑。
树型搜索和图型搜索之间的区别并不基于问题图是树型图还是普通图型这一事实。始终假定您正在处理一般图形。区别在于用于搜索图的遍历模式,该遍历模式可以是图形或树形。
如果您正在处理树型问题,则两种算法变体都会得出相同的结果。因此,您可以选择较简单的树搜索变体。
您的基本图形搜索算法如下所示。在起始节点处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
可以保证返回最佳解决方案-即最短路径或成本最小的路径(对于将成本附加到边的图形)。只要按成本增加顺序扩展节点,或者当成本为非零正常数时,这基本上成立。实现这种选择的常见算法是统一成本搜索,或者如果步骤成本相同,则为BFS或IDDFS。IDDFS避免了BFS的大量内存消耗,并且通常建议在步长不变的情况下进行不知情的搜索(即蛮力)。
同样,(非常流行的)A * 树搜索算法与可允许的启发式算法一起使用时,可以提供最佳解决方案。但是,A * 图形搜索算法仅在与一致(或“单调”)启发式(比可容许性更强的条件)一起使用时才做出此保证。
为简单起见,给出的代码没有:
state
或node
对于的顶点更充分的潜在问题曲线图,而相比之下,遍历图形,取决于上下文。但是state
,对于问题图顶点和node
遍历图使用,可以绝对提高答案的清晰度。我会尽快改写。谢谢。
树是图的一种特例,因此对一般图有效的方法对树均有效。树是在每对节点之间恰好有一条路径的图。这意味着它不包含任何循环,如先前的答案所述,但是没有循环的有向图(DAG,有向无环图)不一定是树。
但是,如果您知道自己的图有一些限制,例如它是树或DAG,则通常可以找到比无限制图更有效的搜索算法。例如,在一棵树上使用A *或其非启发式对应的“ Dijkstra算法”可能没有多大意义(无论如何,只有一条路径可供选择,您可以通过DFS或BFS找到该路径)或在DAG上(可以通过按照拓扑排序获得的顺序考虑顶点来找到最佳路径)。
对于有向图和无向图,无向图是有向图的一种特例,即遵循以下规则的情况:“如果存在从u到v的边(链接,过渡),也有从v到u的边。
更新:请注意,如果您关心的是搜索的遍历模式,而不是图形本身的结构,则这不是答案。参见,例如,@ ziggystar的答案。
图和树之间的唯一区别是循环。图可能包含循环,而树则不能。因此,当您要在树上实现搜索算法时,无需考虑循环的存在,但是在处理任意图时,则需要考虑它们。如果不处理这些循环,该算法最终可能陷入无限循环或无限递归。
需要考虑的另一点是要处理的图形的方向属性。在大多数情况下,我们处理的树代表每个边缘的父子关系。DAG(有向无环图)也显示了相似的特征。但是双向图是不同的。双向图中的每个边代表两个邻居。因此,对于这两种图形,算法方法应该有所不同。
图形与树
但是在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,这意味着并非所有节点都是不同的。
最后,您可以实现树搜索算法,以防止两次浏览同一节点。但这有后果。