基本概念
描述了活动和活动间依赖关系的图,其中节点表示项目的里程碑(活动结束) ,线表示活动,线对应的时间表示活动的持续时间。
如图例中 ,A->B 的这条线代表的这个活动从 A 开始,需要做 3天,才能结束,到达 B 里程碑(标志着 A->B 这条线代表的活动的结束)。
注意:图中的点不代表活动,并不能说活动 A 用 3 天到达活动 B,这是不准确的
如到达 I 里程碑的边有两条, D->I, B->I,意思是有两个活动,完成后到达里程碑 I,并不能说 I 是个活动,如果这么理解会在计算最晚开始时间时出现错误。
估算项目完成时间
关键路径
定义: 从起点到终点总花费时间最长的路径,即这个项目的最短完成时间,因为如果这条路径无法完成那么整个项目都不能算完成。所以这条路径上的任务耽误一点都会影响最后项目完成时间。
如上图,其关键路径为 A->B->D->I->J->L = 20,其他路径都比它短。
冗余时间
在不耽误总体进度的前提下最晚开始时间和最早开始时间的差值,表示这个任务的机动开始时间,从最早开始时间开始,最晚可以拖的天数,再晚就会影响整个项目的完成时间。
简而言之,就是一个活动你可以偷几天的懒而不耽误最后的理论进度(不晚于关键路径的结束时间)
因此,路径越短,冗余时间越长
另外可以得出,关键路径就是冗余时间为0的路径;一个活动图可能会有多条关键路径。
最早最晚开始时间
以上图为例,开始逐步计算各个活动的最早最晚开始时间,(活动开始时间从1开始),表示方式为<最早开始时间,最晚开始时间,冗余时间>
:
- 首先计算关键路径,可以得出Lab=<1,1,0>L_{ab}=<1,1,0>Lab=<1,1,0>,Lbd=<4(1+3),4(1+3),0>L_{bd}=<4(1+3),4(1+3),0>Lbd=<4(1+3),4(1+3),0>,Ldi=<9(4+5),9(4+5),0>L_{di}=<9(4+5),9(4+5),0>Ldi=<9(4+5),9(4+5),0>,Lij=<11,11,0>L_{ij}=<11,11,0>Lij=<11,11,0>,Ljl=<13,13,0>L_{jl}=<13,13,0>Ljl=<13,13,0>
关键路径是完全不能拖延的,而其余的非关键路径,则会有一定的冗余时间,现在从后往前开始计算最晚开始时间
- l是结束里程碑,时间点为21,因此从l对应的非关键路径(该例仅有LklL_{kl}Lkl)开始,逐步计算最晚开始时间:
- Lkl=<?,18(21−3),?>L_{kl}=<?,18(21-3),?>Lkl=<?,18(21−3),?>,Ljk=<?,16(18−2),?>L_{jk}=<?,16(18-2),?>Ljk=<?,16(18−2),?>,Lhk=<?,14(18−4),?>L_{hk}=<?,14(18-4),?>Lhk=<?,14(18−4),?>,Lgh=<?,11(14−3),?>L_{gh}=<?,11(14-3),?>Lgh=<?,11(14−3),?>,Lgj=<?,11(13−2),?>L_{gj}=<?,11(13-2),?>Lgj=<?,11(13−2),?>,Leg=<?,8(11−3),?>L_{eg}=<?,8(11-3),?>Leg=<?,8(11−3),?>,Lae=<?,4(8−4),?>L_{ae}=<?,4(8-4),?>Lae=<?,4(8−4),?>,Lfh=<?,13(14−1),?>L_{fh}=<?,13(14-1),?>Lfh=<?,13(14−1),?>,Lcf=<?,10(13−3),?>L_{cf}=<?,10(13-3),?>Lcf=<?,10(13−3),?>,Lac=<?,5(10−5),?>L_{ac}=<?,5(10-5),?>Lac=<?,5(10−5),?>,Lbi=<?,5(11−6),?>L_{bi}=<?,5(11-6),?>Lbi=<?,5(11−6),?>
如果你认真计算了,可能会有以下问题:
- LgjL_{gj}Lgj中
j
向后连接两个节点l
和k
,使用哪个边的最晚开始时间计算?最后选择了关键路径LjlL_{jl}Ljl的最晚开始时间,因为
jl
是关键路径,是不能耽误的,而j
里程碑的达成需要gj
和ij
两个活动共同完成,gj
的最晚开始时间的计算应该以jl
的最晚开始时间点为基准来进行计算。
- LaeL_{ae}Lae、LacL_{ac}Lac的最早开始时间为什么是不确定的?
实际是确定的,第一个节点相连的活动最早开始时间肯定是1,但是为了统一格式,专一计算最晚开始时间,所以我写的是
?
- 接下来再次从前往后,计算非关键路径的最早开始时间,同时因为所有活动的最晚开始时间确定,可以同时求出冗余时间:
- Lae=<1,4,3>L_{ae}=<1,4,3>Lae=<1,4,3>,Leg=<5,8,3>L_{eg}=<5,8,3>Leg=<5,8,3>,Lgj=<7,11,4>L_{gj}=<7,11,4>Lgj=<7,11,4>,Lac=<1,5,4>L_{ac}=<1,5,4>Lac=<1,5,4>,Lcf=<6,10,4>L_{cf}=<6,10,4>Lcf=<6,10,4>,Lfh=<9,13,4>L_{fh}=<9,13,4>Lfh=<9,13,4>,Lgh=<8,11,3>L_{gh}=<8,11,3>Lgh=<8,11,3>
- 从前向后,以这个图为例,在活动LhkL_{hk}Lhk,LjkL_{jk}Ljk的时候会有一些问题,即选取之前那个活动的最早开始时间进行计算,这个时候可以参考上面对最晚开始时间的选取,关键在于理解一个节点相当于一个里程碑,只有到达节点代表节点之前的所有活动都完成了
- 因此多汇点的节点之后的活动的最早开始时间应该是所有前置任务中完成较晚的那一个时间点
- 因此Lhk=<max(9+1,8+3)=11,14,3>L_{hk}=<max(9+1,8+3)=11,14,3>Lhk=<max(9+1,8+3)=11,14,3>,Ljk=<max(11+2,7+2)=13,16,3>L_{jk}=<max(11+2,7+2)=13,16,3>Ljk=<max(11+2,7+2)=13,16,3>,Lkl=<max(13+2,11+4)=15,18,3>L_{kl}=<max(13+2,11+4)=15,18,3>Lkl=<max(13+2,11+4)=15,18,3>