【数据结构与算法】AOV网、AOE网、关键路径

AOV网、AOE网

AOV网

若用DAG图 (有向无环图) 表示一个工程,顶点表示活动,有向边<i,j>表示顶点i必须先与顶点j进行,则将这种有向图称为顶点表示活动的网络,简称AOV网络。

AOV网络是一个不带权的DAG图、边仅表示活动的先后关系。

例如:

1
2
3
4
5

AOE网

若用带权DAG图表示一个工程,顶点表示事件,有向边表示活动,有向边<i,j>的权值表示活动 i -> j 的开销,则将这种带权有向图称为用边表示活动的网络,简称AOE网。

AOE网络是一个带权的DAG图,用边表示事件的先后顺序和活动的开销。

在AOE网络中,仅有一个入度为0的顶点,称为开始顶点(源点),它表示整个工程的开始,也仅有一个出度为0的顶点,称为结束顶点(汇点),它表示整个工程的结束。

例如:

2
3
1
4
5
3
1
2
3
4
5

关键路径

在AOE网络中,有些活动是可以并行进行的。从源点到汇点的路径可能有多条,并且这些路径的长度可能不同。只有所有路径上的活动都已完成,整个工程才算结束。

因为活动是可以并行执行的,所以完成整个工程所需的开销取决于路径长度最长的那条路径。于是,我们把从源点到汇点的所有路径中,路径长度最长的路径称为关键路径,关键路径上的活动称为关键活动

寻找关键路径

如果不需要写计算过程,那么寻找关键路径,我们可以直接根据定义式来肉眼观察(这也是软考中找关键路径的常用技巧)

例如:

2
3
1
4
5
3
1
2
3
4
5

根据肉眼观察,1->3->5的路径长度为8,是最长的路径,那么关键路径就是1->3->5。

注意:关键路径不是只有唯一的一条,所有的路径长度是最长的路径都是关键路径


如果需要写计算过程,那么非常的繁琐了,我们先介绍一下计算中常用的几个参量:

事件 v k v_k vk 的最早发生时间 v e ( k ) v_e(k) ve(k)

v e ( k ) v_e(k) ve(k)表示事件 v k v_k vk 的最早发生时间,指的是从源点到顶点 v k v_k vk的最长路径长度,具体可由下面的公式来从源点开始往后递推:

v e ( 源点 ) = 0 v_e(源点) = 0 ve(源点)=0

v e ( k ) = M a x { v e ( j ) + w e i g h t ( v j , v k ) } v_e(k)=Max\{v_e(j) + weight(v_j, v_k)\} ve(k)=Max{ve(j)+weight(vj,vk)} v k v_k vk v j v_j vj的任意后继, w e i g h t ( v j , v k ) weight(v_j, v_k) weight(vj,vk)表示 < v j , v k > <v_j, v_k> <vj,vk>上的权值。

事件 v k v_k vk 的最迟发生时间 v l ( k ) v_l(k) vl(k)

最迟发生时间指在不推迟整个工程完成的情况下,事件 v k v_k vk的发生时间,具体可按照下面的公式,从汇点开始往前递推:

v l ( 汇点 ) = v e ( 汇点 ) v_l(汇点) = v_e(汇点) vl(汇点)=ve(汇点)

v l ( k ) = M i n { v l ( j ) − w e i g h t ( v k , v j ) } v_l(k)=Min\{v_l(j) - weight(v_k, v_j)\} vl(k)=Min{vl(j)weight(vk,vj)} v k v_k vk v j v_j vj的任意前驱。

活动 a i a_i ai 的最早开始时间 e ( i ) e(i) e(i)

若用边 < v k , v j > <v_k, v_j> <vk,vj> 表示活动 a i a_i ai,则 e ( i ) = v e ( k ) e(i)=v_e(k) e(i)=ve(k)

活动 a i a_i ai 的最迟开始时间 l ( i ) l(i) l(i)

若用边 < v k , v j > <v_k, v_j> <vk,vj> 表示活动 a i a_i ai,则 l ( i ) = v l ( j ) − w e i g h t ( v k , v j ) l(i)=v_l(j) - weight(v_k, v_j) l(i)=vl(j)weight(vk,vj)

一个活动 a i a_i ai 的最迟开始时间和其最早开始时间的差值 d ( i ) d(i) d(i)

d ( i ) = l ( i ) − e ( i ) d(i) = l(i) - e(i) d(i)=l(i)e(i)

l ( i ) − e ( i ) = 0 l(i) - e(i) = 0 l(i)e(i)=0则称活动 a i a_i ai是关键活动


求关键路径的算法步骤如下:

  1. 从源点出发,按照拓扑排序计算各顶点的 v e ( ) v_e() ve()
  2. 从汇点出发,按照逆拓扑排序计算各顶点的 v l ( ) v_l() vl()
  3. 根据 v e ( ) v_e() ve() 求各活动的 e ( ) e() e()
  4. 根据 v l ( ) v_l() vl() 求各活动的 l ( ) l() l()
  5. 求所有活动的 d ( ) d() d()
  6. 找出 d ( ) = 0 d() = 0 d()=0的活动构成关键路径

虽然计算简单,但是过程是真的非常麻烦啊!!!!!

例如:

2
3
1
4
5
3
1
2
3
4
5

1、从源点出发,计算各顶点的 v e ( ) v_e() ve()

v e ( 1 ) = 0 v_e(1)=0 ve(1)=0

v e ( 2 ) = v e ( 1 ) + 2 = 2 v_e(2)=v_e(1) + 2 = 2 ve(2)=ve(1)+2=2

v e ( 3 ) = v e ( 1 ) + 3 = 3 v_e(3)=v_e(1) + 3 = 3 ve(3)=ve(1)+3=3

v e ( 4 ) = v e ( 2 ) + 1 = 3 v_e(4)=v_e(2) + 1 = 3 ve(4)=ve(2)+1=3

v e ( 5 ) = M a x { v e ( 4 ) + 3 , v e ( 3 ) + 5 , v e ( 2 ) + 4 } = v e ( 3 ) + 5 = 8 v_e(5)=Max\{v_e(4)+3, v_e(3)+5, v_e(2)+4\} = v_e(3)+5 = 8 ve(5)=Max{ve(4)+3,ve(3)+5,ve(2)+4}=ve(3)+5=8

2、从汇点出发,计算各顶点的 v l ( ) v_l() vl()

v l ( 5 ) = v e ( 5 ) = 8 v_l(5)= v_e(5) = 8 vl(5)=ve(5)=8

v l ( 4 ) = v l ( 5 ) − 3 = 5 v_l(4)= v_l(5)-3 = 5 vl(4)=vl(5)3=5

v l ( 3 ) = v l ( 5 ) − 5 = 3 v_l(3)= v_l(5)-5 = 3 vl(3)=vl(5)5=3

v l ( 2 ) = M i n { v l ( 4 ) − 1 , v l ( 5 ) − 4 } = 4 v_l(2)=Min\{v_l(4)-1, v_l(5)-4\}=4 vl(2)=Min{vl(4)1,vl(5)4}=4

v l ( 1 ) = 0 v_l(1)=0 vl(1)=0

3、根据 v e ( ) v_e() ve() 求各活动的 e ( ) e() e()

e ( 1 − > 2 ) = v e ( 1 ) = 0 e(1->2) = v_e(1) = 0 e(1>2)=ve(1)=0

e ( 1 − > 3 ) = v e ( 1 ) = 0 e(1->3)=v_e(1)=0 e(1>3)=ve(1)=0

e ( 2 − > 4 ) = v e ( 2 ) = 2 e(2->4)=v_e(2)=2 e(2>4)=ve(2)=2

e ( 2 − > 5 ) = v e ( 2 ) = 2 e(2->5)=v_e(2)=2 e(2>5)=ve(2)=2

e ( 3 − > 5 ) = v e ( 3 ) = 3 e(3->5)=v_e(3)=3 e(3>5)=ve(3)=3

e ( 4 − > 5 ) = v e ( 4 ) = 3 e(4->5)=v_e(4)=3 e(4>5)=ve(4)=3

4、根据 v l ( ) v_l() vl() 求各活动的 l ( ) l() l()

l ( 1 − > 2 ) = v l ( 2 ) − 2 = 2 l(1->2)=v_l(2)-2=2 l(1>2)=vl(2)2=2

l ( 1 − > 3 ) = v l ( 3 ) − 3 = 0 l(1->3)=v_l(3)-3=0 l(1>3)=vl(3)3=0

l ( 2 − > 4 ) = v l ( 4 ) − 1 = 4 l(2->4)=v_l(4)-1=4 l(2>4)=vl(4)1=4

l ( 2 − > 5 ) = v l ( 5 ) − 4 = 4 l(2->5)=v_l(5)-4 = 4 l(2>5)=vl(5)4=4

l ( 3 − > 5 ) = v l ( 5 ) − 5 = 3 l(3->5)=v_l(5)-5=3 l(3>5)=vl(5)5=3

l ( 4 − > 5 ) = v l ( 5 ) − 3 = 5 l(4->5)=v_l(5)-3=5 l(4>5)=vl(5)3=5

5、求所有活动的 d ( ) d() d()

d ( 1 − > 2 ) = l ( 1 − > 2 ) − e ( 1 − > 2 ) = 2 d(1->2)=l(1->2)-e(1->2)=2 d(1>2)=l(1>2)e(1>2)=2

d ( 1 − > 3 ) = l ( 1 − > 3 ) − e ( 1 − > 3 ) = 0 d(1->3)=l(1->3)-e(1->3)=0 d(1>3)=l(1>3)e(1>3)=0

d ( 2 − > 4 ) = l ( 2 − > 4 ) − e ( 2 − > 4 ) = 2 d(2->4)=l(2->4)-e(2->4)=2 d(2>4)=l(2>4)e(2>4)=2

d ( 2 − > 5 ) = l ( 2 − > 5 ) − e ( 2 − > 5 ) = 2 d(2->5)=l(2->5)-e(2->5)=2 d(2>5)=l(2>5)e(2>5)=2

d ( 3 − > 5 ) = l ( 3 − > 5 ) − e ( 3 − > 5 ) = 0 d(3->5)=l(3->5)-e(3->5)=0 d(3>5)=l(3>5)e(3>5)=0

d ( 4 − > 5 ) = l ( 4 − > 5 ) − e ( 4 − > 5 ) = 2 d(4->5)=l(4->5)-e(4->5)=2 d(4>5)=l(4>5)e(4>5)=2

6、找出 d ( ) = 0 d() = 0 d()=0的活动构成关键路径

d ( 1 − > 3 ) = d ( 3 − > 5 ) = 0 d(1->3) = d(3->5) = 0 d(1>3)=d(3>5)=0 所以关键路径为 1->3->5 关键路径长度为8

全篇结束,感谢阅读!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值