第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个事件v1,
v2,…,v9,每个事件表示在它之前的活动已经完成,在它之后的活动可
以开始。
如v1表示整个工程开始,v9表示整个工程结束,v5表示a4和a5
已经完成,a7和a8可以开始。
与每个活动相联系的数是执行该活动所需的
时间。
比如,活动a1需要6天,a2需要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)的活动叫做关键活动。
显然,关键路径上的所有活动都是关键活动,因此提前完成非关键活动并不能加快工程的进度。
因此,分析关键路径的目的是辨别哪些是关键活动,以便争取提高关键活动的工效,缩短整个工期。
例:上图中从v1到v9的最长路径是(v1,v2,v5,v8,v9),路径长度是18,即v9的最早发生时间是18。
解决方案:
|
由上分析可知,辨别关键活动就是要找e(i)=l(i)的活动。
为了求得AOE-网中活动的e(i)和l(i),首先求事件的最早发生时间ve(j)和最迟发生时间
vl(j)。
如果活动ai由弧<j,k>表示,其持续时间记为dut(<j,k>),则有如下关系:e(i ) = ve(j) (1)
l(i) = vl(k)-dut(<j,k>)
求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<n-1);
(2) 在算法中增加一个计算vj的直接后继vk的最早发生时间的操作:若ve(j)+dut(<j,k>) > ve(k),则ve(k) = ve(j)+dut(<j,k>);
(3) 为了能按逆拓扑有序序列的顺序计算各顶点的vl值,需记下在拓扑排序的过程中求得的拓扑有序序列,则需要在拓扑排序算法中,增设一个栈以记录拓扑有序序列,则在计算求得各顶点的ve 值之后,从栈顶至栈底便为逆拓扑有序序列。
·
最短路径
问题背景:
假若要在计算机上建立一个交通咨询系统则可采用图的结构来表示实际的交通网络。
图中顶点表示城市,边表示城市间的交通。
这个咨询系统可以回答旅客提出的各种问题。
来看一简单的图的最短路径问题。
例:一位旅客要从A城到B城,可能希望选择一条途中中转次数最少的,或交通费用最节省的路线;而对于司机来说,里程和速度则是他们感兴趣的。
为了在图上表示有关信息,可对边赋以权,权的值表示两城市间的距离,或途中所需时间,或交通费用等等。
此时路径长度的度量就不再是路径上边的数目,而是路径上边的权值之和。
考虑到交通图的有向性(如逆水和顺水的船速就不一样),本节将讨论带权有向图,并称路径上的第一个顶点为源点,最后一个顶点为终点。
{
最短路径问题:如果从图中源点出发到达终点的路径可能不止一条,如何找到一条路径使得沿此路径上各边的权值总和达到最小。
从某个源点到其余各顶点的最短路径
问题描述:给定带权有向图G和源点v,求从v到G中其余各顶点的最短路径。
限定各边上的权值大于或等于0。
例:带权有向图G中从v0到其余各顶点之间的最短路径如图所示。
、
如何在计算机中求得最短路径
迪杰斯特拉(Dijkstra)提出了一个按路径长度递增的次序,逐步产生最短路径的算法。
首先求出长度最短的一条最短路径,然后参照它求出长度次短的一条最短路径,依次类推,直到从顶点v到其它各顶点的最短路径全部求出为止。
用反证法来证明:假设此路径上有一个顶点不在S中(v p∈V-S) ,则说明存在一条终点不在S而长度比此路径短的路径。
但是,这是不可能的。
因为我们是按路径长度递增的次序来产生各最短路径的,故长度比此路径短的所有路径均已产生,它们的终点必定在S中,即假设不成立。
Dijkstra算法需一个顶点集合,初始时集合内只有源点V0,以后陆续将已求得最短路径的顶点加入到集合中,直到全部顶点都进入。
集合可用一维数组S来表示,凡集合S以外的顶点,其相应数组元素S[i]为0,否则为1。
另需一个一维数组dist,每个顶点对应数组的一个单元,记录从源点到其他各顶点当前的最短路径长度,初值为dist[i]=cost[V0][i],i=1…n。
数
}//for
}//ShortestPath_DIJ
算法分析:
第一个FOR循环的时间复杂度是O(n),第二个FOR循环共进行n-1次,每次执行的时间是O(n)。
所以总时间复杂度是O(n2)。
人们可能只希望找到从源点到某一个特定的终点的最短路径,但是,这个问题和求源点到其它所有顶点的最短路径一样复杂,其时间复杂度也是O(n2) 。
例:迪杰斯特拉算法。