进度管理是信息系统项目管理师(高级)考试中的核心考点,无论是上午理论题、下午案例分析题,还是论文写作,进度管理相关内容几乎每年必考。
一、关键路径法(CPM)
1.1 基本原理
关键路径是指网络图中从起点到终点最长路径,决定了项目的最短工期。关键路径上的活动总时差为0,任何延误都会直接影响项目总工期。
1.2 计算方法
-
正推法:计算最早开始时间(ES)和最早完成时间(EF)
- ES = max(紧前活动的EF)
- EF = ES + 活动工期
-
逆推法:计算最晚开始时间(LS)和最晚完成时间(LF)
- LF = min(紧后活动的LS)
- LS = LF - 活动工期
-
总时差计算:TF = LS - ES = LF - EF
1.3 Python代码实现
python
复制
class CriticalPathCalculator:
def __init__(self, activities):
"""
activities: 字典,格式 {'活动名': {'duration': int, 'predecessors': []}}
"""
self.activities = activities
self.es = {} # 最早开始时间
self.ef = {} # 最早完成时间
self.ls = {} # 最晚开始时间
self.lf = {} # 最晚完成时间
self.tf = {} # 总时差
def forward_pass(self):
"""正推法计算最早时间"""
# 初始化
for act in self.activities:
self.es[act] = 0
self.ef[act] = 0
# 按照拓扑顺序遍历
for act in self.activities:
preds = self.activities[act]['predecessors']
if preds:
self.es[act] = max([self.ef[p] for p in preds])
else:
self.es[act] = 0 # 起点活动
self.ef[act] = self.es[act] + self.activities[act]['duration']
def backward_pass(self):
"""逆推法计算最晚时间"""
# 确定项目总工期
project_duration = max(self.ef.values())
# 初始化
for act in self.activities:
self.lf[act] = project_duration
# 逆序遍历
for act in reversed(list(self.activities.keys())):
# 找出该活动的所有紧后活动
successors = [a for a in self.activities
if act in self.activities[a]['predecessors']]
if successors:
self.lf[act] = min([self.ls[s] for s in successors])
else:
self.lf[act] = project_duration
self.ls[act] = self.lf[act] - self.activities[act]['duration']
def calculate_slack(self):
"""计算总时差"""
for act in self.activities:
self.tf[act] = self.ls[act] - self.es[act]
def get_critical_path(self):
"""获取关键路径上的活动"""
return [act for act in self.activities if self.tf[act] == 0]
def analyze(self):
"""执行完整分析"""
print("=== 关键路径法分析 ===\n")
# 执行计算
self.forward_pass()
self.backward_pass()
self.calculate_slack()
# 输出结果
project_duration = max(self.ef.values())
critical_path = self.get_critical_path()
print(f"项目总工期:{project_duration}天")
print(f"关键路径:{' → '.join(critical_path)}\n")
print("活动时间参数表:")
print(f"{'活动':<8} {'工期':<6} {'ES':<6} {'EF':<6} {'LS':<6} {'LF':<6} {'时差':<6}")
print("-" * 50)
for act in sorted(self.activities.keys()):
print(f"{act:<8} {self.activities[act]['duration']:<6} "
f"{self.es[act]:<6} {self.ef[act]:<6} "
f"{self.ls[act]:<6} {self.lf[act]:<6} {self.tf[act]:<6}")
print(f"\n关键路径上的活动:{', '.join(critical_path)}")
return {
'duration': project_duration,
'critical_path': critical_path,
'activities': self.activities,
'es': self.es, 'ef': self.ef,
'ls': self.ls, 'lf': self.lf,
'tf': self.tf
}
# 示例使用
def example_cpm_analysis():
# 定义活动和依赖关系
activities = {
'A': {'duration': 3, 'predecessors': []},
'B': {'duration': 4, 'predecessors': ['A']},
'C': {'duration': 2, 'predecessors': ['A']},
'D': {'duration': 5, 'predecessors': ['B', 'C']},
'E': {'duration': 2, 'predecessors': ['D']}
}
calculator = CriticalPathCalculator(activities)
result = calculator.analyze()
return result
# 运行示例
if __name__ == "__main__":
example_cpm_analysis()
引用
1.4 关键路径识别
根据总时差为零的原则,我们可以识别出关键路径。上面的代码会自动计算所有活动的时差,并输出关键路径上的活动列表。
二、工期压缩技术
当项目进度滞后时,项目经理需要采用技术手段缩短工期。信息系统项目管理师考试中主要考察以下技术:
2.1 赶工
定义:通过增加资源投入来缩短活动工期
特点:
- 适用于关键路径上的活动
- 直接缩短活动工期
- 通常会增加项目成本(加班费、额外人员费用)
- 存在边际效应递减
2.2 快速跟进
定义:将原计划串行执行的活动改为并行执行
特点:
- 不增加资源,但改变活动逻辑关系
- 通常会增加返工风险
- 成本增幅小于赶工
- 适用于可分解的活动
2.3 工期压缩决策模型
python
复制
class ScheduleCompressionAnalyzer:
def __init__(self, activities):
"""
activities: 格式 [{'name': '活动A', 'duration': 10, 'is_critical': True,
'crash_cost_per_day': 2000, 'max_crash_days': 3}]
"""
self.activities = activities
def recommend_compression(self, target_reduction_days, budget_limit):
"""
推荐工期压缩方案
"""
recommendations = []
# 筛选关键路径活动
critical_activities = [a for a in self.activities if a['is_critical']]
print(f"=== 工期压缩分析 ===")
print(f"需要缩短:{target_reduction_days}天")
print(f"预算限制:{budget_limit}元\n")
for activity in critical_activities:
if activity['max_crash_days'] > 0:
cost = activity['crash_cost_per_day'] * activity['max_crash_days']
if cost <= budget_limit:
recommendations.append({
'activity': activity['name'],
'possible_reduction': activity['max_crash_days'],
'total_cost': cost
})
if not recommendations:
print("没有可行的赶工方案")
return None
# 按成本效益排序
recommendations.sort(key=lambda x: x['total_cost'])
print("推荐的赶工方案:")
print(f"{'活动':<10} {'可缩短(天)':<12} {'总成本(元)':<12}")
print("-" * 36)
for rec in recommendations:
print(f"{rec['activity']:<10} {rec['possible_reduction']:<12} "
f"{rec['total_cost']:<12}")
return recommendations
def example_compression_analysis():
# 示例场景:项目需要缩短5天,预算2万元
activities_list = [
{'name': 'A', 'duration': 10, 'is_critical': True,
'crash_cost_per_day': 2000, 'max_crash_days': 3},
{'name': 'B', 'duration': 8, 'is_critical': True,
'crash_cost_per_day': 3000, 'max_crash': 2},
{'name': 'C', 'duration': 6, 'is_critical': False,
'crash_cost_per_day': 1500, 'max_crash_days': 2}
]
analyzer = ScheduleCompressionAnalyzer(activities_list)
analyzer.recommend_compression(target_reduction_days=5, budget_limit=20000)
if __name__ == "__main__":
example_compression_analysis()
三、进度偏差分析(挣值管理)
挣值管理(EVM)是信息系统项目管理师考试中必考的计算题内容。通过对比计划价值(PV)、挣值(EV)和实际成本(AC),可以定量分析项目绩效。
3.1 核心指标
| 指标 | 公式 | 含义 |
|---|---|---|
| 计划价值(PV) | 计划完成工作的预算成本 | 应该完成多少工作 |
| 挣值(EV) | 实际完成工作的预算成本 | 实际完成了多少工作 |
| 实际成本(AC) | 实际消耗的成本 | 花了多少钱 |
3.2 偏差和绩效指标
进度相关指标:
-
进度偏差(SV) = EV - PV
- SV > 0:进度超前
- SV = 0:按计划
- SV < 0:进度落后
-
进度绩效指数(SPI) = EV / PV
- SPI > 1:进度超前
- SPI = 1:按计划
- SPI < 1:进度落后
成本相关指标:
-
成本偏差(CV) = EV - AC
- CV > 0:成本节约
- CV = 0:按预算
- CV < 0:成本超支
-
成本绩效指数(CPI) = EV / AC
- CPI > 1:成本节约
- CPI = 1:按预算
- CPI < 1:成本超支
3.3 Python代码实现
python
复制
class EarnedValueAnalyzer:
def __init__(self, pv, ev, ac):
"""
pv: 计划价值
ev: 挣值
ac: 实际成本
"""
self.pv = pv
self.ev = ev
self.ac = ac
def calculate_metrics(self):
"""计算挣值管理指标"""
# 偏差指标
self.sv = self.ev - self.pv # 进度偏差
self.cv = self.ev - self.ac # 成本偏差
# 绩效指数
self.spi = self.ev / self.pv if self.pv != 0 else 0 # 进度绩效指数
self.cpi = self.ev / self.ac if self.ac != 0 else 0 # 成本绩效指数
# 预测指标(假设典型偏差)
self.bac = 100 # 完工预算(需要根据实际情况设置)
self.eac = self.ac + (self.bac - self.ev) / self.cpi if self.cpi != 0 else 0
self.etac = self.eac / (self.ac / self.ev) if self.ev != 0 else 0
return self
def generate_report(self):
"""生成分析报告"""
print("\n=== 挣值管理分析报告 ===\n")
# 基础数据
print("【基础数据】")
print(f"计划价值(PV):{self.pv}万元")
print(f"挣值(EV):{self.ev}万元")
print(f"实际成本(AC):{self.ac}万元\n")
# 偏差分析
print("【进度分析】")
print(f"进度偏差(SV)= {self.sv}万元")
print(f"进度状态:{'✓ 进度超前' if self.sv > 0 else '✗ 进度落后' if self.sv < 0 else '按计划'}")
print(f"进度绩效指数(SPI)= {self.spi:.2f}")
print(f"进度效率:{'✓ 高于计划' if self.spi > 1 else '✗ 低于计划' if self.spi < 1 else '符合计划'}\n")
# 成本分析
print("【成本分析】")
print(f"成本偏差(CV)= {self.cv}万元")
print(f"成本状态:{'✓ 成本节约' if self.cv > 0完成本超支'}")
SPI < 0.8 时:采取**赶工**或**快速跟进**
- SPI > 1.2 时:检查是否存在质量问题或范围蔓延
**代码示例:进度纠偏建议生成器**
示例使用
def example_corrective_action():
场景:进度落后5万,成本超支3万
advisor = ScheduleCorrectiveActionAdvisor(sv=-5, cv=-3, spi=0.9, cpi=0.95)
advisor.print_recommendations()
if name == “main”:
example_corrective_action()
五、考试备考策略
5.1 计算题备考要点
-
掌握核心公式
- 正推法:ES = max(紧前活动EF), EF = ES + 工期
- 逆推法:LF = min(紧后活动LS), LS = LF - 工期
- 时差计算:TF = LS - ES
- 挣值管理:SV = EV - PV, SPI = EV / PV, CV = EV - AC, CPI = EV / AC
-
多画图练习
- 手绘10个以上不同复杂度的网络图
- 熟练计算所有活动的时间参数
-
使用代码工具辅助理解
- 运行本文提供的Python代码
- 验证手工计算结果
- 加深对计算逻辑的理解
5.2 论文写作建议
进度管理论文可以从以下几个角度展开:
-
案例背景
- 描述一个进度紧张的项目
- 说明项目特点(工期紧、任务复杂、资源有限)
-
问题分析
- 使用CPM找出关键路径
- 通过挣值分析发现进度滞后
- 分析滞后原因(资源不足、需求变更、技术难点)
-
解决方案
- 使用赶工技术缩短关键路径活动工期
- 采用快速跟进调整活动逻辑关系
- 实施资源平衡优化资源分配
-
经验总结
- 如何制定科学的进度计划
- 如何通过挣值管理实现早期预警
- 如何平衡进度、成本、质量三重约束
六、总结
进度管理是信息系统项目管理师考试的核心考点。通过本文的梳理,你应该掌握:
- 关键路径法(CPM):能够计算ES、EF、LS、LF、TF,识别关键路径
- 工期压缩技术:理解赶工和快速跟进的适用场景和成本影响
- 挣值管理(EVM):熟练运用SV、CV、SPI、CPI进行进度和成本偏差分析
- 实战代码工具:使用Python代码验证计算、生成分析报告、提供纠偏建议
这些工具不仅有助于备考,在实际项目管理工作中也能发挥重要作用。