def find_critical_path():
#顶点列表
node_list = ['A','B','C','D','E','F','G','H','I']
critical_path = []
difference_dict = {}
edge_list = [['A', 'B', 6],
['A', 'C', 4],
['A', 'D', 5],
['B', 'E', 1],
['C', 'E', 1],
['D', 'H', 2],
['E', 'F', 9],
['E', 'G', 7],
['F', 'I', 2],
['G', 'I', 4],
['H', 'I', 4]
]
'''创建字典Ve表示事件最早发生时间'''
Ve = {'A': 0}
for edge in edge_list: # 遍历每一个活动
earliest_start_time = Ve[edge[0]] + edge[2] # start_time表示edge[1]事件的最早开始时间
if edge[1] not in Ve: # 看看edge[1]事件是否已经放置在了Ve字典中了,如果没有则放置进去
Ve[edge[1]] = earliest_start_time
else: # 如果已经有了一个叫edge[1]事件的键,则
if earliest_start_time > Ve[edge[1]]:
Ve[edge[1]] = earliest_start_time
print("事件最早发生时间:",Ve)
'''创建字典Vl表示事件最晚发生时间'''
Vl = {'I': 18}
for i in range(len(edge_list)-1, -1, -1): # 遍历每一个活动
edge = edge_list[i]
latest_start_time = Vl[edge[1]] - edge[2] # latest_start_time表示edge[0]的最晚开始时间
if edge[0] not in Vl:
Vl[edge[0]] = latest_start_time
else:
if latest_start_time < Vl[edge[0]]:
Vl[edge[0]] = latest_start_time
print("事件最晚发生时间:",Vl)
'''创建字典e表示活动最早发生时间'''
e = {}
for edge in edge_list:
e['{}-{}'.format(edge[0],edge[1])] = Ve[edge[0]] # 活动最早开始时间为事件edge[0]的最早开始时间
print("活动最早发生时间:",e)
'''创建字典l表示活动最晚发生时间'''
l = {}
for i in range(len(edge_list) - 1, -1, -1): # 遍历每一个活动
edge = edge_list[i]
l['{}-{}'.format(edge[0],edge[1])] = Vl[edge[1]] - edge[2] # 活动最晚开始时间要保证事件edge[1]的最晚发生时间不拖后
print("活动最晚发生时间:", l)
for key in e.keys():
sum = l[key] - e[key]
if sum == 0:
critical_path.append(key)
difference_dict[key] = sum
print("时间差:", difference_dict)
print("关键路径为:", critical_path)
if __name__ == "__main__":
find_critical_path()
代码还有一些问题如edge_list里面如果把顺序打乱了就不行了,大家可以自己改一改