关键路径 AOE:软考系统架构设计师进度网络图怎么算
图论课上找最短路找惯了,软考进度题一上来就栽:工期不是最短那条,是最长那条。
这篇是为软考系统架构设计师准备的进度网络图 / 关键路径复习笔记。和站内 DFD 考点梳理 同一套路:先把符号和直觉立住,再用同一道自拟例题把 AOE 的事件时间、活动六时标、虚活动一次算完。
软考里它到底考什么
综合知识、案例分析里都会撞上进度题,翻来覆去就这几问:
- 关键路径是哪一条?总工期多少天?
- 某个活动最早 / 最晚什么时候开、什么时候完?
- 延误几天会不会拖总工期?能拖的余地(时差)是多少?
- 双代号网络图里虚工作该不该画、画在哪?
题干常给一张「活动—紧前—工期」表,或者直接丢一张网络图。你会画、会算,比会背定义重要得多。
先分清:AOE、AOV,以及为什么是 DAG
进度建模里有两张常被混在一起的网:
- AOE(Activity On Edge):边是活动,边上的权是工期;顶点是事件(某批活动都做完了)。软考进度网络图、双代号网络图,本质上就是 AOE。
- AOV(Activity On Vertex):顶点是活动,边只表示先后。适合拓扑排序、排课表,不直接用来累加工期。
两张图都必须是 DAG(有向无环图)。有环就意味着「A 等 B、B 又等 A」,工程永远开不了工,拓扑排序也会失败。算关键路径之前,脑子里先确认:这是一张无环的依赖图。
关键路径是什么:人话版
项目里很多活动可以并行。真正决定「最早什么时候能收工」的,不是你跑得最快的那条支路,而是最拖后腿的那条依赖链。
这条从开工事件到收工事件、路径权和最大的通路,就叫关键路径;路上的活动叫关键活动。
几个立刻能用的推论:
- 总工期 = 关键路径长度(不是最短路径)。
- 关键活动延误一天,总工期通常就晚一天。
- 非关键活动有缓冲(时差);缓冲没吃完之前,总工期不动。
- 想压缩工期,得动关键路径上的活动;只砍非关键活动,总工期往往纹丝不动——有时还会冒出另一条新的关键路径。
贯穿例题:先把图画出来
下面这张活动表会贯穿全文。数字不大,方便手算;依赖里故意放了「多紧前」,方便后面讲虚活动。
| 活动 | 紧前活动 | 工期(天) |
|---|---|---|
| A | — | 2 |
| B | A | 3 |
| C | A | 4 |
| D | B | 2 |
| E | C、D | 1 |
画成 AOE:顶点是事件 V0…V5,边是活动。E 要等 C 和 D 都完,C 走下面、D 走上面,中间用一条工期为 0 的虚活动把两条支路并到 V4:
读图口诀:圆圈是「某个时刻已经发生的事」,箭头是「正在干活」,箭头上的数字是「干多久」。
DAG 怎么算:四步走完
算法课写法是拓扑排序 + 正推 + 逆推;卷面上你只要记住口诀:顺推取大,逆推取小,时差为零便是主线。
1. 事件最早发生时间 ve(正向)
ve(i):事件 i 最早能发生的时刻——所有指向它的活动都做完的最早时间。
- 源点:
ve(源) = 0 - 其他:
ve(j) = max{ ve(i) + 工期(i→j) }(多个前驱,取大)
对本例:
ve(V0)=0ve(V1)=0+2=2ve(V2)=2+3=5ve(V3)=2+4=6ve(V4)=max(5+2, 6+0)=max(7,6)=7ve(V5)=7+1=8
汇点的 ve 就是项目最短总工期:8 天。
为什么是 max 不是 min?因为事件要发生,最慢的那条紧前活动也得做完。等齐了才能往下走。
2. 事件最迟发生时间 vl(逆向)
vl(i):事件 i 最迟必须发生的时刻——再晚,总工期就被拖住。
- 汇点:
vl(汇) = ve(汇)(计划工期等于计算工期时) - 其他:
vl(i) = min{ vl(j) - 工期(i→j) }(多个后继,取小)
对本例:
vl(V5)=8vl(V4)=8-1=7vl(V2)=7-2=5vl(V3)=7-0=7vl(V1)=min(5-3, 7-4)=min(2,3)=2vl(V0)=2-2=0
3. 活动的最早 / 最迟开始
边 <i,j> 表示活动,工期为 d:
| 符号 | 含义 | 公式 |
|---|---|---|
e | 活动最早开始 | e = ve(i) |
l | 活动最迟开始 | l = vl(j) - d |
| 时差 | 可延误而不拖总工期 | l - e |
e = l(时差为 0)→ 关键活动。
本例算一遍:
| 活动 | e | l | 时差 | 关键? |
|---|---|---|---|---|
| A | 0 | 0 | 0 | 是 |
| B | 2 | 2 | 0 | 是 |
| C | 2 | 3 | 1 | 否 |
| D | 5 | 5 | 0 | 是 |
| 虚 | 6 | 7 | 1 | 否 |
| E | 7 | 7 | 0 | 是 |
4. 串起关键路径
关键活动串起来:A → B → D → E,长度 2+3+2+1=8,和 ve(V5) 一致。
也可以从事件侧记:关键路径上每个事件都满足 ve = vl。本例里 V3 的 ve=6、vl=7,不相等,所以经过 C 的那条支路不是关键路径。
卷面更爱考的六时标
教材 / 真题里更常见的是直接对活动算六个数,不显式写 ve/vl。两套东西是同一件事的两种写法。
| 符号 | 名字 | 怎么算 |
|---|---|---|
| ES | 最早开始 | 无紧前则为 0;有紧前则取紧前 EF 的最大值 |
| EF | 最早完成 | EF = ES + 工期 |
| LF | 最迟完成 | 无紧后则为总工期;有紧后则取紧后 LS 的最小值 |
| LS | 最迟开始 | LS = LF - 工期 |
| TF | 总时差 | TF = LS - ES = LF - EF(不影响总工期的最大延误) |
| FF | 自由时差 | FF = min(紧后 ES) - 本活动 EF(不影响紧后最早开始的最大延误) |
同一例子用六时标再算一遍:
- TF = 0 → 关键活动;全部关键活动串起来 → 关键路径。
- 活动 C:
TF = 1,最多延误 1 天还不拖总工期;若延误 2 天,总工期被拖2-1=1天。 - 按活动表口径,C 的紧后是 E,
FF = ES(E) - EF(C) = 7 - 6 = 1。本例 TF 与 FF 碰巧都是 1,不是定理——别把两者当成同一个数背。
若把虚活动也当成一条边来算,C 的紧后变成「虚 / 0」,FF(C)=0,那 1 天缓冲会记在虚活动的时差上。卷面给的是活动表时,按表上的紧后关系算即可,不必自己再拆一遍虚边。
铁律:ES 直接等于紧前 EF,不要加 1。EF(A)=2 表示时刻 2 结束;B 立刻接着干,ES(B)=2。加 1 是把「时间点」误当成「自然日序号」,整张表会全错。
虚活动:只表逻辑,不占工期
双代号网络图里,虚箭线工期为 0、不消耗资源,只回答一件事:「必须等谁」。
本例若漏画 V3→V4 虚工作,E 的紧前关系就画残了,关键路径和总工期都会跟着错。选题时看到「某活动有多个紧前、且这些紧前没有自然汇到同一节点」,就要警惕虚工作。
练习题(先自己算,再对答案)
| 活动 | 紧前 | 工期 |
|---|---|---|
| P | — | 3 |
| Q | P | 2 |
| R | P | 5 |
| S | Q、R | 2 |
| T | S | 1 |
请回答:
- 关键路径是哪条?总工期几天?
- 活动 Q 的总时差是多少?
- 若 Q 延误 3 天,总工期会延长几天?
展开答案
顺推:
- P:ES=0,EF=3
- Q:ES=3,EF=5
- R:ES=3,EF=8
- S:ES=max(5,8)=8,EF=10
- T:ES=10,EF=11 → 总工期 11
逆推:
- T:LF=11,LS=10
- S:LF=10,LS=8
- R:LF=8,LS=3
- Q:LF=8,LS=6
- P:LF=min(LS_Q, LS_R)=min(6,3)=3,LS=0
TF:P=0,Q=6-3=3,R=0,S=0,T=0。
- 关键路径 P → R → S → T,总工期 11
- Q 的总时差 3
- Q 延误 3 天,刚好吃完时差,总工期延长 0 天;若延误 4 天,则延长 1 天
考场易错清单
- 把关键路径当成最短路:工期是最长依赖链。
- 顺推取了 min、逆推取了 max:口诀反了就全盘错。
- ES = 紧前 EF 之后又加 1:软考按时间点算,不加 1。
- TF 和 FF 混用:问「影响不影响总工期」看 TF;问「影响不影响紧后最早开始」看 FF。
- 压缩非关键活动还以为总工期变了:先确认它是否仍在关键路径上;压缩后可能换线。
- 漏画 / 画反虚工作:多紧前并点是重灾区。
结语
关键路径这考点,骨架就三句话:AOE 是带权 DAG;总工期是最长路径;顺推取大、逆推取小、时差为零就是主线。 六时标、虚活动、延误问答,都是围着这三句话转。
下次再碰到进度表,先别急着套公式——把图画对,标出最长那条链,后面的数基本会自己跳出来。进度管理在卷面上是计算题,落到项目里,其实是在问:你到底知不知道,此刻真正卡住整条线的是哪一环。
参考资料
- 图 - AOE & 关键路径(pdai) — AOE / AOV 术语与四个时间参数关系
- 数据结构教材中「AOE 网与关键路径」章节 —
ve/vl、e/l的标准递推写法 - 软考进度管理中双代号网络图、总时差与自由时差的常规考法(与项目管理「六时标」同一套公式)
版权声明: 本文首发于 指尖魔法屋-关键路径 AOE:软考系统架构设计师进度网络图怎么算(https://blog.thinkmoon.cn/post/1041-notes-aoe-critical-path/) 转载或引用必须申明原指尖魔法屋来源及源地址!
评论
使用 GitHub 账号登录后即可留言,支持 Markdown。