数据结构 拓扑排序、AOV 、AOE、关键路径

AOV (Activity On Vertex) 活动在顶点上

AOV 网: 强调的是在一个完整的过程中,各个活动所发生的顺序

其中用顶点表示活动,用弧表示活动之间的优先关系,例如:在 ? 图中,活动 A 应该在活动 B 之前发生

把各个活动按照发生的先后顺序进行排序就称为拓扑排序

而经过排序后形成的序列就称为拓扑序列

拓扑排序:下面是一个 AOV 网,进行拓扑排序(排序后的结果为: 1 2 4 3 5)

1. 开始状态为上图所示 ?:先观察上图,找到入度为 0 的节点,从上图看,发现节点 1 的入度为 0

所以第一个选择结果为:1,然后进行图的处理,将以节点 1 为弧尾所指向的节点的弧去除,得到下面 ? 的图

2. 再观察上图 ?,找到入度为 0 的节点,发现节点 2 的入度为 0,所以第二个选择结果为:2,然后进行图的处理,将以节点 2 为弧尾所指的节点的弧去除,得到下面 ? 的图

3. 再观察上图 ?,找到入度为 0 的节点,发现节点 4 的入度为 0,所以第三个选择结果为:4,然后进行图的处理,将以节点 4 为弧尾所指的节点的弧去除,得到下面 ? 的图

4. 再观察上图 ?,找到入度为 0 的节点,发现节点 3 的入度为 0,所以第四个选择结果为:3,然后进行图的处理,将以节点 3 为弧尾所指的节点的弧去除,得到下面 ? 的图

5. 再观察上图 ?,找到入度为 0 的节点,发现节点 5 的入度为 0,所以第五个选择结果为:5,最后结束

AOE (Activity On Edge) 活动在边上

AOE 网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划和实施过程,一个工程常被分为多个小的子工程,这些子工程被称为活动(Activity),在带权有向图中若以顶点表示事件,有向边表示活动,边上的权值表示该活动持续的时间

AOE 网性质

  1. 只有在某顶点所代表的事件发生后,从该顶点出发的各个有向边所代表的活动才能开始
  2. 只有在进入某顶点的各有向边所代表的活动都已经结束,该顶点所代表的事件才能发生

由上图可以看到,造一个飞机的整个过程:从开始->组装好,中间要经历零件的制造好,集中好这些事件

活动:从开始到轮子造好这个弧就是一个造轮子的活动,注意活动是在边上这个概念,由图上可知,造轮子这个活动,耗时为 2 天

而且可以通过观察可以看出,整个造好一架飞机的总少耗时为:5 + 1 + 2 = 8 天(图中最长的一条从起点到终点的路径),这个时间是怎么来的呢?

首先,观察在集中这个事件发生前,它前面的活动都要发生且结束,且由观察可知,各个零件造好的集中活动所耗时的时间是一样的,所以在集中事件的发生前的核心在各个零件制造的活动

从制造一块来看,如果工期为 2 天的话,造轮子、造机翼、造零件这三个活动可以完成,但是对于造机舱、造发动机这两个活动只完成了一部分,此时集中好这个事件还不能发生,必须要等造机舱以及造发动机这两个活动完成,然后再经过集中活动,才能发生集中好这个事件,所以最短的时间,应该是在制造活动中选择所需制造时间最长的活动,也就是造发动机这个活动,总耗时 5 天,当发动机造好了,其他的零件自然也已经造好(这一点很重要!!!如果没有造好的话,就不能同时抵达集中好这个事件,还会出现等待的情况,所以为了使整个工程所耗时最短,在发动机造好了,其他的零件也必然已经造好

关键路径:在这个图中是指:开始->发送机造好->集中好->组装好这个路径

关键活动:在关键路径上的每条弧,称为关键活动

关键活动的特点:关键活动的最早开始时间和最迟开始时间是一致的,怎么理解这句话呢?请看下面 ? 的解释:

对于制造这个环节,总时间给 5 天,也就是制造发动机这个活动所消耗的时间

对于造轮子的活动:最早开始时间为: 0 天,最晚开始时间为: 3 天
对于造机舱的活动:最早开始时间为: 0 天,最晚开始时间为: 2 天
对于造发动机的活动:最早开始时间为: 0 天,最晚开始时间为: 0 天
对于造机翼的活动:最早开始时间为: 0 天,最晚开始时间为: 3 天
对于造零件的活动:最早开始时间为: 0 天,最晚开始时间为: 4 天

从上述分析可知,制造发动机这个活动的最早开始时间和最晚开始时间相同,所以制造发动机这个活动属于关键活动

举个例子:

求上图  ? AOE 网的关键路径?

首先求此 AOE 网 的拓扑序列得出每个事件发生的先后顺序:V1 V2 V3 V4 V5 V6 V7 V8 V9

再求各事件最早发生时间(该事件的发生要满足它的前驱事件全部完成,前驱事件是指在图中弧指向该节点事件的节点,比如说:对于事件 V3,指向它的事件有 V1 和 V2,所以事件 V3 最早发生时间要等事件 V1 和 V2 全部完成
一个事件的最迟发生时间 = 它前一个事件的最早发生时间 + 指向该事件的弧 (活动) 的时间的最大值

解释一下为啥要最大值:因为当事件 V3 最早发生的时候至少要等 V1 和 V2 这两个事件全部完成了,所以 V3 的最早发生时间就应为 max{V1 + a2, V2 + a5}
ve(i) 表示事件 i 发生的最早发生时间,则:

ve(1) = 0
ve(2) = 2
ve(3) = max{ve(1) + 5, ve(2) + 2} = 5
ve(4) = ve(2) + 3 = 5
ve(5) = max{ve(1) + 5, ve(3) + 1} = 6
ve(6) = max{ve(3) + 3, ve(4) + 2} = 8
ve(7) = max{ve(5) + 6, ve(6) + 3} = 12
ve(8) = ve(6) + 4 = 12
ve(9) = max{ve(7) + 4, ve(8) + 2} = 16

再求各事件最迟发生时间(不能推迟其后事件的最迟发生时间)
一个事件的最迟发生时间 = 它后一个事件的最迟发生时间 - 这个事件指向它后一个事件的弧 (活动) 的时间的最小值

解释一下为啥要最小值:最小值也就是说当前的事件它最晚是什么时间开始,拿事件 V6 举例子,V7 的最晚发生时间为 12,V8的最晚发生时间为 14,那么 V6 最晚到什么时间开始才能经过活动 a11 到达 V7, 经过活动 a10 到达 V8 呢,当然是选择这两个事件分别减去各自弧(活动)所花费的时间的最小值了,如果不是最小值的话,V7 - a11 = 9, V8 - a13 = 10,选择 10 点最为最迟发生时间,那么 10 + a11 = 13 ,这个 13 比 V7 事件的最迟发生时间还要向后延迟,那么铁定 V7 是完成不了的了,所以明白了吗?
vl(i) 表示事件 i 发生的最迟时间

节点 1 和 节点 9 分别为路径的起点和终点,所以它俩一定在关键路径上,又因为关键路径上的节点的最早发生时间和最迟发生时间是相同的,那么就可以根据上面求的最早的发生时间 ve(9) = 16,得出 vl(9) = ve(9) = 16,那么从后往前推,则可以依次得到其他事件的最迟发生时间

vl(9) = ve(9) = 16
vl(8) = vl(9) - 2 = 14
vl(7) = vl(9) - 4 = 12
vl(6) = min{vl(8) - 4, vl(7) - 3} = 9
vl(5) = vl(7) - 6 = 6
vl(4) = vl(6) - 2 = 7
vl(3) = min{vl(6) - 3, vl(5) - 1} = 5
vl(2) = min{vl(4) - 3, vl(3) - 2} = 3
vl(1) = min{vl(5) - 5, vl(3) - 5, vl(2) - 2} = 0

现在开始求各活动最早发生时间
活动最早发生时间 = 活动的弧尾的事件的最早发生时间,所以:

e(a1) = e(a2) = e(a3) = ve(1) = 0
e(a4) = e(a5) = ve(2) = 2
e(a6) = e(a7) = ve(3) = 5
e(a8) = ve(4) = 5
e(a9) = ve(5) = 6
e(a10) = e(a11) = ve(6) = 8
e(a12) = ve(7) = 12
e(a13) = ve(8) = 12

现在求各活动最迟发生时间
活动的最迟发生时间 = 活动的弧头所指向的事件的最迟发生时间 - 这个活动所消耗的时间

l(a1) = vl(2) - 2 = 1
l(a2) = vl(3) - 5 = 0
l(a3) = vl(5) - 5 = 1
l(a4) = vl(4) - 3 = 4
l(a5) = vl(3) - 2 = 3
l(a6) = vl(5) - 1 = 5
l(a7) = vl(6) - 3 = 6
l(a8) = vl(6) - 2 = 7
l(a9) = vl(7) - 6 = 6
l(a10) = vl(8) - 4 = 10
l(a11) = vl(7) - 3 = 9
l(a12) = vl(9) - 4 = 12
l(a13) = vl(9) - 2 = 14 

最后对比活动的最早发生时间和最迟发生时间,找到两个时间相同的活动,则为关键活动,由这些关键活动构成的路径则为关键路径

由上图可以查看出关键活动为:a2 a6 a9 a12

在图中画出来就是下面 ? 的结果:

本篇文章到这里就结束了,可能这篇文章讲的还不够好,或者有错误的地方,欢迎在下方进行留言,我看到会加以修正,互相学习,共同进步,加油!(●'◡'●)

发布了92 篇原创文章 · 获赞 23 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/assiduous_me/article/details/100528892