关键路径AOE网(python实现)

在这里插入图片描述

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里面如果把顺序打乱了就不行了,大家可以自己改一改

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值