AOV 和 AOE

DAG:有向无环图
AOV 网有向无环图中,使用顶点表示活动,边表示依赖关系,则称为「顶点表示活动的网络」。
AOE 网有向无环图中,以顶点表示时间,边表示活动,边的权值表示活动的开销,这种图成为「用边表示活动的图」。

拓扑排序

拓扑排序是指对「有向无环图」顶点的一个排序。排在前面的顶点不依赖后方的顶点

注:使用「邻接矩阵」存储有向图时,如果存储结构为三角矩阵,那么一定存在拓扑序列。

方法1:逐个删除节点

思路:找到图中入度为 拓扑排序和关键路径 - 图1 的顶点,输出,并删除该顶点发出的边。重复这个过程。
注:如果最后还剩下顶点,说明图中存在环
拓扑排序和关键路径 - 图2

逆拓扑排序:找到图中出度为 拓扑排序和关键路径 - 图3 的顶点,输出,并删除该顶点的所有入边,重复这个过程。

方法2:深搜

需要对深搜做一下调整:在回溯时才输出结点,得到的序列即为拓扑排序的逆序列。
拓扑排序和关键路径 - 图4

  • 上图调整过的深搜结果为:E, C, D, B, A
  • 则其拓扑排序的序列为:A, B, D, C, E

关键路径

AOE 网用顶点表示事件,边表示活动,具有以下性质:

  • 只有事件依赖的所有活动都完成时,事件才会发生
  • 只有事件发生后,其后的活动才能开展

相关概念

关键路径:AOE 网中,只有一个源点(入度为 拓扑排序和关键路径 - 图5 的点)和一个汇点(出度为 拓扑排序和关键路径 - 图6 的点)。从源点到汇点有多条路径,开销最大的路径即为关键路径。(因为所有活动都是任务的一部分,都需要完成,所以用关键路径来衡量任务的总时常)

有以下几个辅助概念:
事件 拓扑排序和关键路径 - 图7 最早发生时间 拓扑排序和关键路径 - 图8

  • 也就是从源点到事件节点 拓扑排序和关键路径 - 图9最长路径,表示事件最早什么时候可以开工。
  • 计算方法为:拓扑排序和关键路径 - 图10
  • 其中,拓扑排序和关键路径 - 图11拓扑排序和关键路径 - 图12 的任意前驱,按照拓扑排序的顺序从前往后递推计算。

事件 拓扑排序和关键路径 - 图13 最迟发生时间 拓扑排序和关键路径 - 图14

  • 也就是找到 拓扑排序和关键路径 - 图15 到终点的最长路径,表示事件最多可以推迟到什么时候开工。
  • 计算方法为:拓扑排序和关键路径 - 图16
  • 其中,拓扑排序和关键路径 - 图17拓扑排序和关键路径 - 图18 的任意后继,按照逆拓扑排序的顺序从后往前递推计算。

活动 拓扑排序和关键路径 - 图19 的最早开始时间:事件发生了,活动就发生了。如果边 拓扑排序和关键路径 - 图20 代表活动 拓扑排序和关键路径 - 图21,那么活动最早开始时间为: 拓扑排序和关键路径 - 图22

活动 拓扑排序和关键路径 - 图23 的最迟开始时间:只要在后序事件最迟发生时间之前完成活动即可。如果边 拓扑排序和关键路径 - 图24 代表活动,那么活动最迟开始时间为:拓扑排序和关键路径 - 图25

关键活动:活动有「最早开始时间」和「最迟开始时间」,如果两者相等,则对应活动为「关键活动」。

求解关键路径

求解步骤:

  • 得到拓扑序列
  • 根据拓扑序列求出「事件最早发生时间」和「事件最迟发生时间」
  • 计算出「活动最早开始时间」和「活动最迟开始时间」
  • 找到「活动最早开始时间」和「活动最迟开始时间」相等的关键活动,关键活动组成了关键路径。

关键路径.PNG

注:(不太好证明)

  1. 关键路径上的事件,「最早发生时间」等于「最晚发生时间」
  2. 关键活动一定位于关键路径中