Language agnostic 使用深度/广度优先/A*算法在图树中搜索

Language agnostic 使用深度/广度优先/A*算法在图树中搜索,language-agnostic,search,artificial-intelligence,a-star,Language Agnostic,Search,Artificial Intelligence,A Star,关于在图形/树中搜索,我有几个问题: 假设我有一个空棋盘,我想把一个棋子从a点移动到B点 A.当使用深度优先搜索或广度优先搜索时,我们必须使用开放列表和封闭列表吗?这是一个包含所有要检查的元素的列表,以及其他包含所有已检查的元素的列表?如果没有这些清单,是否有可能做到这一点?A*怎么样,它需要吗 B.使用列表时,在找到解决方案后,如何获得从a到B的状态序列?我假设当您在打开和关闭列表中有项目时,您的“扩展状态”不是(x,y)状态,而是(x,y,这个节点的父节点) 状态A有4种可能的移动(右、左、

关于在图形/树中搜索,我有几个问题:

假设我有一个空棋盘,我想把一个棋子从a点移动到B点

A.当使用深度优先搜索或广度优先搜索时,我们必须使用开放列表和封闭列表吗?这是一个包含所有要检查的元素的列表,以及其他包含所有已检查的元素的列表?如果没有这些清单,是否有可能做到这一点?A*怎么样,它需要吗

B.使用列表时,在找到解决方案后,如何获得从a到B的状态序列?我假设当您在打开和关闭列表中有项目时,您的“扩展状态”不是(x,y)状态,而是(x,y,这个节点的父节点)

状态A有4种可能的移动(右、左、上、下)。如果我像第一步一样向左移动,我应该让它在下一个状态中回到原始状态吗?这就是,做“正确”的动作吗?如果不是,我必须每次横穿搜索树检查我去过的州吗

当我在树上看到一个我已经去过的状态时,我是否应该忽略它,因为我知道这是一条死胡同?我想要做到这一点,我必须始终保留访问过的州的名单,对吗

搜索树和图之间有什么区别吗?它们只是以不同的方式看待同一事物吗?

A)可以避免打开/关闭列表-您可以尝试所有可能的路径,但这需要很长时间

B) 一旦达到目标,就可以使用此节点信息的父节点从目标“向后走”。从目标开始,得到它的父母,得到父母的父母,等等,直到你到达起点

C) 我认为这无关紧要——你所描述的步骤不可能导致更短的路径(除非你的步骤具有负权重,在这种情况下你不能使用Dijkstra/a*)。在我的A*代码中,我检查这个案例并忽略它,但做任何最容易编码的事情

D) 这取决于-我相信Dijkstra永远不会重新打开同一个节点(有人能纠正我吗?)。A*绝对可以重新访问一个节点-如果您找到一条到同一节点的较短路径,您将保留该路径,否则将忽略它

E) 不确定,我自己从来没有专门为树木做过任何事情

这里有一个很好的a*介绍:
这涵盖了很多关于如何实现开放集、选择启发式等的细节。

a.开放列表和封闭列表是常见的实现细节,而不是算法本身的一部分。通常在没有这两种方法的情况下进行深度优先树搜索,例如,标准方法是递归遍历树

B.典型的做法是确保节点引用以前的节点,从而允许按照反向链接重建计划。或者,到目前为止,您只需将整个解决方案存储在每个候选方案中,尽管将其称为节点会产生误导

C.我假设向左移动,然后向右移动,会使你进入一个等价的状态——在这种情况下,你已经探索了原始状态,它会在封闭列表中,因此不应该被放回开放列表中。您不会每次都遍历搜索树,因为您保留了一个封闭的列表(通常实现为O(1)结构),正是为了知道哪些状态已经被完全检查过。请注意,您不能总是假设处于同一位置与处于同一状态是相同的-对于大多数游戏路径查找目的而言,它是相同的,但对于一般目的搜索,它不是

是的,访问过的州的列表就是你所说的封闭列表。您还需要检查打开列表,以确保您不打算对给定状态进行两次检查。您不需要搜索任何这样的树,因为您通常将这些内容存储在线性结构中。该算法作为一个整体在搜索一棵树(或一个图),它生成一棵树(由代表状态空间的节点组成),但在算法中的任何一点上都不会显式搜索树结构

树是一种没有圈的图。因此,您可以使用相同的图形搜索过程进行搜索。生成一个树结构是很常见的,它通过图形表示您的搜索,它由每个节点到搜索中前面/生成它的节点的向后链接隐式表示。(尽管如果你在每个州都保留整个计划,那么就不会有树,只有部分解决方案的列表。)

A.使用深度优先搜索或 广度优先搜索我们必须使用开放式搜索吗 还有封闭列表

使用DFS,您肯定需要至少存储当前路径。否则,您将无法回溯。如果决定维护所有已访问(关闭)节点的列表,则可以检测并避免循环(多次扩展同一节点)。另一方面,您不再具有DFS的空间效率。没有封闭列表的DFS只需要与搜索空间深度成比例的空间

对于BFS,您需要维护一个开放列表(有时称为边缘)。否则,该算法根本无法工作。当您另外维护一个关闭列表时,您将(再次)能够检测/避免周期。有了BFS,封闭列表的额外空间可能不会那么糟糕,因为你无论如何都要维护边缘。条纹大小和闭合列表大小之间的关系强烈依赖于搜索空间的结构,因此这里必须考虑这一点。例如,对于2的分支因子,两个列表的大小相同,与它的好处相比,关闭列表的影响似乎不是很坏

A*怎么样,它需要吗

A*,因为它可以被视为某种特殊(知情)类型的BFS,需要开放列表。省略封闭列表比使用BFS更微妙;也德