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