有向无回路图的理解

有向无回路图的理解

概念理解

DAG图Directed Acyclic Graph. 有向无回路图。

如果顶点表示活动,边表示活动间先后关系,那么这个图称为Activity On Vertex Network,即AOV网络。
如果顶点表示活动的开始或者结束等事件(活动的状态),用边表示活动,边的权值表示活动所需的时间,那么Activity A是Activity B的先决条件当且仅当A的终点是B的起点。这样的网络叫做*Activity On Edge Network,即AOE网络*。
关于AOV网络的一种常见操作就是:拓扑排序。而拓扑排序是对AOV网络的一种简化或者是一种合理安排事件执行先后顺序的操作。

AOV网络的拓扑排序算法思路

首先获得一个入度为0的节点A,将节点A入队列topResult,将以A为起点的所有边删去,更新相关节点的入度;重复这个动作,直到将所有节点入队列,topReasult即为拓扑排序的结果。如果不能将所有节点入队列,则说明这个图中有回路。或者更清楚的说是,在点尚未全部入队列之前,已经找不到入度为0的节点。即剩下的所有节点都至少有一个入度。
拓扑排序的关键是计算节点的入度。当然使用矩阵存储图是可以实现的,如果使用邻接表存储,则边表可以调整为由以该节点为终节点的边的起点构成。这样当某一节点的边表为空时就是入度为0的节点。但是接下来要删除以该节点为起点的所有边,所以采用邻接表并不方便,当然可以使用邻接多重表:比较方便的计算出入度,然后又可以比较方便的删去以其为起点的边。当然还是用矩阵来存最简单。

AOE网的关键路径

源点:入度为零的点,代表工程的开始状态的点;
汇点:出度为零的点,代表工程的结束状态的点;
关于工程,它是同时开始的,也就是说并发执行各项任务,而且这里有个短板效应:当activity A的先决条件有一个不满足的时候,它就不能开始。同时还要注意的是事件以及活动,我们可以理解事件是活动的状态,当一个事件发生时,我们就可以认为是一个活动的状态产生了。而确定关键路径有四个步骤:确定事件最早发生的时间->确定事件在不耽误工期的条件下允许的最晚发生时间->确定活动最早发生的时间->确定在不耽误工期的条件下允许的活动最迟发生的时间。他们之间之所以存在先后关系是因为他们的相互依赖关系(递推关系):只有当汇点的最早发生时间确定(也就是工期),才能确定各个事件允许的最晚发生时间。而只有确定各个事件允许的最晚发生时间才能确定活动允许的最迟开始的时间。当然也不是如上所示的严格线性关系。现给出它们的数学关系:

记EEi为事件(Event i)最早(Earliest)发生的时间;
记Eli为事件(Event i)允许最迟(Latest)发生的时间;
记AEi为活动(Activity i)最早(Earliest)发生的时间;
记Ali为活动(Activity i)允许最迟(Latest)发生的时间;

它们的关系如下:
事件K发生的最早时间(路径长度)是从源点到节点K的最长路径所代表的时间;
事件K发生的最迟时间等于汇点最早时间减去从K到汇点的最长路径所代表的时间;
活动I(事件J是它可以开始的状态,事件K是它结束的状态)开始的最早时间等于事件J最早开始的时间;
活动I允许的最迟开始时间等于事件K允许的最迟发生时间减去活动I的持续时间;
如此看来,AL依赖于EL;AE依赖于EE;而EL依赖于EE;

解释:为什么是最长路径?
路径长度代表按照路径上节点事件的顺序执行各项活动达到目标状态所需的时间,如果有最长,则说明有多条路径可以从源点到达目标状态,也就是说目标状态对应的节点的入度大于一,也就是说,这一状态出现的先决条件不止一个,所以要满足所有的先决条件,自然取最长耗时即最长路径长度了。
可是这为什么又是 “最早”呢?
因为如果路径上的活动如果耽误了(对应活动的持续时间变长)那么这条路径的长度就会变长,所以是最早出现的时间。
对于一般答题来说,大多是不要求代码实现的,所以首先要做的就是给出事件的拓扑排序,这是保证逻辑正确的前提。之后按照:确定事件最早发生的时间->确定事件在不耽误工期的条件下允许的最晚发生时间->确定活动最早发生的时间->确定在不耽误工期的条件下允许的活动最迟发生的时间这一顺序确定即可。

前面只提到了一个问题:如何找最长的路径,但是并没有提到的一个问题是在哪里找!现在给出它们的解决方式:

首先拓扑排序DAG网络,然后从源点开始形成EE数组,下标和节点的标记一一对应,值对应最早时间。确定一个节点对应的EE值时需要其前驱对应的EE值,而拓扑排序后就能保证按照排序后的节点顺序计算节点EE值时所要的信息都是存在的。如此EE可以完全产生。

之后逆序产生EL数组。具体是这样的:从汇点开始,确定一个点的EL值时需要其后驱的EL值,后驱的EL值加上对应边的长度就是计算该点EL值可能用到的值,而所有可能的之中最长的就是需要的值,得到这个之后用汇点的EE和其做减法,即可到的EL。

因为计算中需要节点到汇点的最长路径,所以从后开始,逐步递归。当需要节点到源点的最长路径时就从源点开始,逐步递归。

考虑到每一个点的前驱和后驱个数都不是很多,所以采用一般的比较大小的方法就可以满足问题的需求了。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值