您的位置:首页 > 理论基础 > 数据结构算法

有向无环图之关键路径

2018-01-28 21:48 671 查看
**有向无环图之关键路径**

1
AOE-网:边表示活动的网。AOE-网是一个带权的有向无环图,其中顶点表示事件,弧表示活动,权表示活动持续的时间。

2
通常AOE-网可用来估算工程的完成时间。

例图:



该图总共有11项活动,9个事件。每个事件表示在它之前的活动已完成,在它之后的活动可以开始,如a表示整个工程开始,i表示整个工程结束,e表示<b,e>活动和<c,e>活动已经完成。网中只有一个入度为零的点(称作源点)和一个出度为零的点(叫做汇点)。

3
AOV-网要研究的问题是:

3.1
完成整个工程至少需要多少时间?

3.2
哪些活动是影响工程进度的关键?



4.1
由于在AOV-网中有些活动是可以并行的进行,所以完成工程的最短时间是从开始点到完成点的最长路径的长度(这里所说的路径长度是指路径上各项活动持续时间之和,不是路径上弧的数目)。

4.2
路径长度最长的路径叫做关键路径(Critical Path)。

4.3
假设开始点事a,从a到g的最长路径长度叫做事件g的最早发生时间,这个时间决定了所有以g为尾的弧所表示的活动的最早开始时间。我们可以用e(i)(这个e不是图中的顶点e,只是个代号,当然也可以用其他的字母表示,i表示数字递增,e(i)意思是第几个活动)表示第i个活动的最早开始时间,还可以定义一个活动的最迟开始时间l(i)
d384
,这是在不推迟整个工程完成的前提下,第i个活动最迟必须开始的时间。两者之差意味着完成第i个活动的时间余量,就是还可以推迟多久必须开始。我们把最迟开始时间和最早开始时间相等的活动叫做关键活动。

4.4
显然,关键路径上的所有活动都是关键活动。该图的一个关键路径是(a,b,e,h,i),源点到汇点的最长路径长度是:18

4.5
第i个活动的最迟开始时间计算:源点到汇点的最长路径的长度-该活动到汇点的最长路径长度

如<d,f>活动的最迟开始时间:18-<d,f>-<f,h>-<h,i>=18-2-4-4=8

4.6
第i 个活动的最早开始时间计算:第i个活动之前的最长路径的长度

如<d,f>活动的最早开始时间:<a,d>=5

4.7
<d,f>的最迟开始时间是8,最早开始时间是5,这就意味着<d,f>活动可以推迟3天开始(8-5),都不会影响整个工程的完成。

4.8
分析关键路径的目的是辨别哪些是关键活动,以便争取提高关键活动的工效,缩短整个工期。

5
AOE-网的关键路径算法思想:求关键活动就是要找e(i)=l(i)的活动。为了求得AOE-网中活动的e(i)和l(i),首先应求得事件的最早发生时间ve(j)和最迟发生时间vl(j),**因为活动是弧,以顶点(事件)为尾,活动所依赖的事件开始,活动也就开始了**。

5.1
如果活动由弧<j,k>表示,其持续时间记为dut(<j,k>),则有如下关系:e(i)=ve(j)l(i)=vl(k)-dut(<j,k>)(vl(k)-dut(<j,k>)其实就是vl(j),上面解释过了为什么)

5.2
ve(j)和vl(j)需要分两步进行:

**
从ve(1)=0开始向前递推ve(j)=Max{ve(i)+dut(<i,j>)},其中<i,j>为图中的弧

**
从vl(n)=ve(n)起向后递推vl(i)=Min{vl(j)-dut(<i,j>)},其中<i,j>为图中的弧

这两个公式的计算必须分别在拓扑有序和逆拓扑有序的前提下进行,也就是说,ve(j)必须在v(j)(第j个顶点)的所有前驱的最早发生时间求得之后才能确定,而vl(j)则必须在v(j)的所有后继的最迟发生时间求得之后才能确定,因此可以在拓扑排序的基础上计算。

6
c语言实现上述算法的代码:git@github.com:hglspace/GetCriticalPath.git
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息