第20讲-关键路径与最短路径
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构第20次课
(续表)
思考.题
作业题试对下图所示的AOE网络,解答下列问题。
(1) 这个工程最早可能在什么时间结束。
(2) 求每个事件的最早开始时间Ve[i]和最迟开始时间Vl[I]。
(3) 求每个活动的最早开始时间e( )和最迟开始时间l( )。
(4) 确定哪些活动是关键活动。画出由所有关键活动构成的图,指出哪些活动加速可使整个工程提前完成。
*参考资料《数据结构辅导与提高》,徐孝凯编著,清华大学出版社
《数据结构习题解答与考试指导》,梁作娟等编著,清华大学出版社
授课内容
关键路径
对整个工程和系统,人们关心的是两个方面的问题:
一)工程能否顺利进行(对AOV网进行拓扑排序)
二)估算整个工程的完成所必须的最短时间(对AOE网求关键路径)
1. AOE-网
}
与AOV-网相对应的是AOE-网(Activity On Edge),即边表示活动的网。
AOE-网是一个带权的有向无环图,其中,顶点表示事件(Event),弧表示活
动,权表示活动持续的时间。通常,AOE-网可用来估算工程的完成时间。
例:下图是一个假想的有11项活动的AOE-网。其中有9个事件v
1
,
v
2
,…,v
9
,每个事件表示在它之前的活动已经完成,在它之后的活动可以
开始。如v
1
表示整个工程开始,v
9
表示整个工程结束,v
5
表示a
4
和a
5
已经
完成,a
7
和a
8
可以开始。与每个活动相联系的数是执行该活动所需的时间。
比如,活动a
1
需要6天,a
2
需要4天等。
和AOV-网不同,对AOE-网有待研究的问题是:
(1)完成整项工程至少需要多少时间
(2)哪些活动是影响工程进度的关键
2. 关键路径
由于在AOE-网中有些活动可以并行地进行,所以完成工程的最短时间
是从开始点到完成点的最长路径的长度(这里所说的路径长度是指路径上
各活动持续时间之和,不是路径上弧的数目)。路径长度最长的路径叫做关
备注:
回顾
键路径(Critical Path)。
假设开始点是v1,从v1到v i的最长路径长度叫做事件v i的最早发生时间。这个时间决定了所有以v
i
为尾的弧所表示的活动的最早开始时间。我
们用e(i)表示活动a
i
的最早开始时间。还可以定义一个活动的最迟开始时
间l(i),这是在不推迟整个工程完成的前提下,活动a
i
最迟必须开始进行
的时间。两者之差l(i)-e(i)意味着完成活动a
i
的时间余量。我们把l(i)=e(i)的活动叫做关键活动。显然,关键路径上的所有活动都是关键活动,因此提前完成非关键活动并不能加快工程的进度。因此,分析关键路径的目的是辨别哪些是关键活动,以便争取提高关键活动的工效,缩短整个工期。
例:上图中从v
1到v
9
的最长路径是(v
1
,v
2
,v
5
,v
8,
v
9
),路径长度是18,
即v
9
的最早发生时间是18。
解决方案:
]
由上分析可知,辨别关键活动就是要找e(i)=l(i)的活动。为了求得AOE-网中活动的e(i)和l(i),首先求事件的最早发生时间ve(j)和最迟发生时间vl(j)。如果活动ai由弧
e(i ) = ve(j) (1)
l(i) = vl(k)-dut(
求ve(j)和vl(j)需分两步进行:
(1) 从ve(0)开始向前递推
其中,T是所有以第j个顶点为头的弧的结合。
(2) 从vl(n-1)=ve(n-1)起向后递推
其中,S是所有以第i个顶点为尾的弧的集合。
这两个递推公式的计算必须分别在拓扑有序和逆拓扑有序的前提下进行。也就是说ve(j-1)必须在vj的所有前驱的最早发生时间求得之后才能确定,而vl(j-1)则必须在vj的所有后继的最迟发生时间求得之后才能确定。因此,可以在拓扑排序的基础上计算ve(j-1)和vl(j-1)。
\
所以,求关键路径的算法:
(1) 输入e条弧(j,k),建立AOE网的存储结构。
(2) 从源点v0出发,令ve[0]=0按拓扑有序求其余各顶点的最早发生时ve[i](1≤i≤ n-1)。如得到的拓扑序列中顶点个数小于网中顶点数n,则说明网中存在环,不能求关键路径,算法终止;否则执行步骤(3)。
(3) 从汇点vn出发,令vl[n-1]= ve[n-1],按逆拓扑有序求其余各顶点的最迟发生时间vl[i](n-2 ≥i≥ 2);
(4) 根据各顶点的ve和vl值,求每条弧s的最早开始时间e(s)和最迟开始时间l(s)。若某条弧满足条件e(s)=l(s),则为关键活动。
计算顶点的ve值是在拓扑排序的过程中进行的。计算ve需对拓扑排序的算法作如下修改:
(1) 在拓扑排序之前设初值,令ve(i)=0(0<=i (2) 在算法中增加一个计算vj的直接后继vk的最早发生时间的操作:若 ve(j)+dut( (3) 为了能按逆拓扑有序序列的顺序计算各顶点的vl值,需记下在拓扑排序的过程中求得的拓扑有序序列,则需要在拓扑排序算法中,增设一个栈以记录拓扑有序序列,则在计算求得各顶点的 ve 值之后,从栈顶至栈底便为逆拓扑有序序列。 先将拓扑排序算法改写成算法1,则算法2便为求关键路径的算法。