引言

单代号网络计划图(Activity-on-Node,AON)是项目管理中常用的一种工具,它能够帮助项目经理清晰地展示项目活动之间的逻辑关系和进度安排。掌握单代号网络计划图的计算方法,是项目管理中的一项核心技能。本文将深入解析单代号网络计划图的计算奥秘,帮助读者轻松掌握这一技能。

单代号网络计划图的基本概念

1. 活动和节点

在单代号网络计划图中,每个活动用一个节点表示,节点通常包含活动的名称和持续时间。相邻节点之间的箭头表示活动之间的逻辑关系。

2. 关键路径法(Critical Path Method,CPM)

单代号网络计划图最核心的计算方法就是关键路径法。它通过计算每个活动的最早开始时间(Earliest Start Time,EST)和最晚开始时间(Latest Start Time,LST)来确定关键路径。

单代号网络计划图的计算步骤

1. 计算最早开始时间(EST)

最早开始时间的计算从网络计划图的起点开始,沿着每条路径向前推进,累加活动持续时间。

def calculate_est(network, node):
    if node == network.start_node:
        return 0
    else:
        return max(calculate_est(network, predecessor) + duration for predecessor, duration in network.nodes[node]['predecessors'])

network = {
    'start_node': 'A',
    'nodes': {
        'A': {'duration': 3, 'predecessors': []},
        'B': {'duration': 2, 'predecessors': [('A', 3)]},
        'C': {'duration': 1, 'predecessors': [('B', 2)]},
        'D': {'duration': 4, 'predecessors': [('A', 3), ('B', 2)]},
        'E': {'duration': 2, 'predecessors': [('C', 1), ('D', 4)]},
        'F': {'duration': 3, 'predecessors': [('E', 2)]},
        'G': {'duration': 2, 'predecessors': [('E', 2), ('F', 3)]},
        'H': {'duration': 1, 'predecessors': [('G', 2)]},
        'I': {'duration': 2, 'predecessors': [('H', 1)]},
        'J': {'duration': 3, 'predecessors': [('G', 2), ('I', 2)]},
        'K': {'duration': 2, 'predecessors': [('J', 3)]},
        'L': {'duration': 3, 'predecessors': [('K', 2)]},
        'M': {'duration': 1, 'predecessors': [('L', 3)]},
        'N': {'duration': 2, 'predecessors': [('M', 1)]},
        'O': {'duration': 1, 'predecessors': [('N', 2)]},
        'P': {'duration': 3, 'predecessors': [('O', 1)]},
        'Q': {'duration': 2, 'predecessors': [('P', 3)]},
        'R': {'duration': 3, 'predecessors': [('Q', 2)]},
        'end_node': 'R'
    }
}

print(calculate_est(network, 'A'))

2. 计算最晚开始时间(LST)

最晚开始时间的计算从网络计划图的终点开始,沿着每条路径向后推进,累减活动持续时间。

def calculate_lst(network, node):
    if node == network.end_node:
        return 0
    else:
        return min(calculate_lst(network, successor) - duration for successor, duration in network.nodes[node]['successors'])

print(calculate_lst(network, 'R'))

3. 计算总浮动时间(Total Float Time,TFT)

总浮动时间是指在不影响项目总完成时间的前提下,某个活动可以延迟的时间量。

def calculate_tft(network, node):
    return node['LST'] - node['EST']

network['nodes']['A']['EST'] = calculate_est(network, 'A')
network['nodes']['A']['LST'] = calculate_lst(network, 'A')
network['nodes']['A']['TFT'] = calculate_tft(network, 'A')

# 计算其他节点的总浮动时间
for node in network['nodes']:
    network['nodes'][node]['EST'] = calculate_est(network, node)
    network['nodes'][node]['LST'] = calculate_lst(network, node)
    network['nodes'][node]['TFT'] = calculate_tft(network, node)

print(network)

总结

通过以上步骤,我们可以轻松地计算出单代号网络计划图中的关键路径、最早开始时间、最晚开始时间和总浮动时间。这些计算结果对于项目管理至关重要,可以帮助项目经理合理地安排项目进度,确保项目按时完成。希望本文能帮助读者掌握单代号网络计划图的计算奥秘,提升项目管理技能。