我正在尝试使用BFS,同时尝试自学Python 3.目前我正试图从图表的开始到目标获取所有路径。
图表设置如下:
graph = {
A : [B, C],
B : [D, E],
C : [F],
F : [B]
}
所以,有一条从F到B的路径。我遇到的问题如下:由于某些节点设置为访问,因此算法不能再次运行它们。当然,我可以改变这一点,但后来我想知道什么是“停止'我应该使用的条件。
我的代码是这样的:
initial = A
goal = D
# So there are 2 routes:
# A -> C -> F -> B -> D
# A -> B -> D
frontier = queue.Queue()
frontier.put(initial)
backtracker = { }
paths = []
# until I find a halting condition.
while True:
node = frontier.get()
print('Popping: ' + node.name)
node.isOpen = False
if node in graph:
for child in graph[node]:
print('Expanding: ' + node.name + ' -> ' + child.name)
backtracker.update( { child : node } )
if child.name == goal.name:
path = backtrack(backtracker, initial, goal)
paths.append(path)
backtracker = {}
goal.isOpen = True
initial.isOpen = True
frontier = queue.Queue()
frontier.put(initial)
if child.isOpen:
print('Putting: ' + child.name)
frontier.put(child)
所以在这种情况下,路线A - > B - >找到D,但是这将B设置为关闭,因此算法不能再访问它以找到A - > C - > F - > B - > D.我开始在圈子里思考,所以任何提示(相当一个提示然后是一个完整的解决方案!!!)将非常感激。
让我们忽略像' A - >这样的情况。 C - > F - > B - > A - > C - > F - > B - > d'等等(这是不可能的,因为B没有路径 - >定义的A。)
答案 0 :(得分:1)
BFS尝试构建生成树。如果你想在这个过程中获得最短路径,你可以在第一次找到目标节点时停止 - 这是BFS的典型用例。
但是如果你想找到所有路径,我认为停止条件是你已经访问过所有节点的,所以生成树已经完成没有其他节点您可以从已访问过的节点进行访问。您无法提前停止,因为即使是您要访问的最后一个节点,也可能具有通向目标节点的单向边缘,从而显示新路径(尽管是最不理想的路径)。
在写上面的答案时,我可能只是部分理解了这个问题。如果您要求在最后生成路径,并给出类似
的配置 A--------->B-------->C
\ / \ /
\->D->/ \->E->/
你想找到所有的ABC,ADBC,ABEC和ADBEC,我想你需要以递归的方式对这个有效路径图进行完全遍历,一个DFS(仅在这个子图上,所有可能的尝试将生成有效的路径)。因此,BFS-pass可用于将原始图形缩减为仅包含实际(可能是冗余)路径的图形,但是需要DFS才能实际生成所有这些路径。