**有向无环图之关键路径**
1 AOE-网:边表示活动的网。AOE-网是一个带权的有向无环图,其中顶点表示事件,弧表示活动,权表示活动持续的时间。
2 通常AOE-网可用来估算工程的完成时间。
例图:
该图总共有11项活动,9个事件。每个事件表示在它之前的活动已完成,在它之后的活动可以开始,如a表示整个工程开始,i表示整个工程结束,e表示<b,e>活动和<c,e>活动已经完成。网中只有一个入度为零的点(称作源点)和一个出度为零的点(叫做汇点)。
3 AOV-网要研究的问题是:
3.1 完成整个工程至少需要多少时间?
3.2 哪些活动是影响工程进度的关键?
4
4.1 由于在AOV-网中有些活动是可以并行的进行,所以完成工程的最短时间是从开始点到完成点的最长路径的长度(这里所说的路径长度是指路径上各项活动持续时间之和,不是路径上弧的数目)。
4.2 路径长度最长的路径叫做关键路径(Critical Path)。
4.3 假设开始点事a,从a到g的最长路径长度叫做事件g的最早发生时间,这个时间决定了所有以g为尾的弧所表示的活动的最早开始时间。我们可以用e(i)(这个e不是图中的顶点e,只是个代号,当然也可以用其他的字母表示,i表示数字递增,e(i)意思是第几个活动)表示第i个活动的最早开始时间,还可以定义一个活动的最迟开始时间l(i),这是在不推迟整个工程完成的前提下,第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