我能想到两种方法:
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以获取图中的所有路径。例如,您可以在
这里或
这里看到一些想法。
关于第二个选项(使用最长路径边缘消除找到第二长的路径),这里有一个演示如何找到第二长路径的代码:
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级删除的边的图中的第二长路径...)。
dag_longest_path
的代码片段似乎是这样)?请注意,如果图形具有循环,则无法对顶点进行拓扑排序,因此我不确定您打算如何删除循环(这意味着可能性很大,但有几种方法可以做到这一点)。 - Anthony Labarre