AOE网(Activity On Edge network),即边表示活动的网络,与AOV网相对应的是。它通常表示一个工程的计划或进度。
AOE网是一个有向带权图,图1中的:
边:表示活动(子工程),
边上的权:表示该活动的持续时间,即完成该活动所需要的时间;
顶点:表示事件,每个事件是活动之间的转接点,即表示它的所有入边活动到此完成,所有出边活动从此开始。
其中有两个特殊的顶点(事件),一个称做源点,它表示整个工程的开始,亦即最早活动的起点,显然它只有出边,没有入边;另一个称做汇点,它表示整个工程的结束,亦即最后活动的终点,显然它只有入边,没有出边。除这两个顶点外,其余顶点都既有人边,也有出边,是入边活动和出边活动的转接点。
在一个AOE网中,若包含有n个事件,通常令源点为第0个事件,汇点为第n-1个事件,其余事件的编号(即顶点序号)分别为1~n-2。
一个AOE网如图,该网中包含有10项活动和7个事件。
例如,边<1,2>表示活动al,持续时间(即权值)为3,假定以天为单位,即a1需要3天完成,它以V1事件为起点,以V2事件为终点;边<2,5>和<2,4>分别表示活动a4和a5,它们的持续时间分别为4天和2天,它们均以V2事件为起点,以V5和V4事件为终点。该网中的源点和汇点分别为第1个事件V1和最后一个事件V7,它们分别表示整个工程的开始和结束。
对于一个AOE网,待研究的问题是:
(1)整个工程至少需要多长时间完成?
(2)哪些活动是影响工程进度的关键?
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 371.25pt; HEIGHT: 162pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image001.png"></imagedata></shape>
图1 AOE网
1.事件的最早发生时间与活动的最早开始时间的关系
在AOE网中,一个顶点事件的发生或出现必须在它的所有入边活动(或称前驱活动)都完成之后,即只要有一个入边活动没有完成,该事件就不可能发生。所以:
一个事件的最早发生时间是它的所有入边活动,或者说最后一个入边活动刚完成的时间。
一个活动的开始必须在它的起点事件发生之后,也就是说,一个顶点事件没有发生时,它的所有出边活动(或称后继活动)都不可能开始,所以:
一个活动的最早开始时间是它的起点事件的最早发生时间。若用Ve[j]表示顶点Vj事件的最早发生时间,用e[i]表示Vj一条出边活动ai的最早开始时间,则有e[i]=Ve[j]。
2.求事件的最早发生时间
对于源点事件来说,因为它没有入边,所以随时都可以发生,整个工程的开始时间就是它的发生时间,亦即最早发生时间,通常把此时间定义为0,从此开始推出其他事件的最早发生时间。
例如,如图所示的AOE网中,
V5事件的发生必须在a4和a8活动都完成之后,而a4和a8活动的开始又必须分别在V2和V4事件的发生之后,V2和V4事件的发生又必须分别在a1和a2活动的完成之后,因a1和a2的活动都起于源点,其最早开始时间均为0,所以a1和a2的完成时间分别为3和6,这也分别是V2和V4的最早发生时间,以及a4和a8的最早开始时间,故a4和a8的完成时间分别为7和7,由此可知V5事件的最早发生时间为7,即所有入边活动中最后一个完成的时间。
从以上分析可知,一个事件的发生有待于它的所有入边活动的完成,而每个入边活动的开始和完成又有待于前驱事件的发生,而每个前驱事件的发生又有待于它们的所有入边活动的完成,……总之,一个事件发生在从源点到该顶点的所有路径上的活动都完成之后,显然,其最早发生时间应等于从源点到该顶点的所有路径上的最长路径长度。这里所说的路径长度是指带权路径长度,即等于路径上所有活动的持续时间之和。
如从源点V1到顶点V4共有三条路径,长度分别为5、6和3,所以V4的最早发生时间为6。
从源点V1到汇点V7有多条路径,通过分析可知,其最长路径长度为10,所以汇点V7的最早发生时间为10。汇点事件的发生,表明整个工程中的所有活动都已完成,所以完成图所对应的工程至少需要10天。
如何从源点V1的最早发生时间1出发,求出其余各事件的最早发生时间。
求一个事件Vk的最早发生时间(即从源点V1~Vk的最长路径长度)的常用方法是:
由它的每个前驱事件Vi的最早发生时间(即从源点V1~Vi的最长路径长度)分别加上相应入边<i,k>上的权,其值最大者就是Vk的最早发生时间。由此可知,必须按照拓扑序列中的顶点次序(即拓扑有序)求出各个事件的最早发生时间,这样才能保证在求一个事件的最早发生时间时,它的所有前驱事件的最早发生时间都已求出。
设Ve[k]表示vk事件的最早发生时间,Ve[j]表示vk的一个前驱事件vj的最早发生时间,dut(<j,k>)表示边<j,k>上的权,p表示vk顶点所有入边的集合,则网中每个事件vk(0≤k≤n-1)的最早发生时间Ve可由下式,按照拓扑有序计算出来。
Ve(k) = 0 (k = 0)
max{Ve[j] +dut(< j,k >)} (l≤k≤n- 1, <j,k>∈p)
按照此公式和拓扑有序计算出图所示的AOE网中每个事件的最早发生时间为:
Ve(1) = 0
Ve(2) = Ve(1) +dut( <1,2 > ) =0+3=3
Ve(3) = Ve(1) + dut( <1,3 > ) =0+2 = 2
Ve(4) = max{Ve(1) + dut( < 1,4 > ), Ve(2) + dut( < 2,4 > ), Ve(3) + dut( < 3,4 > ) }= max{0 +6,3+ 2,2+1} =6
Ve(5) = max{Ve(2) + dut( < 2,5 > ),Ve(4) +dut( < 4,5 > )} = max{3+4,6 + 1}= 7
Ve(6) = Ve(3) +dut( <3,6> ) =2+3= 5
Ve(7) = max{Ve(5) +dut( < 5,7 > ), Ve(6) +dut( <6,7 > )} = max{7 + 3,5 + 4} = 10
最后得到的Ve(7)就是汇点的最早发生时间,从而可知整个工程至少需要10天完成。
3.事件的最迟发生时间与活动的最迟开始时间的关系
事件的最迟发生时间:在不影响整个工程按时完成的前提下,一些事件可以不在最早发生时间发生,而允许向后推迟一些时间发生,我们把最晚必须发生的时间叫做该事件的最迟发生时间。
同样,在不影响整个工程按时完成的前提下,一些活动可以不在最早开始时间开始,而允许向后推迟一些时间开始,我们把最晚必须开始的时间叫做该活动的最迟开始时间。AOE网中的任一个事件若在最迟发生时间仍没有发生或任一项活动在最迟开始时间仍没有开始,则必将影响整个工程的按时完成,使工期拖延。
若用Vl[k]表示顶点Vk事件的最迟发生时间,用l[i]表示Vk的一条入边<j,k>上活动ai的最迟开始时间,用dut(<j,k>)表示ai的持续时间,则有 l[i]= Vl [k]-dut(<j,k>)
因ai活动的最迟完成时间也就是它的终点事件Vk的最迟发生时间,所以ai的最迟开始时间应等于Vk的最迟发生时间减去ai的持续时间,或者说,要比Vk的最迟发生时间提前ai所需要的时间。
4.求事件的最迟发生时间
为了保证整个工程的按时完成,把汇点的最迟发生时间定义为它的最早发生时间,即Vl [n]= Ve [n] Vl。其他每个事件的最迟发生时间应等于汇点的最迟发生时间减去从该事件的顶点到汇点的最长路径长度,或者说,每个事件的最迟发生时间比汇点的最迟发生时间所提前的时间应等于从该事件的顶点到汇点的最长路径上所有活动的持续时间之和。
求一个事件Vj的最迟发生时间的常用方法是:由它的每个后继事件Vk的最迟发生时间分别减去相应出边<j,k>上的权,其值最小者就是vj的最迟发生时间。由此可知,必须按照逆拓扑有序求出各个事件的最迟发生时间,这样才能保证在求一个事件的最迟发生时间时,它的所有后继事件的最迟发生时间都已求出。
设Vl [j]表示待求的Vj事件的最迟发生时间,Vl [k]表示Vj的一个后继事件Vk的最迟发生时间,dut(<j,k>)表示边<j,k>上的权,s表示Vj顶点的所有出边的集合,则AOE网中每个事件Vj (0≤j≤n-1)的最迟发生时间:
Vl [j]= Ve [n- 1] (j = n- 1)
min{ Vl [k]-dut(<j,k>)} (0≤j≤n-2, <j,k>∈s)
按照此公式和逆拓扑有序计算出图AOE网中每个事件的最迟发生时间为:
Vl [7] = Ve [7] = 10
Vl [6] = Vl [7] - dut(<6,7> ) = 10-4= 6
Vl [5] = Vl [7] -dut( <5,7> ) = 10-3= 7
Vl [4] = Vl [5] -dut( <4,5> ) = 7-1=6
Vl [3] = min{ Vl [4] -dut( <3,4> ), Vl [6] -dut( <3,6> )}= min{ 6 - 1,6-3} = 3
Vl [2] = min{ Vl [4] -dut( <2,4> ), Vl [5] -dut( <2,5> )}= min{ 6 - 2,7-4} = 3
Vl [l] = min{ Vl [2] -dut(<1,2>), Vl [3]-dut(<1,3> ), Vl [4] -dut(<1,4>)} = min{3-3,3-2,6-6}= 0
5.根据AOE网中每个事件的最早发生时间和最迟发生时间计算出每个活动的最早开始时间和最迟开始时间。
设事件Vj的最早发生时间为Ve[j],它的一个后继事件Vk的最迟发生时间为Vl [k],则边<j,k>上的活动aj的最早开始时间e[i]和最迟开始时间l[i]的计算公式重新列出如下:
e[i]= Ve[j]
l[i]= Vl [k]-dut(<j,k>)
根据此计算公式可计算出AOE网中每一个活动aj的最早开始时间e[i],最迟开始时间l[i]和开始时间余量l[i]-e[i]。
列出图6-27中每一活动的这三个时间。
ai |
a1 |
a2 |
a3 |
a4 |
a5 |
a6 |
a7 |
a8 |
a9 |
a10 |
e(i) |
0 |
0 |
0 |
3 |
3 |
0 |
2 |
6 |
7 |
5 |
l(i) |
0 |
0 |
1 |
3 |
4 |
0 |
3 |
6 |
7 |
6 |
l(i)- e(i) |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
表中余量的说明:
有些活动的开始时间余量不为0,表明这些活动不在最早开始时间开始,至多向后拖延相应的开始时间余量所规定的时间开始也不会延误整个工程的进展。如对于活动a5,它最早可以从整个工程开工后的第3天开始,至多向后拖延1天,即从第4天开始。
有些活动的开始时间余量为0,表明这些活动只能在最早开始时间开始,并且必须在持续时间内按时完成,否则将拖延整个工期。我们把开始时间余量为0的活动称为关键活动,由关键活动所形成的从源点到汇点的每一条路径称为关键路径。
<shape id="_x0000_i1026" style="WIDTH: 381.75pt; HEIGHT: 107.25pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image003.png"><font color="#000000" size="3"></font></imagedata></shape>
图2 关键路径
关键路径实际上就是从源点到汇点具有最长路径长度的那些路径,即最长路径。这很容易理解,因为整个工程的工期就是按照最长路径长度计算出来的,即等于该路径上所有活动的持续时间之和。当然一条路径上的活动只能串行进行,若最长路径上的任一活动不在最早开始时间开始,或不在规定的持续时间内完成,都必然会延误整个工期,所以每一项活动的开始时间余量为0,故它们都是关键活动。
6.求出关键路径的意义
可通过加快关键活动(即缩短它的持续时间)来实现缩短整个工程的工期。
但并不是加快任何一个关键活动都可以缩短整个工程的工期。只有加快那些包括在所有关键路径上的关键活动才能达到这个目的。
例如,加快图中关键活动 a 2 的速度,使之由 6 天完成变为 4 天完成,则不能使整个工程的工期由 10 天变为 8 ,因为另一条关键路径 {V 1 , V 2 , V 5 , V 7 } 中不包括活动 a 2 ,,这只能使它所在的关键路径 {V 1 , V 4 , V 5 , V 7 } 变为非关键路径。而活动 a 9 是包括在所有的关键路径中的,若活动 a 9 由 3 天变为 2 天完成,则整个工程的工期可由 10 天缩短为 9 天。另一方面,关键路径是可以变化的,提高某些关键活动的速度可能使原来的非关键路径变为新的关键路径,因而关键活动的速度提高是有限度的。例如,图 1 中关键活动 a 9 由 3 改为 2 后,路径 {V 1 , V 3 , V 6 , V 7 } 也变成了关键路径,此时,再提高 a 9 的速度也不能使整个工程的工期提前。