数据结构与算法—关键路径
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关键路径
若在带权的有向图中,以顶点表示事件,以有向边表示活动,边上的权值表示活动的开销(如该活动持续时间),则此带权的有向图称为边表示活动的网(Activity on Edge Network) ,简称AOE 网。
【例】图7.21 是一个网。
其中有9 个事件v 1 , v 2 , … , v 9 ;11 项活动 a 1 , a 2 , … , a 11 。
每个事件表示在它之前的活动已经完成,在它之后的活动可以开始。
如v 1 表示整个工程开始,v 9 表示整个工程结束。
V 5 表示活动a 4 和a 5 已经完成,活动a 7 和a 8 可以开始。
与每个活动相联系的权表示完成该活动所需的时间。
如活动 a 1 需要 6 天时间可以完成。
(1)AOV 网具有的性质
⒈只有在某顶点所代表的事件发生后,从该顶点出发的各有向边所代表的活动才能开始。
⒉只有在进入某一顶点的各有向边所代表的活动都已经结束,该顶点所代表的事件才能发生。
⒊表示实际工程计划的AOE 网应该是无环的,并且存在唯一的入度过为0 的开始顶点和唯一的出度为0 的完成顶点。
(2)由事件v j 的最早发生时间和最晚发生时间的定义, 可以采取如下步骤求得关键活动:
1. 从开始顶点v 1 出发, 令ve(1)=0, 按拓扑有序序列求其余各顶点的可能最早发生时间。
Ve(k)=max{ve(j)+dut(<j,k>)} (7.1 )
j ∈T
其中T 是以顶点v k 为尾的所有弧的头顶点的集合(2 ≤ k ≤ n) 。
如果得到的拓朴有序序列中顶点的个数小于网中顶点个数n ,则说明网中有环,不能求出关键路径,算法结束。
2. 从完成顶点v n 出发,令vl(n)=ve(n) ,按逆拓朴有序求其余各顶点的允许的最晚发生时间: vl(j)=min{vl(k)-dut(<j,k>)}
k ∈S
其中S 是以顶点v j 是头的所有弧的尾顶点集合(1 ≤ j ≤ n-1) 。
3. 求每一项活动a i (1 ≤ i ≤ m) 的最早开始时间e(i)=ve(j) ;最晚开始时间
l(i)=vl(k)-dut(<j,k>)。
若某条弧满足e(i)=l(i) ,则它是关键活动。
对于图7.21 所示的AOE 网,按以上步骤的计算结果见表7.3 ,可得到 a 1 , a 4 , a 7 , a 8 , a 10 , a 11 是关键活动。
(3)求出AOE 网中所有关键活动后,只要删去AOE 网中所有的非关键活动,即可得到AOE 网的关键路径。
这时从开始顶点到达完成顶点的所有路径都是关键路径。
一个AOE 网的关键路径可以不止一条,如图7.21 的AOE 网中有二条关键路径,( v 1 , v 2 , v 5 , v 7 , v 9 ) 和( v 1 , v 2 , v 5 , v 8 , v 9 ) 它们的路径长度都是16 。
如图7.24 所示。
注意:
并不是加快任何一个关键活动都可以缩短整个工程完成的时间,只有加快那些包括在所有的关键路径上的关键活动才能达到这个目的。
只有在不改变AOE 网的关键路径的前提下,加快包含在关键路径上的关键活动才可以缩短整个工程的完成时间。
关键路径
1、AOE网
用顶点表示事件,弧表示活动,弧上的权值表示活动持续的时间的有向图叫AOE(Activity On Edge
Network)网。
AOE网常用于估算工程完成时间。
2、AOE网研究的问题
(1)完成整个工程至少需要多少时间;
(2)哪些活动是影响工程的关键。
1956年,美国杜邦公司提出关键路径法,并于1957年首先用于1000万美圆化工厂建设,工期比原计划缩短了4个月。
杜邦公司在采用关键路径法的一年中,节省了100万美圆。
3、关键路径的几个术语
(1)关键路径从源点到汇点的路径长度最长的路径叫关键路径。
(2)活动开始的最早时间e(i)
(3)活动开始的最晚时间l(i) 定义e(i)=l(i)的活动叫关键活动。
(4)事件开始的最早时间ve(i)
(5)事件开始的最晚时间vl(i)
设活动ai由弧<j,k>(即从顶点j到k)表示,其持续时间记为dut(<j,k>),则
e(i)=ve(j)
l(i)=vl(k)-dut(<j,k>) (6_6_1)
求ve(i)和vl(j)分两步:
·从ve(1)=0开始向前递推
ve(j)=Max{ ve(i)+dut(<i,j>) } (6_6_2)
<i,j>T, 2<=j<=n
其中,T是所有以j为弧头的弧的集合。
·从vl(n)=ve(n)开始向后递推
vl(i)=Min{ vl(j)-dut(<i,j>) } (6_6_3)
<i,j>S, 1<=i<=n-1
其中,S是所有以i为弧尾的弧的集合。
两个递推公式是在拓扑有序和逆拓扑有序的前提下进行。
4、求关键路径的算法
(1) 输入e条弧<j,k>,建立AOE网的存储结构。
(2) 从源点v1出发,令ve(1)=0,求ve(j) 2<=j<=n。
(3) 从汇点vn出发,令vl(n)=ve(n),求vl(i) 1<=i<=n-1。
(4) 根据各顶点的ve和vl值,求每条弧s(活动)的最早开始时间e(s)和最晚开始时间l(s),其中e(s)=l(s)的为关键活动。
求关键路径是在拓扑排序的前提下进行的,不能进行拓扑排序,自然也不能求关键路径。
Status ToplogicalSort(ALGraph G,stack &T){
FindInDegree(G,indegree);
InitStack(S);count=0; ve[0..G.vexnum-1]=0;
while(!StackEmpty(S))
{ Pop(S,j);Push(T,j); ++count;
for(p=G.vertices[j].firstarc;p;p=p->nextarc)
{k=p>adjvex;
if(--indegree[k]==0) Push(S,k);
if(ve[j]+*(p->info)>ve[k]) ve[k]=ve[j]+*(p->info);
}
}
if(count<G.vexnum) return ERROR;
else return OK;
status CriticalPath(ALGraph G){
if(!ToplogicalOrder(G,T)) return ERROR;
vl[0..G.vexnum-1]=ve[0..G.vexnum-1];
while(!StackEmpty(T))
for(Pop(T,j),p=G.vertices[j].firstarc;p;p=p->nextarc)
{k=p>adjvex; dut=*(p->info);
if(vl[k]-dut<vl[j]) vl[j]=vl[k]-dut;
}
for(j=0;j<G.vexnum;++j)
for(p=G.vertices[j].firstarc;p;p=p->nextarc)
{k=p>adjvex; dut=*(p->info);
ee=ve[j]; el=vl[k];
tag=(ee==el)?’*’:’’;
printf(j,kdut,ee,el,tag);
}
}
6、求关键路径的算法分析
(1)求关键路径必须在拓扑排序的前提下进行,有环图不能求关键路径;(2)只有缩短关键活动的工期才有可能缩短工期;
(3)若一个关键活动不在所有的关键路径上,减少它并不能减少工期;(4)只有在不改变关键路径的前提下,缩短关键活动才能缩短整个工期。