Calculate the longest path between two nodes NetworkX
我正在尝试使用Networkx制作甘特甜菜。网络中的所有节点都是"任务",需要执行这些任务才能完成项目。使用Networkx,可以轻松计算项目的总时间。但是让甘特甜菜我需要每个节点的最新开始。
NetworkX包含一个函数(dag_longest_path_length),但这会计算出整个网络中的最长路径。另一个函数(astar_path_length)导致源和节点之间的路径最短,但是没有可用的函数给出了最长的路径,或者在我的情况下是最新的开始。 (如果一个节点作为两个先前节点,它将采用最快的路径,但实际上,它还必须等待第二个节点才能启动。
我在想一个选择。
评估先前连接的节点并选择最长路径。非正式的我没有成功。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | start_time=[] time=0 DD=nx.DiGraph() for i in range(df.shape[0]): DD.add_edge(str(df.at[i,'blockT'])+'_'+df.at[i,'Task'], str(df.at[i,'blockS'])+'_'+df.at[i,'Succ'], weight=df.at[i,'duration']) fig, ax = plt.subplots() labels=[] for i in range(df.shape[0]): labels.append(str(df.at[i,'blockT'])+'_'+df.at[i,'Task']) print(nx.astar_path_length(DD, '0_START', str(df.at[i,'blockT'])+'_'+df.at[i,'Task']) ) ax.broken_barh([(nx.astar_path_length(DD, '0_START', str(df.at[i,'blockT'])+'_'+df.at[i,'Task']), heuristic=None, weight='weight'),df.at[i,'duration'] )],(i-0.4,0.8), facecolors='blue' ) |
这是我使用的一些代码。我同意确实应该将它作为NetworkX的一部分,因为它对我来说很常见。
1 2 3 4 5 6 7 8 9 10 | def single_source_longest_dag_path_length(graph, s): assert(graph.in_degree(s) == 0) dist = dict.fromkeys(graph.nodes, -float('inf')) dist[s] = 0 topo_order = nx.topological_sort(graph) for n in topo_order: for s in graph.successors(n): if dist[s] < dist[n] + graph.edges[n,s]['weight']: dist[s] = dist[n] + graph.edges[n,s]['weight'] return dist |
好像您正在使用DAG。
您的问题很少见,因此在networkx中没有内置的功能。您应该手动执行:
这是完整的测试代码:
1 2 3 4 5 6 7 8 9 10 | import networkx as nx import random from itertools import groupby # Create random DAG G = nx.gnp_random_graph(50,0.3,directed=True) DAG = nx.DiGraph([(u,v) for (u,v) in G.edges() if u<v]) # Get the longest path from node 1 to node 10 max(nx.all_simple_paths(DAG, 1, 10), key=lambda x: len(x)) |