是否可以找到使用NetworkX制作的有向图(除去了自环)的前10条长路径?
到目前为止,我一直在尝试( cone 是带有自环的有向图)
cone.remove_edges_from(cone.selfloop_edges())
print nx.dag_longest_path(cone)
注意:在我使用的术语中,最长路径表示通过最大节点数的路径(不同于我们考虑边缘权重的标准定义)
答案 0 :(得分:1)
我可以想到两种态度:
第一个想法(找到所有路径,然后选择最长的路径)-这是一个简单的示例代码。这不是您可以获得的最佳效率,而只是一个示例-
import itertools
import networkx as nx
all_paths=[]
for (x,y) in itertools.combinations(DAG.nodes,2):
for path in nx.all_simple_paths(DAG,x,y):
all_paths.append(path)
all_paths.sort(key=len,reverse=True)
print all_paths[:10]
如果您想要一种更高效的解决方案,则可能应该使用DFS来获取图中的所有路径。例如,您可以看到一些想法here或here。
关于第二个选项(通过消除最长路径边缘来找到第二条最长路径),下面的代码演示了如何找到第二条最长路径:
longest_path = nx.dag_longest_path(DG)
print "longest path = " + longest_path
second_longest_paths = []
for i in range(len(longest_path) - 1):
edge = (longest_path[i], longest_path[i + 1])
DG.remove_edges_from([edge])
second_longest_paths.append(nx.dag_longest_path(DG))
DG.add_edges_from([edge])
second_longest_paths.sort(reverse=True, key=len)
print "second longest path = " + str(second_longest_paths[0])
但是我认为将其扩展到10条最长路径可能会有些棘手(可能涉及到我们刚刚执行的过程的递归操作,即在图形中找到第二条最长路径,并从级别2中消除了边缘...)。