图 —— 关键路径

Preview:

DESCRIPTION

图 —— 关键路径. 2008/05/27. 主要内容. Floyd算法 AOV 网与拓扑排序概念 AOE 网与关键路径. Floyd 算法. 基本思想 : 图采用邻接矩阵作为存储结构。把关系矩阵看成是没有经过任何中间结点,直接可以到达的每一对顶点间的最短路径的完整表示, 然后经过多次迭代,每次增加一个新的结点,在允许这个结点作为中间结点的条件下,计算每一对顶点间的最短路径的缩短变化, 直到把所有结点都考虑进去为止,结果得到每一对顶点间的最短路径。. 数据结构. typedef struct{ - PowerPoint PPT Presentation

Citation preview

Hu JunfengHu JunfengHu JunfengHu Junfeng

图 —— 关键路径

2008/05/27

2Hu JunfengHu JunfengHu JunfengHu Junfeng

主要内容

• Floyd 算法• AOV 网与拓扑排序概念• AOE 网与关键路径

3Hu JunfengHu JunfengHu JunfengHu Junfeng

Floyd 算法

基本思想:• 图采用邻接矩阵作为存储结构。把关系矩阵看成是没

有经过任何中间结点,直接可以到达的每一对顶点间的最短路径的完整表示,

• 然后经过多次迭代,每次增加一个新的结点,在允许这个结点作为中间结点的条件下,计算每一对顶点间的最短路径的缩短变化,

• 直到把所有结点都考虑进去为止,结果得到每一对顶点间的最短路径。

4Hu JunfengHu JunfengHu JunfengHu Junfeng

数据结构typedef struct{

AdjType *a[]; /* 存放每对顶点间最短路径长度 */

int *nextvex[]; /* 存放 vi 到 vj最短路径上 vi的后继顶点的下标值 */

}ShortPath;

*a[]: 存放每对顶点间的距离(或最短路径长度) , 以关系矩阵作为其初始状态。*nextvex[] :存放 vi 到 vj 最短路径上 vi 的后继顶点的下标值。以 保存全部最短路径的轨迹,

5Hu JunfengHu JunfengHu JunfengHu Junfeng

例题

• 用 Floyd 方法求图 G10 各顶点间的最短路径长度。

6Hu JunfengHu JunfengHu JunfengHu Junfeng

03

030

35020

15020

5150

4510500

A0

513111

143111

143111

113210

141211

141210

nextvex0

初始状态

7Hu JunfengHu JunfengHu JunfengHu Junfeng

8Hu JunfengHu JunfengHu JunfengHu Junfeng

9Hu JunfengHu JunfengHu JunfengHu Junfeng

代价分析

算法中初始化部分由一个循环组成,其中外循环运行 n 次,内循环也运行 n 次,初始化部分的时间复杂度为 O(n2) 。

迭代生成最短路径长度矩阵 A 和路径矩阵 nextvex 的部分为三重循环的嵌套,其时间复杂度为 O(n3) 。因此, Floyd

算法的时间复杂度为 O(n3) 。 空间代价是O(n 2 )。

10Hu JunfengHu JunfengHu JunfengHu Junfeng

AOV网

• 顶点活动网络。每一个顶点代表一个活动。顶点之间的有向弧代表活动之间的序关系。

11Hu JunfengHu JunfengHu JunfengHu Junfeng

AOV网与拓扑排序概念

• 对一个有向无环图 G 进行拓扑排序,是指将 G 中所有顶点排成一个线性序列,使得图中任意一对顶点 u 和 v ,若<u , v> E(G)∈ ,则 u 在线性序列中出现在 v 之前。

• ABE CFGE

• ACFGBE

• CAFBGE G

FC

A

BE

12Hu JunfengHu JunfengHu JunfengHu Junfeng

拓扑排序思想

( 1 )从 AOV 网中选择一个入度为 0 的顶点将其输出。( 2 )在 AOV 网中删除此顶点及其所有的出边。

反复执行以上两步,直到所有顶点都已经输出为止,此时整个拓扑排序完成;或者直到剩下的顶点的入度都不为 0 为止,此时说明 AOV 网中存在回路,拓扑排序无法再进行。

13Hu JunfengHu JunfengHu JunfengHu Junfeng

拓扑排序算法

• 拓扑排序前,先调用 findInDegree 得到所有结点的入度,然后将所有入度为 0 的顶点压栈。

• 从栈顶取出一个顶点将其输出,由它的出边表可以得到以该顶点为起点的出边,将这些边终点的入度减 1,即删除这些边。

• 如果某条边终点的入度为 0 ,则将该顶点入栈。• 反复进行上述操作,直到栈为空。• 如果这时输出的顶点个数小于 n ,则说明该 AOV 网

中存在回路,否则,拓扑排序正常结束。

14Hu JunfengHu JunfengHu JunfengHu Junfeng

采用邻接出边表表示: 增加一个 indegree 维度,存放各顶点的入度。

15Hu JunfengHu JunfengHu JunfengHu Junfeng

AOE 网

• 如果在带权的有向图中,用顶点表示事件,用有向边表示活动,边上的权值表示活动的开销,则此带权的有向图称为边活动网 (Activity on edge network) ,简称 AOE 网。

• 顶点表示一个事件。• 顶点的入边所表示该事件发生所需的的活动• 顶点的出边所表示当该事件发生后,后续的活动

都可以开展了。

16Hu JunfengHu JunfengHu JunfengHu Junfeng

AOE 网

开工

动工

进材料 3 天

打地基 40 天

修围墙 16 天

拆迁 2 年

盖房子 120 天

17Hu JunfengHu JunfengHu JunfengHu Junfeng

关键路径

• AOE 网中有些活动可以并行进行,所以完成整个工程的最短时间是从开始顶点到完成顶点的最长路径长度,路径长度为路径上各边的权值之和。把开始顶点到完成顶点的最长路径称为关键路径。

关键路径是: 1 -> 4 -> 3 -> 2,关键路径长度为: 2+7+6 = 15 ,

18Hu JunfengHu JunfengHu JunfengHu Junfeng

几个相关的概念

• ee(j) :事件 可能发生的最早时刻,它是从 到 的最长带权路径长度。也代表了从 vj 出发的所有活动的最早开始时间。

• le(i) :在保证不延误整个工期的前提下,事件 vi 所允许发生的最晚时刻。

• 活动 ak = < vi ,vj> 的最早开始时间 e(k)

• 活动 ak = < vi ,vj> 的最晚开始时间 l(k)

• 源点:入度为 0 的顶点。

• 汇点:出度为零的顶点。   

19Hu JunfengHu JunfengHu JunfengHu Junfeng

关键活动

关键活动就是 e(k) = l(k) 的活动。 l(k) - e(k) 表示完成活动 ak 的时间余量,是在不延误工期的

前提下,活动 ak 可以延迟的时间。

关键活动是: a2 , a4 , a5 。

20Hu JunfengHu JunfengHu JunfengHu Junfeng

关键路径算法 (1)  输入 e 条弧 <j,k> ,建立 AOE 网的存储结构。

(2)  从源点 v0 出发,令 ee(0)=0, 求 ee(j)    1<=j<=n-1 。(3)  从汇点 n-1 出发,令 le(n-1) = ee(n-1),

求 le(i)    0<=i<=n-2 。(4) 根据各顶点的 ee 和 le 值,求每条弧 ak<vi,vj> 的

最早开始时间 e(k) = ee(i) 和 最晚开始时间 l(k) = le(j) – weight (<vi,vj>) , 其中 e(k)=l(k) 的为关键活动。

求关键路径是在拓扑排序的前提下进行的,不能进行拓扑排序,自然也不能求关键路径。

21Hu JunfengHu JunfengHu JunfengHu Junfeng

例子:

22Hu JunfengHu JunfengHu JunfengHu Junfeng

算法分析:

设 AOE 网有 n 个顶点, e 条边,在求事件可能的最早发生时间及允许的最迟发生时间,以及活动的最早开始时间和最晚开始时间时,都要对图中所有顶点及每个顶点边表中所有的边结点进行检查,时间花费为O(n+e) ,因此,求关键路径算法的时间复杂度为O(n+e) 。

23Hu JunfengHu JunfengHu JunfengHu Junfeng

AOE网研究的问题

• 完成整个工程至少需要多少时间• 哪些活动是影响工程的关键

1956 年,美国杜邦公司提出关键路径法,并于 1957 年首先用于 1000万美圆化工厂建设,工期比原计划缩短了 4 个月。杜邦公司在采用关键路径法的一年中,节省了 100万美圆。

24Hu JunfengHu JunfengHu JunfengHu Junfeng

作业:

• 考试复习。

Recommended