计算两个节点NetworkX

时间:2019-05-29 14:21:01

标签: python networkx

我正在尝试使用Networkx制作甘特甜菜。网络中的所有节点都是“任务”,需要完成这些任务才能完成项目。使用Networkx,可以轻松计算项目的总时间。但是让甘特甜菜我需要每个节点的最新开始。

NetworkX包含一个函数(dag_longest_path_length),但这会计算出整个网络中的最长路径。另一个函数(astar_path_length)导致源和节点之间的路径最短,但是在我的情况下,没有可用的函数提供了最长的路径或最新的起点。 (如果一个节点作为两个先前节点,它将采用最快的路径,但实际上,它还必须等待第二个节点才能启动。

我在想一个选择。 评估先前连接的节点并选择最长路径。非正式的我没有成功。

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' )

2 个答案:

答案 0 :(得分:1)

好像您正在使用DAG。

您的问题很少见,因此在networkx中没有内置函数。您应该手动进行:

max(nx.all_simple_paths(DAG, source, target), key=lambda x: len(x))

这是完整的测试代码:

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))

答案 1 :(得分:1)

这是我使用的一些代码。我同意确实应该将它作为NetworkX的一部分,因为它对我来说很常见。 import sys from PySide2.QtWidgets import QApplication, QFileDialog def get_filename(): app = QApplication([]) options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog fileName, _ = QFileDialog.getOpenFileName( None, "QFileDialog.getOpenFileName()", "", "All Files (*);;Python Files (*.py)", options=options, ) return fileName if __name__ == "__main__": filename = get_filename() if filename: print(filename) 必须是graphDiGraph是源节点,sdist,由与dict的加权距离作为值的节点进行键控。

s