拓扑排序AOV和AOE

  拓扑排序
1.AOV 网
所有的工程或者某种流程可以分为若干个小的工程或阶段,这些小的工程或阶段就称为活动。若以图中的顶点来表示活动,有向边表示活动之间的优先关系,则这样活动在顶点上的有向图称为 AOV 网。在 AOV 网中,若从顶点 i 到顶点 j 之间存在一条有向路径,称顶点 i是顶点 j 的前驱,或者称顶点 j 是顶点 i 的后继。若<i,j>是图中的弧,则称顶点 i 是顶点 j 的直接前驱,顶点 j 是顶点 i 的直接后驱。
2.拓扑排序
AOV 网所代表的一项工程中活动的集合显然是一个偏序集合。为了保证该项工程得以顺利完成,必须保证 AOV 网中不出现回路;否则,意味着某项活动应以自身作为能否开展的先决条件,这是荒谬的。测试 AOV 网是否具有回路(即是否是一个有向无环图)的方法,就是在 AOV 网的偏序集合下构造一个线性序列,该线性序列具有以下性质:
① 在 AOV 网中,若顶点 i 优先于顶点 j ,则在线性序列中顶点 i 仍然优先于顶点 j;
② 对于网中原来没有优先关系的顶点 i 与顶点 j,在线性序列中也建立一个先后关系,或者顶点 i 优先于顶点 j,或者顶点 j 优先i。
满足这样性质的线性序列称为拓扑有序序列。构造拓扑序列的过程称为拓扑排序。也可以说拓扑排序就是由某个集合上的一个偏序得到该集合上的一个全序的操作。
若某个 AOV 网中所有顶点都在它的拓扑序列中,则说明该 AOV 网不会存在回路,这时的拓扑序列集合是 AOV 网中所有活动的一个全序集合。显然,对于任何一项工程中各个活动的安排,必须按拓扑有序序列中的顺序进行才是可行的。
3.拓扑排序算法
对 AOV 网进行拓扑排序的方法和步骤是:
①从 AOV 网中选择一个没有前驱的顶点(该顶点的入度为 0)并且输出它;
②从网中删去该顶点,并且删去从该顶点发出的全部有向边;
③重复上述两步,直到剩余的网中不再存在没有前驱的顶点为止。
这样操作的结果有两种:一种是网中全部顶点都被输出,这说明网中不存在有向回路;
另一种就是网中顶点未被全部输出,剩余的顶点均不前驱顶点,这说明网中存在有向回路。
对一个具有 n 个顶点、e 条边的网来说,整个算法的时间复杂度为 O(e+n)。
4.  关键路径
1.AOE 网
若在带权的有向图中,以顶点表示事件,以有向边表示活动,边上的权值表示活动的开销(如该活动持续的时间),则此带权的有向图称为 AOE 网。
AOE 网具有以下两个性质:
①只有在某顶点所代表的事件发生后,从该顶点出发的各有向边所代表的活动才能开始。
② 只有在进入一某顶点的各有向边所代表的活动都已经结束,该顶点所代表的事件才能发生。
2.关键路径
由于 AOE 网中的某些活动能够同时进行,故完成整个工程所必须花费的时间应该为源点到终点的最大路径长度(这里的路径长度是指该路径上的各个活动所需时间之和)。具有最大路径长度的路径称为关键路径。关键路径上的活动称为关键活动。关键路径长度是整个工程所需的最短工期。这就是说,要缩短整个工期,必须加快关键活动的进度。
利用 AOE 网进行工程管理时要需解决的主要问题是:
①计算完成整个工程的最短路径。
②确定关键路径,以找出哪些活动是影响工程进度的关键。
3.关键路径的确定
为了在 AOE 网中找出关键路径,需要定义几个参量,并且说明其计算方法。
(1)事件的最早发生时间 ve[k]
ve[k]是指从源点到顶点的最大路径长度代表的时间。这个时间决定了所有从顶点发出的有向边所代表的活动能够开工的最早时间。根据 AOE 网的性质,只有进入 vk 的所有活动<vj,vk>都结束时,vk 代表的事件才能发生;而活动< vj, vk>的最早结束时间为 ve[j]+dut(< vj,vk>)。所以计算 vk 发生的最早时间的方法如下:
          ve[l]=0
          ve[k]=Max{ve[j]+dut(< vj, vk>)} < vj, vk>∈p[k] (式 1-4-1)
其中,p[k]表示所有到达 vk 的有向边的集合;dut(< vj, vk>)为有向边< vj,vk>上的权值。
(2)事件的最迟发生时间 vl[k]
vl[k]是指在不推迟整个工期的前提下,事件 vk 允许的最晚发生时间。设有向边< vk,vj>代表从 vk 出发的活动,为了不拖延整个工期,vk 发生的最迟时间必须保证不推迟从事件 vk 出发的所有活动< vk,vj>的终点 vj 的最迟时间 vl[j]。vl[k] 的计算方法如下:
        vl[n]=ve[n]
        vl[k]=Min{vl[j]-dut(< vk,vj>)} < vk, vj>∈s[k] (式 1-4-2)
其中,s[k]为所有从 vk 发出的有向边的集合。
(3)活动 ai 的最早开始时间 e[i]
若活动 ai 是由弧<vk,vj>表示,根据 AOE 网的性质,只有事件 vk 发生了,活动 ai 才能开始。也就是说,活动 ai 的最早开始时间应等于事件 vk 的最早发生时间。因此,有:
      e[i]=ve[k] (式 1-4-3)
(4)活动 ai 的最晚开始时间 l[i]
活动 ai 的最晚开始时间指,在不推迟整个工程完成日期的前提下, 必须开始的最晚时间。若 由弧< vk,vj>>表示,则 ai 的最晚开始时间要保证事件 vj 的最迟发生时间不拖后。因此,应该有:
l[i]=vl[j]-dut(<vk,vj>) (式 1-4-4)
根据每个活动的最早开始时间 e[i]和最晚开始时间 l[i]就可判定该活动是否为关键活动,也就是那些 l[i]=e[i]的活动就是关键活动,而那些 l[i]>e[i]的活动则不是关键活动,l[i]-e[i]的值为活动的时间余量。关键活动确定之后,关键活动所在的路径就是关键路径。
由上述方法得到 求关键路径的算法步骤为:
(1)输入 e 条弧<j,k>,建立 AOE-网的存储结构;
(2)从源点v 0 出发,令ve[0]=0,按拓扑有序求其余各顶点的最早发生时间ve[i](1≤i≤n-1)。如果得到的拓扑有序序列中顶点个数小于网中顶点数 n,则说明网中存在环,不能求关键路径,算法终止;否则执行步骤(3)。
(3)从汇点 v n 出发,令 vl[n-1]=ve[n-1],按逆拓扑有序求其余各顶点的最迟发生时间vl[i](n-2≥i≥2);
(4)根据各顶点的 ve 和 vl 值,求每条弧 s 的最早开始时间 e(s)和最迟开始时间 1(s)。若某条弧满足条件 e(s)=l(s),则为关键活动。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值