文章目录
AOE Network
Definition
在带权有向图中,用顶点表示时间,以有向边表示活动,以边上的的权值表示完成该活动的开销(例如完成活动的所需时间),则称这种有向图为用边表示活动的网络(AOE,Acitivity On Edge Network)
Characteristic
AOE网具有以下性质:
- 有且仅有一个入度为 0 0 0 的点,即开始顶点(源点),表示整个工程的开始
- 有且仅有一个出度为 0 0 0 的点,即结束顶点(汇点),表示整个工程的结束
- 源点到汇点的路径可能有多条,且长度可能不同,即完成活动所需时间不同
- 当且仅当所有路径上所有的活动都已经结束的时候,工程结束
- 只有在某个顶点所代表的时间发生之后,从该顶点出发的有向边所代表的活动才能开始
- 只有在进入某一个顶点的所有有向边代表的活动都已经结束时,该顶点代表的事件才可以发生
Key Path
Definition
从源点到汇点的最长路径为关键路径(Key Path),关键路径上的活动称为关键活动,关键路径的长度即完成工程的最短时间(至少)。最长反而是最短?但是我们需要强调:所有路径上所有的活动结束才是工程结束,所以当且仅当最长的路径,即活动时间最长的那条路径完成时,工程才能完成(因为不同路径上的活动可以并行开始,所以其他路径要么处于等待状态,即与关键路径存在交叉的路径,或者是已经提前完成),只要明确这一点,就不难理解关键路径的一些问题了
Some Important Parameters
几个重要的概念:
- 事件的最早发生时间
- 事件的最迟发生时间
- 活动的最早开始时间
- 活动的最迟开始时间
- 时间余量
1.事件的最早发生时间
简单来说,就是这个事件允许它最早什么时候开始,那么自然就只取决于从源点到这个事件的最长路径的时间开销,因为这个事件只能在前面所有活动都完成时才可以开始,递推公式为:
v
e
a
r
l
y
源
点
=
0
v
e
a
r
l
y
(
k
)
=
M
a
x
{
v
e
a
r
l
y
(
j
)
+
W
e
i
g
h
t
(
v
j
,
v
k
)
}
\begin{aligned} &v_{early}源点=0\\ &v_{early}(k)=Max\{v_{early}(j)+Weight(v_{j},v_{k})\} \end{aligned}
vearly源点=0vearly(k)=Max{vearly(j)+Weight(vj,vk)}
即回退到源点开始,到这个事件最长路径的时间和。其中:
- v e a r l y ( j ) v_{early}(j) vearly(j) 为这个顶点前面的事件的最早开始时间
- W e i g h t ( v j , v k ) Weight(v_{j},v_{k}) Weight(vj,vk) 为从前面的事件到当前这个事件的活动所需花费的时间
2.事件的最迟发生时间
不难理解,就是这个事件允许最慢什么时候再开始,这就与这个事件前面的活动无关了,因为前面的活动只是决定了它什么时候可以开始,但是无法要求它立刻开始。那这么说最迟想多迟就多迟?不是,需要看这个事件指向的下一个事件了,这个下一个事件的最早开始的时间正如我们上面所说,就是到它的最长路径的时间总和,那么,我们就需要保证,其他非最长路径上的活动,至少要在最长路径完成的时候也要完成,即必须保证不能使得后面的事件最早发生的时间遭到推迟,这个时间就是事件的最迟发生时间
比如:两个队伍要同时准备一个事件,分别完成各自的活动, A A A 队需要 3 3 3 小时, B B B 队需要 5 5 5 个小时,那么显然 A A A 队的老哥们较为轻松,因为显然他们有 2 = 5 − 3 2=5-3 2=5−3 小时的余裕,可以先恰个饭或者开把游戏,但是,他们最慢必须在两个小时之后就吃完或者点了,否则的话他们就无法在 B B B 队完成之前把工作做完,那么事件就只能被迫推迟, A A A 队老哥们人自然就没了,以后真的就没饭恰了。所以当前时间的两个小时后就是他们恰完饭或者打完游戏这个事件的最迟发生时间
所以递推公式就是:
v
l
a
t
e
(
汇
点
)
=
v
e
a
r
l
y
(
汇
点
)
v
l
a
t
e
(
j
)
=
M
i
n
{
v
l
a
t
e
(
k
)
−
W
e
i
g
h
t
(
v
j
,
v
k
)
}
\begin{aligned} &v_{late}(汇点)=v_{early}(汇点)\\ &v_{late}(j)=Min\{v_{late}(k)-Weight(v_{j},v_{k})\} \end{aligned}
vlate(汇点)=vearly(汇点)vlate(j)=Min{vlate(k)−Weight(vj,vk)}
也就是,最慢开始的时间需要从后面的事件的最早开始时间慢慢往回推,即需要从工程结束的最早时间开始考虑。
3.活动的最早开始时间
Activity On Edge,活动是用边表示,那么活动可以开始的时间就取决于这条边的起点,即前面的事件的最早发生时间
4.活动的最迟开始时间
即活动的终点事件的最迟发生时间和这个活动需要的时间差(即我们前面说的恰完饭的时间),即 v j − W e i g h t ( v k , v j ) v_{j}-Weight(v_{k},v_{j}) vj−Weight(vk,vj)
5.时间余量
即我们前面说的余裕,就是最迟开始的时间和最早开始的时间之间的差值,也就是活动可以拖延的时间,例如前面我们举的例子中,可以拖延的时间即 2 2 2 小时。而显然对于 B B B 队来说没有时间可以拖延,也就是说,他们的最早开始时间和最迟开始时间是相等的, 即 v l a t e − v e a r l y = 0 v_{late}-v_{early}=0 vlate−vearly=0,所以我们就称这样的活动为关键活动
所以我们求关键路径的方法就是:找出所有时间余量为0的活动,即所有关键活动,这些活动构成关键路径
需要注意:因为关键路径上的关键活动决定了工程的最短完成时间,因此我们可以通过缩短关键活动的时间来实现,但是一旦缩短至一定程度时,当前的关键路径可能会变成非关键路径,因为此时这个路径的时间总开销已经不是最大的了。并且,对于一些关键路径不唯一的AOE网来说,只有缩短那些包含在所有关键路径中的活动,才可以缩短工程时间,否则,我们无法同时缩短所有关键路径,工程最短时间不变