计算关键路径
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
显然活动ak的最大可利用时间是l[k]-e[k]。若最 大可利用时间等于ak边所带的权wk(即为计划时 间),则ak是关键活动。ak延期,则整个计划将 顺延。若最大可利用时间大于wk,则ak不是关 键活动,ak的完成时间允许超过wk。只要不超 过最大可利用时间,无妨于整个计划完成的进 度。我们可以采取以下步骤,计算上面定义的 几个变量值,从而找到关键活动:
由上可见,影响整个计划完成的关键活动为所有关键 路径共用的边,这些公共边称之为“桥”。寻找 “桥”的方法很多,我们给出的方法仅是其中的一 种,虽然思路比较简单,但时间效率并不高 (O(k*n2))。关于更高效的算法,可参阅有关图论 的书籍。
for t←1 to k do {枚举每一个关键活动} Begin a0←a;a0[b[t].x,b[t].y]←0;{在有向图a中去除第t个关键活动} fillchar(f,sizeof(f),false);nopath←true;{访问标志和成功标 志初始化} dfs(1);{通过深度优先搜索判断v1与vn间是否有路} if nopath then输出关键活动(b[t].x,b[t].y)和目前花费b[t].l ; end;{for}
五、 计算关键路径
【例题】计算能影响整个计划完成时间的关键活动 例题】
工厂的工程计划用一张有向图表示,有向图的结点表示事件,有向边表示活动,边上的权 标明一项活动需要的时间。结点所表示的事件实际上就是它入边代表的活动均已完成, 出边代表的活动可以开始这样一种状态。例如
上图含12项活动、9个事件。其中事件v1表示开始时活动a1、a2、a3并行实施;事件v5代表 活动a4、a5已经完成,活动a7、a8可以开始。V9表示整个计划完成。活动依事件的顺 序要求进行。例如活动a4、a5、a6只有当事Βιβλιοθήκη Baiduv2、v3、v4分别发生后才能进行,而它们 的完成又标志事件v5、v6的发生。当活动a10、a11、a12完成后,整个计划完成。上述有 向图存在唯一的入度为0的开始结点v1,表明整个计划从该事件开始;存在唯一的出度 为0的完成结点vn,表明该事件完成后,整个计划结束。现在的问题是,整个计划完成 至少需要多少时间,为提前完成计划应该加快哪些活动的速度。 输入: 输入: n(事件数,1≤n≤100) e(活动数,1≤e≤4000)。以下为e行,每行为连接两个事件的 序号以及活动需要的时间 输出: 输出:完成整个计划的最少时间。以下k行,每行为一个关键活动(i,j)和目前花费的时 间wij,加快该活动的速度能提前完成计划
由此得出算法 活动的时间矩阵w初始化为0; 输入带权有向图的信息(顶点数n、活动数e和活动的时间矩阵w); if 图中的所有顶点不能排成一个拓扑序列 then 失败退出; fillchar(ee,sizeof(ee),0); for i←1 to n-1 do for j←1 to n do {计算各个事件的最早发生时间表ee} if ((i,j)∈E)and(ee[j]<ee[i]+wij) then ee[j]←ee[i]+wij; 输出完成整个计划的最少时间ee[n]; for i←1 to n do le[i]←ee[n]; {所有事件的最晚发生时间初始化} k←0; {关键活动数初始化} for i←n-1 downto 1 do {计算各个事件的最晚发生时间表le} for j←1 to n do if (wij<>0)and(le[i]>ee[j]-wij) then le[i]←ee[j]-wij; fillchar(a,sizeof(a),0); {由关键活动组成的有向图a初始化} for i←1 to n-1 do {计算关键活动和由关键活动组成的有向图a} for j←1 to n do if (wij<>0 )and(le[j]-ee[i]=wij) then begin k←k+1;b[k].x←i;b[k].y←j;b[k].l←wij;a[i,j]←1;end;{then}
procedure dfs(i:integer);{深度优先搜索a0图中由顶点i出发的所有可能路径。若存在一条 到达顶点n的路径,则nopath设为false;否则为true} begin f[i]←true; if i=n then begin nopath←false;exit;end{then} for j←1 to n do begin if (not(f[j]))and(a0[i,j]=1) then dfs(j); end;{for} end;{dfs}
⑶计算能影响整个计划完成时间的关键活动
在找出关键活动后,只要将所有的非关键活动从AOV网中去掉,这时从开 始结点至完成结点的所有路径都是关键路径。AOV网中的关键路径可能不止 一条。并不是加快任一关键活动就可以缩短整个计划的完成时间。只有加快 并不是加快任一关键活动就可以缩短整个计划的完成时间。 并不是加快任一关键活动就可以缩短整个计划的完成时间 那些包括在所有关键路径上的关键活动才能达到目的的。 那些包括在所有关键路径上的关键活动才能达到目的的。设 a为关键路径组成的01矩阵,a0为辅助矩阵;b为关键活动序列,其中b[k].x、 b[k].y和b[k].l分别为第k项关键活动的两个顶点序号和花费;nopath为v1至vn间 有路可走的标志; 首先计算关键活动序列b和关键活动组成的有向图a。然后逐一地在a图中去 除一条关键活动边,看一看是否存在v1至vn的路径。如果v1至vn间无路可走,则 说明这个关键活动为影响整个计划完成的关键活动。判别过程采用深度优先 搜索
⑴关键路径的由来 如果有向图的结点表示活动,有向边表示活动间的优先关系,那 么我们通过拓扑排序将图中的结点排成一个满足活动先后顺序 要求的线性序列。如果有向有权图满足下述条件 ⑴存在唯一的入度为0的结点和唯一的出度为0的结点; ⑵可通过拓扑排序将图中的结点排成一个满足活动先后顺序要求 的线性序列(即有向图没有回路) 则称该有向有权图为AOV网(活动结点网络)。 利用AOV网可以估算出整个计划完成至少需要多少时间,为 提前完成计划应该加快哪些活动的速度等问题。解决这些问题 有一种有效的方法——求关键路径方法。由于AOV网中的活动 可以并行进行,因此完成整个计划的最少时间是从开始结点v1 到完成结点vn的最长路径长度(路径上各边权的和)。具有最 大长度的路径称作关键路径。在上图中v1→v2→v5→v8→v9 是 一条关键路径,长度为18。换句话说,整个计划至少需要18个 时间单位完成。关键路径上的活动又称关键活动。如果不能按 期完成这些活动会贻误整个计划。找出关键活动后就可以适当 调度,集中力量于关键活动,以保证计划如期或提前完成。
⑵关键路径的计算
为了找出关键活动,我们先定义几个变量: n—AOV网的结点数; m—AOV网的有向边数; ee[i]—vi事件可能发生的最早时间,即从开始结点v1至结点vi的 最长路径长度。我们从ee(1)=0开始向前递推 ee[j]=max{ee[i]+wij|(i,j)E}; le[i]—在保证完成结点vn所代表的事件在ee[n]时刻发生的前提 下,事件vi允许发生的最晚时 间,即le[i]=ee(n)-vi至vn最长路 径长度。我们从le[n]=ee[n]出发向后递推 le[i]=min{le[j]-wij |(i,j)E} e[k]—活动ak(对应边<vi,vj>)可能的最早开始时间,即等于 事件vi的可能的最早发生时间ee[i]; l[k]—活动ak(对应边<vi,vj>)允许的最晚完成时间,即等于事件vj 允许最晚发生时间le[j]; (1≤i, j≤n, 1≤k≤m)]