首页 > 代码库 > 关键路径的计算

关键路径的计算

          从源点到汇点路径长度最长的路径为该工程的关键路径,即关键路径可以保证所有路径的活动都能够完成。

      ok,再次进入我们的作业题:

      如下图所示的AOE网(弧上权值代表活动的持续天数)

           1)完成此工程最少所需要多少天?
           2)哪些是关键活动,在图中表示出关键路径

        

     我们先计算最早发生时间ve和最迟发生时间vl:

 12345678910
Ve05612151616192123
Vl09612152116192123

     首先呢,编号1和编号10分别为该工程的源点和汇点,我们规定最早发生时间ve(源点)=0,最迟发生时间vl(汇点)=ve(汇点)。那么这两个量该如何计算呢,看图:


     对于事件i来说,ve(i) = Max{ve(m) + dut(<m, i>)},vl(i) = Min{vl(j) – dut(<i, j>)};其中ve(m)代表i前一个事件的最早发生时间,dut(<m, i>)表示从m到i的持续时间,大家可以把它看成一个递归算法,一直调用ve(),直到ve(源点)为止,然后取其最大值,因为它要保证所有路径上的活动都能完成;而最迟发生时间和前者一样,一直递归调用vl(),直到vl(汇点)为止,然后取其最小值即可。

    回到原题中对照例图可以很快地得到表格所示内容。

    我们再来看两个概念:e(i)和l(i),前者为活动ai 的最早可能开始时间,后者为活动ai的最迟允许开始时间。区别于前边的ve和vl,e和l为标识的是某活动的时间,而前者是某事件的时间。

    假如从事件m到事件i的活动为af,则有e(f)=ve(m), l(f)=vl(i)–dut(<m,i>) ,即活动af的最早可能开始时间为其弧尾事件最早可能发生时间;最迟允许开始时间为其弧尾事件最迟发生时间与两个事件的持续时间之差。是不是感觉有点别扭,但只要理解了这几个关键词也就很容易看懂了。于是乎 e(k) = l(k)的活动就是关键活动 ,请看图表:

 a1a2a3a4a5a6a7a8a9a10a11a12a13
5636334145242
e005661212151516191621
l4096121217151516192121

     由图和前边计算的ve和vl可以得到各活动的e和l,如上表所示,则关键活动为a2,a4,a6,a8,a9,a10,a11和a13,所以完成该工程至少需要的天数d=6+6+3+1(4)+5(2)+2=23,该工程的关键路径有两条,即1->3->4->5->7->9->10和1->3->4->5->8->9->10。