6.9.1 AOE网
用一个有向图表示一个工程的各子工程及其相互制约的关系,以弧表示活动,以顶点表示活动的开始或结束事件,称这种有向图的边表示活动的网,简称AOE网(Activity On Edge)。
6.9.2 关键路径
把工程计划表示为边表示活动的网络,即AOE网,用顶点表示事件,弧表示活动,弧的权表示活动持续时间。
事件表示在它之前的活动已经完成,在它之后的活动可以开始。
例:宴会准备,宴会晚上6点开始,最迟几点开始准备?压缩哪项活动可以使总时间减少?
活动代码 | 活动描述 | 历时(分钟) | 前置任务 |
A | 菜单制定 | 30 | |
B | 原料采购 | 60 | A |
C | 餐具准备 | 45 | A |
D | 甜点准备 | 60 | B |
E | 原料清理 | 60 | B |
F | 烹饪 | 30 | DE |
G | 桌椅布置 | 15 | C |
H | 宴会开始 | 0 | FG |
例:设一个工程有11项活动,9个事件。事件V1:表示整个工程开始(源点:入度为0的顶点);事件V9:表示整个工程结束(汇点:出度为0的顶点)。
对于AOE网,我们关心两个问题:
(1)完成整项工程至少需要多少时间?
(2)哪些活动是影响工程进度的关键?
这些问题就是求解关键路径的问题。
关键路径:路径长度最长的路径。
路径长度:路径上各活动持续的时间之和。
如何确定关键路径,需要定义4个描述量(例子中用到的是宴会的有向图):
ve(Vj):表示事件Vj的最早发生时间,age:ve(V1) = 0,ve(V2) = 30;
vl(Vj):表示事件Vj的最晚发生事件,age:假如最晚结束时间为180,vl(V4) = 165
e(i):表示活动ai的最早开始时间,age:e(a3) = 30;
l(i):表示活动ai的最晚开始时间,age:l(a3) = 120;
l(i) - e(i):表示完成活动ai的时间余量:age:l(a3) - e(a3) = 120 - 30 =90;
关键活动:关键路径上的活动,即e(i) == l(i)。
如何找关键活动?设活动ai用弧<j,k>表示,其持续时间为Wj,k,则有:
(1)e(i) = ve(j)
(2)l(i) = vl(k) - Wj,k
如何求ve(j)和vl(j) ?
(1)从ve(1) = 0 开始向前递推,ve(j) = Max{ve(i) + Wi,j},<i,j>∈T,2<=j<=n,其中T是所有以j为头的弧的集合;
(2)从vl(n) = ve(n)开始向后递推,vl(i) = Min{vl(j) - Wi,j},<i,j>∈S,1<= i <= n-1,其中S是所有以i为尾的弧的集合。
求关键路径的步骤:
(1)求ve(i),vl(j)
(2)求e(i),l(j)
(3)计算l(i) - e(i)
以下图的有向图为例:
顶点 | ve(从上往下计算) | vl(从下往上计算) |
V1 | 0 | 0 |
V2 | 6 | 6 |
V3 | 4 | 6 |
V4 | 5 | 8 |
V5 | 7 | 7 |
V6 | 7 | 10 |
V7 | 16 | 16 |
V8 | 14 | 14 |
V9 | 18 | 18bian |
活动 | e(从上往下计算) | l(从下往上计算) | l-e |
a1 | 0 | 0 | 0 |
a2 | 0 | 2 | 2 |
a3 | 0 | 3 | 3 |
a4 | 6 | 6 | 0 |
a5 | 4 | 6 | 2 |
a6 | 5 | 8 | 3 |
a7 | 7 | 7 | 0 |
a8 | 7 | 7 | 0 |
a9 | 7 | 10 | 3 |
a10 | 16 | 16 | 0 |
a11 | 14 | 14 | 0 |