AOE网络与关键路径(一)

1、与AOV网络密切相关的是AOE网络。如果在DAG中用有向边表示一个工程的各项活动,用有向边上的权值表示活动的持续时间,用顶点表示事件,则这种有向图叫做用边表示活动的网络(Activity On Edge),简称AOE网络

2、由于整个工程只有一个开始点和一个完成点,所以称开始点(入度为0)的点为源点,称结束点(出度为0)为汇点;

3、AOE网络在某些方面(如工程估算)非常有用,例如,从AOE网络可以了解到以下两点:

(1)完成整个工程至少需要多长时间(假定网络中没有环)?

(2)为缩短完成工程所需的时间,应加快哪些活动?

4、在AOE网络中,有些活动可以并行进行。从源点到各个顶点,以及从源点到汇点的有向路径可能不止一条,这些路径的长度可能也不同。完成不同路径上每个活动所需的总时间虽然不同,但只有各条路径上所有活动都完成了,整个工程才算完成。因此,完成整个工程所需的时间取决于从源点到汇点的最长路径长度,所需时间为这条路径上所有活动的持续时间之和。这条路径长度最长的路径就成为关键路径

5、要找出关键路径,必须找出关键活动(不按期完成就会影响整个工程完成的活动);下面定义几个与计算关键活动有关的量:

(1)事件Ei的最早可能开始时间,记为Ee[i],是从源点E0到顶点Ei的最长路径长度;

(2)事件Ei的最迟允许开始时间,记为El[i],是在保证汇点En-1在Ee[n-1]时刻完成的前提下,时间Ei的允许最迟开始时间,即El[i]=Ee[n-1] -(Ei到En-1的最长路径长度);

(3)活动ak的最早可能开始时间,记为e[k]。设ak在有向边上,则e[k] = Ee[i];

(4)活动ak的最迟允许开始时间,记为l[k],是不会引起时间延误的前提下,该活动允许的最迟开始时间,即l[k] = El[j] - dur(),其中dur()是完成活动ak所需的时间,即有向边的权值;

6、l[k]-e[k]是表示活动ak的最早可能开始时间和最迟允许开始时间的时间余量,也叫做松弛时间,l[k] == e[k]表示活动ak没有时间余量,是关键活动;

7、分析关键路径的目的,是要从源点E0开始估算每个活动,辨明哪些是影响整个工程进度的关键活动,以便科学地安排工作;

8、为了找出关键活动,就需要求得各个活动的e[k]与l[k],以判别二者是否相等;而为了求得e[k]与l[k],就要先求得从源点E0到各个顶点Ei的Ee[i]和El[i]。下面分别介绍求Ee[i]、El[i]、e[k]、l[k]的递推公式:

(1)Ee[i]:从Ee[0] = 0开始,向前递推:


(2)El[i]:从El[n-1] = Ee[n-1]开始,反向递推:


(3)e[k]和l[k]:设活动ak对应的带权有向边为,它的持续时间是dur(),则有e[k] = Ee[i];l[k] = El[j] - dur();

9、根据上面的分析,可以得到计算关键路径的算法如下:

(1)输入m条带权的有向边,建立邻接表结构;

(2)从源点E0出发,令Ee[0] = 0,按拓扑有序的顺序计算每个顶点的Ee[i],i=1,2,...,n-1。若拓扑排序的循环次数小于顶点数n,则说明网络中存在有向环,不能继续求关键路径;

(3)从汇点En-1出发,令El[n-1] = Ee[n-1],按逆拓扑有序顺序求各顶点的El[i],i=n-2, n-3, ..., 0;

(4)根据各顶点的Ee[i]和El[i],求各条有向边的e[k]和l[k];

(5)对网络中的每条边,若满足e[k] == l[k],则是关键活动;求出所有关键活动并输出;

Ps:写了这么多相关知识...累死我了。下一篇具体实现求关键路径的算法~

你可能感兴趣的:(狂奔の数据结构与算法,狂奔のC/C++,数据结构与算法随笔)