Graph 广度优先搜索和图中的*搜索?

Graph 广度优先搜索和图中的*搜索?,graph,a-star,breadth-first-search,Graph,A Star,Breadth First Search,我知道如何在树结构中使用广度优先搜索和a*,但给出下图,它将如何实现?换句话说,搜索将如何遍历图形?S是开始状态 这和在树上做完全一样。您只需要以某种方式跟踪您已经访问过的节点,这样您就不会以循环结束。这与在树中执行完全相同。你只需要以某种方式跟踪你已经访问过的节点,这样你就不会陷入循环。基本上,你对待图形的方式与对待树的方式相同,只是你需要跟踪你已经访问过的节点。这对BFS来说很好。除此之外,在A*的情况下,考虑当你重新访问一个节点,但找到了一条更便宜的路由时,你会做什么。 基本上,你用与对待

我知道如何在树结构中使用广度优先搜索和a*,但给出下图,它将如何实现?换句话说,搜索将如何遍历图形?S是开始状态


这和在树上做完全一样。您只需要以某种方式跟踪您已经访问过的节点,这样您就不会以循环结束。

这与在树中执行完全相同。你只需要以某种方式跟踪你已经访问过的节点,这样你就不会陷入循环。

基本上,你对待图形的方式与对待树的方式相同,只是你需要跟踪你已经访问过的节点。这对BFS来说很好。除此之外,在A*的情况下,考虑当你重新访问一个节点,但找到了一条更便宜的路由时,你会做什么。

基本上,你用与对待树相同的方式对待一个图表,除了你需要跟踪你已经访问过的节点。这对BFS来说很好。除此之外,在A*的情况下,考虑当你重新访问一个节点,但找到了一条更便宜的路由时,你会做什么。< /P> < P>绘制图-递归地搜索每个节点,并将访问的节点标记为脏。仅当图形不脏时才递归


如果内存不是问题,请复制图形,而不是标记节点,将其从复制图形中删除。

绘制图形-递归搜索每个节点,并将您访问的节点标记为脏节点。仅当图形不脏时才递归


如果内存不是问题,请复制图形,而不是标记节点,将它们从复制图形中删除。

这是加权图形。您想找到最短路径还是只需遍历它? 如果您只想遍历,请参见:

1) there is only S in the queue 2) we are adding C and A in the queue, only they are reachable from S directly (with one edge) 3) D, G2 - from C 4) B, E - from A 5) G1 - from D (G2 is already in the queue) 6) there no outgoing edge from G2 7) there's no adjacent nodes of B which aren't already in the queue 1) 队列中只有个 2) 我们正在队列中添加C和A,只有它们可以从S直接访问(有一条边) 3) D,G2-来自C 4) B,E-来自A 5) G1-来自D(G2已在队列中) 6) G2没有传出边 7) 没有B的相邻节点不在队列中
下面是在队列中添加节点的顺序:s、C、A、D、G2、B、E、G1

这是加权图。您想找到最短路径还是只需遍历它? 如果您只想遍历,请参见:

1) there is only S in the queue 2) we are adding C and A in the queue, only they are reachable from S directly (with one edge) 3) D, G2 - from C 4) B, E - from A 5) G1 - from D (G2 is already in the queue) 6) there no outgoing edge from G2 7) there's no adjacent nodes of B which aren't already in the queue 1) 队列中只有个 2) 我们正在队列中添加C和A,只有它们可以从S直接访问(有一条边) 3) D,G2-来自C 4) B,E-来自A 5) G1-来自D(G2已在队列中) 6) G2没有传出边 7) 没有B的相邻节点不在队列中
下面是在队列中添加节点的顺序:s、C、A、D、G2、B、E、G1

我不知道这会有多大帮助,但这里有一个完整的解决方案,用函数式语言J编写(可从jsoftware.com免费获得)

首先,直接从图片中显示的图形表示进行操作可能是最简单的。我将其表示为一个(#nodes)x(#nodes)表,其中(I,j)处的数字表示node-I和node-j之间的链接值。另外,沿着对角线,我放置了与每个节点本身相关的数字

因此,我输入以下内容-不要太担心不熟悉的符号,您很快就会看到结果:

     grph=: <;.1&>TAB,&.><;._2 ] 0 : 0
    A   B   C   D   E   G1  G2  S
A   2   1           8           2
B       1   1   1       4       2
C       3   1               5   
D               1       5   2   
E                   6   9   7   
G1                      0       
G2                          0   
S   2       3                   5
)
它看起来不错,很容易将其与图表的图片进行比较以进行检查。 现在我将删除第一行和第一列,这样我们只剩下数字(作为装箱文本), 并删除所有无关的制表符

   grn=. TAB-.~&.>}.}."1 grph
您可以看到我将此结果分配给变量“grn”

下一步,我将用表示无穷大的“3;”替换任何空单元格,然后将文字转换为数字表示(将结果重新分配给相同的名称“grn”):

所以,现在我有了一个简单的8x8数字表来表示图形,遍历它就很简单了

这里有一个名为“traverseGraph”的简单J函数,用于读取此表,遍历它所表示的图形,并返回两个结果:所访问节点的索引(基于0的原点),以及按访问顺序的点和边的值

traverseGraph=: 3 : 0
   pts=. ,_-.~,ix{y [ nxt=. ix=. ,0
   while. 0~:#nxt=. ~.ix-.~;([:I._~:])&.><"1 nxt{y do.
        ix=. ix,nxt [ pts=. pts,_-.~,nxt{y
   end.
   ix;pts
)
因此,第一个框包含以“0”开头、以“6”结尾的索引。第二个装箱项是点值的向量,按我们累加的顺序排列。我不知道你用这些做什么,所以我只是给他们看看

我们可以使用索引显示节点名称,如下所示:

   0 1 3 2 5 7 4 6{(<"0'SABCDE'),'G1';'G2'
+-+-+-+-+-+--+-+--+
|S|A|C|B|E|G2|D|G1|
+-+-+-+-+-+--+-+--+

01325746{(我不知道这对你有多大帮助,但这里有一个用函数式语言J编写的完整解决方案(可从jsoftware.com免费获得)

首先,可能最简单的方法是直接从图片中显示的图形表示法开始工作。我将其表示为一个(#nodes)x(#nodes)表,表中的数字为(I,j),表示node-I和node-j之间的链接值。此外,沿着对角线,我放置了与每个节点本身相关的数字

因此,我输入以下内容-不要太担心不熟悉的符号,您很快就会看到结果:

     grph=: <;.1&>TAB,&.><;._2 ] 0 : 0
    A   B   C   D   E   G1  G2  S
A   2   1           8           2
B       1   1   1       4       2
C       3   1               5   
D               1       5   2   
E                   6   9   7   
G1                      0       
G2                          0   
S   2       3                   5
)
它看起来不错,很容易将其与图表的图片进行比较以进行检查。 现在我将删除第一行和第一列,这样我们只剩下数字(作为装箱文本), 并删除所有无关的制表符

   grn=. TAB-.~&.>}.}."1 grph
您可以看到我将此结果分配给变量“grn”

下一步,我将用表示无穷大的“3;”替换任何空单元格,然后将文字转换为数字表示(将结果重新分配给相同的名称“grn”):

所以,现在我有了一个简单的8x8数字表来表示图形,遍历它就很简单了

这里有一个名为“traverseGraph”的简单J函数,用于读取此表,遍历它所表示的图形,并返回两个结果:所访问节点的索引(基于0的原点),以及按访问顺序的点和边的值

traverseGraph=: 3 : 0
   pts=. ,_-.~,ix{y [ nxt=. ix=. ,0
   while. 0~:#nxt=. ~.ix-.~;([:I._~:])&.><"1 nxt{y do.
        ix=. ix,nxt [ pts=. pts,_-.~,nxt{y
   end.
   ix;pts
)
因此,第一个框包含以“0”开头的索引