我正在使用递归来查找从某个点 A 到某个点 D 的路径。我正在遍历一个图来查找路径。
让我们说:
图 = {'A':['route1','route2'],'B':['route1','route2','route3','route4'],'C':['route3','route4 '], 'D':['route4'] }
可通过以下方式访问:
A -> 路线 1,路线 2
B -> 路线 2、路线 3、路线 4
C -> 路线 3,路线 4
从 A -> D 的这条路径有两种解决方案:
路线1->路线2->路线4
路线1 -> 路线2 -> 路线3 -> 路线4
由于 B 点和 A 点都有路线 1 和路线 2。有一个无限循环,所以每当我访问节点(0 或 1 个值)时,我都会添加一个检查。
但是通过检查,我只得到一个解决方案:route1 -> route2 -> route4,而不是其他可能的解决方案。
这是实际的编码:路由将被反应取代。
def find_all_paths(graph,start, end, addReaction, passed = {}, reaction = [] ,path=[]):
passOver = passed
path = path + [start]
reaction = reaction + [addReaction]
if start == end:
return [reaction]
if not graph.has_key(start):
return []
paths=[]
reactions=[]
for x in range (len(graph[start])):
for y in range (len(graph)):
for z in range (len(graph.values()[y])):
if (graph[start][x] == graph.values()[y][z]):
if passOver.values()[y][z] < 161 :
passOver.values()[y][z] = passOver.values()[y][z] + 1
if (graph.keys()[y] not in path):
newpaths = find_all_paths(graph, (graph.keys()[y]), end, graph.values()[y][z], passOver , reaction, path)
for newpath in newpaths:
reactions.append(newpath)
return reactions
这是方法调用: dic_passOver 是一个字典,用于跟踪节点是否被访问
solution = (find_all_paths( graph, "M_glc_DASH_D_c', 'M_pyr_c', 'begin', dic_passOver ))
我的问题似乎是,一旦访问了一条路线,就无法再访问了,所以其他可能的解决方案是不可能的。我通过在 161 处添加最大递归量来解决此问题,在该处为我的特定代码找到所有可能的路线。
if passOver.values()[y][z] < 161 :
passOver.values()[y][z] = passOver.values()[y][z] + 1
但是,这似乎效率很低,而且我的大部分数据都是带有数千个索引的图表。此外,我不知道允许的节点访问量以找到所有路线。数字 161 是手动计算出来的。