如何使用Python NetworkX在有向图中找到最长的10条路径?

时间:2019-03-20 13:25:15

标签: python networkx

是否可以找到使用NetworkX制作的有向图(除去了自环)的前10条长路径?

到目前为止,我一直在尝试( cone 是带有自环的有向图)

cone.remove_edges_from(cone.selfloop_edges())    
print nx.dag_longest_path(cone)

注意:在我使用的术语中,最长路径表示通过最大节点数的路径(不同于我们考虑边缘权重的标准定义)

1 个答案:

答案 0 :(得分:1)

我可以想到两种态度:

  1. 找到图中的所有路径,按长度排序并采用10个最长的路径
  2. 找到最长的路径,然后每次删除其中的一条边,然后在其余图形中找到最长的路径。如果使用所有边缘进行此操作,并从所有尝试中走最长路径,则应获得原始图中第二个最长的图形。 (将其扩展到10可能不是很有效,但是应该可以)

第一个想法(找到所有路径,然后选择最长的路径)-这是一个简单的示例代码。这不是您可以获得的最佳效率,而只是一个示例-

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来获取图中的所有路径。例如,您可以看到一些想法herehere

关于第二个选项(通过消除最长路径边缘来找到第二条最长路径),下面的代码演示了如何找到第二条最长路径:

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中消除了边缘...)。