图的应用—拓扑排序

一、有向无环图

针对:有向无环图:没有形成回路的有向图。类似于树

有向无环图通常用来描述一个工程或系统的进行过程(通常把计划、施工、生产、程序流程图当成一个工程),且一个工程可以分为若干个子工程,只要完成这些子工程,就可以导致整个工程的完成。

AOV网:

用一个有向图表示一个工程的各子工程及其相互制约的关系,其中顶点表示活动、弧表示活动之间的优先制约关系,称这种有向图为顶点表示活动的网

特点:

若从i到j有一条有向路径,则i是j的前驱;j是i的后继。

从i到j其中可以有其他的结点,比如从c1到c5是一条有向路径。其中c1是c5的前驱,c5是c1的后继

 

若<i,j>是网中的有向边,则i是j的直接前驱,j是i的直接后继。

从i到j中间不能有其他结点,比如c1到c3,c1是c3的直接前驱,c3是c1的直接后继

拓扑排序(将一个网变成一个线性序列)

 在AOV网没有回路的前提下,我们将全部活动排列成一个线性序列,使得若AOV网中有弧<i,j>存在,则在整个序列内,i一定排在j的前面,具有这种性质的线性序列称为拓扑有序序列,相应的拓扑有序排列算法称为拓扑排序。

思路:
在有向图中选一个没有前驱的顶点且输出之:  选择c1


从图中删除该顶点和所有以它为尾的弧。  从图中删除c1及其有向边

重复上面两部,直到全部顶点均已输出,或者当图中不存在无前驱顶点位置。

输出的序列就是一个拓扑序列(因此拓扑序列不是唯一的,但是在整个序列表内,前驱一定在后继的前面)

利用拓扑排序就可以检测AOV网中是否存在环:如果所有顶点都在它的拓扑有序序列中,则该AOV网必定不存在环。

 

AOE网:

用一个有向图表示一个工程的各子工程及其相互制约的关系,以弧表示活动,以顶点表示活动的开始或结束时间(活动的开始点或者结束点),称这种有向图为边表示活动的网

把工程计划表示为边表示活动的网络,用顶点表示事件、弧表示活动,弧的权表示活动持续时间
事件表示:在它之前的活动已经完成,在它之后的活动可以开始

 关键路径:

设一个工程由11项活动,9个事件。

其中事件v1表示工程的开始(源点:入度为0的顶点),事件v9表示整个工程的结束(汇点:出度为0的顶点)。

对于AOE网,我们一般关系两个问题:1.完成整个事件需要的事件,2.那些活动是影响工程进度的关键。

关键路径——路径长度最长的路径。(是影响工程进度的关键)
路径长度——路径上各活动持续时间之和。()

对于确定关键路径需要定义四个描述量:

1.ve(vj)—表示事件vj的最早发生时间
源点 的ve(v1)= 0, ve(v2) = 6

2.vl(vj)—表示事件vj的最迟发生时间
从汇点往回推,推点此点最迟发生时间才能保证工程能正确完成
vl(v7)= 整个工程总时间 - a10(v7时间开始后所需要的时间)

3.e(i)表示活动ai的最早开始时间(边)
e(a4) = 6

4.l(i)表示活动ai最迟开始时间
e(a8) =  整个工程总时间 - a11 - a8(最短需要时间才能完成的项目)

l(i) -  e(i)—表示完成活动ai的时间余量 ,表示可以在这某段时间的任意时间开始执行,都不会影响进度。

关键活动—关键路径上的活动即l(i)== e(i),没有活动余量。关键路径由多个关键活动构
e(i) = ve(j)
l(i) = vl(k) - wj,k(wj,k为持续时间)

ve(j) = 前驱结点的时间  加上  当前活动的持续时间
从源点向汇点推算,如果由多个值,取最大值

vl(k) = 后继结点的时间  减去  当前活动持续时间
从汇点向源点推算,如果有多个值,取最小值

求最早发生时间

  

等所有执行完才能执行下一个Vj。
也就是说最长时间是等Vx执行完,才能开始执行到Vj,也就是82+6 = 88.所以ve(vj) = 88

求最晚发生时间

 

等所有执行完才能执行下一个Vn
也就是说最长时间是等Vu执行完,才能执行到Vn

汇点要求10(天/小数)完成,由总时间 - 每条的持续时间求出
最迟发生时间 vl(Vj) = 10 - 持续时间 求出最小值 ,即vl(Vj) = 0

例子:

 

1.求ve(i), vl(i)
2.求 e(i), l(i)
3.计算 l(i) - e(i)

1.源点最早发生时间 ve(v1) = 0

2.v2、v3、v4最找发生事件要等事件a1、a2、a3 结束才可以执行,也就是ve(v2) = 6、 ve(v3) =4 、ve(v4) = 5

3. v5顶点有两个前置事件,必须都执行完才可以执行v5。有两个时间段,一个经过v2的7,一个经过v3的5,选择多个时间的最大值7,因此ve(v5) = 7 

4. 其余节点类似

 

1.汇点最晚发生事件 vl(v9) = el(v9) =18

2.v7、v8的最晚发生事件 = 后继结点的最晚时间 - 事件的持续时间。也就是 vl(v8) =18 -4 =14   vl(v7) = 18 -2 =16。

3.v5的顶点有两个后继时间,意味着 v5的最晚发生时间要能使后面事件有最小的足够时间完成
vl(v7) - a7、vl(v8) - a8 都等于 7,vl(v5) = 7

4.其余结点类似

求活动的余量,要求出活动的最早和最晚开始时间,在相减。

弧e(i) = 弧尾的最早发生时间
弧l(i) = 弧头的最早发生时间 - 时间的持续时间

求出活动余量,活动余量为零 = 关键活动
关键路径有关键活动组成

 

如果网中有几条关键路径,则需加快同时在几条关键路径上的关键活动。
a、a8、a10 和a11要同时加快

如果一个活动处于所有的唯一的一条关键路径上,提高整个活动就能加快。
a1、a4加快都能缩短时间且互不影响。

但是不能缩短过多,否则可能会使原来的关键路径变成不是关键路径,这些必须重新寻找关键路径。

 

posted @   铜须的编程生活  阅读(752)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示