我正在处理一个(数量)有向图,其中有no个循环,我需要找到任意两个节点之间的所有简单路径。一般来说,我不会担心执行时间,但我必须在非常多的时间步中对很多节点执行此操作—我正在处理基于时间的模拟。在
我过去曾尝试过NetworkX提供的设施,但总的来说,我发现它们比我的方法慢。不知道最近有没有什么变化。在
我实现了这个递归函数:import timeit
def all_simple_paths(adjlist, start, end, path):
path = path + [start]
if start == end:
return [path]
paths = []
for child in adjlist[start]:
if child not in path:
child_paths = all_simple_paths(adjlist, child, end, path)
paths.extend(child_paths)
return paths
fid = open('digraph.txt', 'rt')
adjlist = eval(fid.read().strip())
number = 1000
stmnt = 'all_simple_paths(adjlist, 166, 180, [])'
setup = 'from __main__ import all_simple_paths, adjlist'
elapsed = timeit.timeit(stmnt, setup=setup, number=number)/number
print 'Elapsed: %0.2f ms'%(1000*elapsed)
在我的计算机上,每次迭代的平均时间是1.5毫秒。我知道这是个小数目,但我必须做很多次这个手术。在
如果您感兴趣,我已经上传了一个包含邻接列表的小文件:
我使用邻接列表作为输入,来自NetworkX有向图表示。在
对算法的任何改进建议(例如,它是否必须是递归的?)或者我可以尝试的其他方法是非常受欢迎的。在
谢谢。在
安德里亚。在