拓扑排序和关键路径_第1页
拓扑排序和关键路径_第2页
拓扑排序和关键路径_第3页
拓扑排序和关键路径_第4页
拓扑排序和关键路径_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

关于拓扑排序和关键路径第一页,共三十二页,编辑于2023年,星期一AOV-网

用顶点表示活动,用边来表示活动之间的先后关系的有向图称为顶点活动网,简称AOV-网。例如,计算机专业学生的学习就是一个工程,每一门课程的学习就是整个工程的一些活动。其中有些课程要求先修课程,有些则不要求。这样在有的课程之间有领先关系,有的课程可以并行地学习。7.5.1拓扑排序第二页,共三十二页,编辑于2023年,星期一

C1

高等数学

C2

程序设计基础

C3

离散数学C1,C2

C4

数据结构C3,C2C5

高级语言程序设计C2C6

编译方法C5,C4C7

操作系统C4,C9C8

普通物理C1C9

计算机原理C8

课程代号课程名称先修课程第三页,共三十二页,编辑于2023年,星期一学生课程学习工程图C8C3C5C4C9C6C7C1C2第四页,共三十二页,编辑于2023年,星期一在AOV网络中不能出现回路,即环。如果出现了环,则意味着某项活动应以自己作为先决条件,这是荒谬的。因此,对给定的AOV网络,必须先判断它是否存在有向环。第五页,共三十二页,编辑于2023年,星期一检测有向环的一种方法是对AOV网络构造它的拓扑有序序列。即将各个顶点(代表各个活动)排列成一个线性有序的序列,使得AOV网络中所有应存在的前驱和后继关系都能得到满足。这种构造AOV网全部顶点的拓扑有序序列的运算就叫做拓扑排序。如果通过拓扑排序能将AOV网络的所有顶点都排入一个拓扑有序的序列中,则该网络中必定不会出现有向环。第六页,共三十二页,编辑于2023年,星期一如果AOV网络中存在环,此AOV网络所代表的工程是不可行的。例如,对学生选课工程图进行拓扑排序,得到的拓扑有序序列为

C1,C2,C3,C4,C5,C6,C8,C9,C7

或C1,C8,C9,C2,C5,C3,C4,C7,C6C8C3C5C4C9C6C7C1C2第七页,共三十二页,编辑于2023年,星期一拓扑排序的方法①

输入AOV网络。令n为顶点个数。 ②在AOV网络中选一个没有直接前驱的顶点,并输出之;③从图中删去该顶点,同时删去所有它发出的有向边;④重复以上②、③步,直到全部顶点均已输出,拓扑有序序列形成,拓扑排序完成;或图中还有未输出的顶点,但已跳出处理循环。说明图中还剩下一些顶点,它们都有直接前驱。这时网络中必存在有向环。第八页,共三十二页,编辑于2023年,星期一C0C1C4C3C2C5拓扑排序的过程(a)有向无环图C4C5C1C0C3(b)输出顶点C2C1C4C5C3(c)输出顶点C0C2C0C4C5C1C3(d)输出顶点C3第九页,共三十二页,编辑于2023年,星期一C1C4C5(e)输出顶点C4C5C1(f)输出顶点C1C5(g)输出顶点C5

最后得到的拓扑有序序列为C2,C0,C3,C4,C1,C5

。它满足图中给出的所有前驱和后继关系,对于本来没有这种关系的顶点,如C2和C4,也排出了先后次序关系。(h)拓扑排序完成第十页,共三十二页,编辑于2023年,星期一AOV网络及其邻接表表示C0C1C4C3C2C5C0C1C2C30C4C50012345indegreedatafirstarc

1301031adjvexnextarc30501500150第十一页,共三十二页,编辑于2023年,星期一在邻接表中增设一个数组indegree[],记录各顶点入度。在拓扑排序前前,初始化入度数组。入度为零的顶点即无前驱顶点。在算法中,使用栈存放入度为零的顶点,供选择和输出无前驱的顶点。第十二页,共三十二页,编辑于2023年,星期一拓扑排序算法可描述如下:入度为零的顶点入栈;当栈不空时,重复执行

从顶点栈中退出一个顶点,并输出之;

从AOV网络中删去这个顶点和它发出的边,边的终顶点入度减一;

如果边的终顶点入度减至0,则该顶点进栈;

如果输出顶点个数少于AOV网络的顶点个数,则报告网络中存在有向环。第十三页,共三十二页,编辑于2023年,星期一拓扑排序的算法voidTopologicalSort(ALGraphG){FindInDegree(G,indegree);//初始化indegree[]InitStack(S);for(i=0;i<G.vexnum;i++)//入度为零的顶点

if(indegree[i]==0)Push(S,i);//进栈

count=0;//对输出顶点计数

第十四页,共三十二页,编辑于2023年,星期一while(!StackEmpty(S)){

Pop(S,i);//退栈

cout<<i<<G.vertices[i].data;//输出i号顶点

count++;//并计数

//扫描i号顶点的每个邻接点

for(p=G.vertices[i].

firstarc;p;p=p->nextarc){k=p->adjvex;

if(--indegree[k]==0)//顶点入度减1 Push(S,k);//顶点的入度减至零,进栈

}}}第十五页,共三十二页,编辑于2023年,星期一7.5.2关键路径一、AOE网如果在有向无环图中,用有向边表示一个工程中的活动(Activity),

用边上权值表示活动持续时间(Duration),

用顶点表示事件,

则这样的有向图叫做用边表示活动的网络,简称AOE(ActivityOnEdges)网。第十六页,共三十二页,编辑于2023年,星期一AOE网络在某些工程估算方面非常有用。例如,可以使人们了解:完成整个工程至少需要多少时间(假设网络中没有环)?为缩短完成工程所需的时间,应当加快哪些活动?第十七页,共三十二页,编辑于2023年,星期一从源点到汇点的路径可能不止一条,并且这些路径的长度也可能不同。完成不同路径的活动所需的时间虽然不同,但只有各条路径上所有活动都完成了,整个工程才算完成。因此,完成整个工程所需的时间取决于从源点到汇点的最长路径长度,即在这条路径上所有活动的持续时间之和。这条路径长度最长的路径就叫做关键路径(CriticalPath)。第十八页,共三十二页,编辑于2023年,星期一要找出关键路径,必须找出关键活动,即不按期完成就会影响整个工程完成的活动。关键路径上的所有活动都是关键活动。因此,只要找到了关键活动,就可以找到关键路径。例如,下图就是一个AOE网。V1V3V2V4a1=3a2=2V5V6a6=3a7=2a4=3a3=2a5=4a8=1第十九页,共三十二页,编辑于2023年,星期一二、相关术语①

事件Vi

的最早发生时间ve(i)

是从源点V0

到顶点Vi的最长路径长度。②

事件Vi的最迟发生时间vl(i)

在不推迟整个工程完成的前提下,事件Vi

的最迟发生时间。③

活动ai的最早开始时间

e(i)④

活动ai

的最迟开始时间

l(i)

表示在不推迟整个工程完成的前提下,活动ai最迟必须开始进行的事件。第二十页,共三十二页,编辑于2023年,星期一⑤

时间余量

l(i)–e(i)

表示活动

ai的最早可能开始时间和最迟允许开始时间的时间余量。

l(i)=e(i)的活动称为关键活动。第二十一页,共三十二页,编辑于2023年,星期一三、怎样求关键路径?

如何找e(i)=l(i)的关键活动?为找出关键活动,需要求各个活动的e(i)

与l(i),以判别是否l(i)=e(i)。设活动ai由弧<Vj,Vk>表示,且活动持续时间记为dut(<j,k>),

e(i)=ve(j)l(i)=vl(k)-dut(<j,k>)VjVkai第二十二页,共三十二页,编辑于2023年,星期一

如何求ve(i)和vl(i)?求ve(i)的递推公式

ve(0)=0开始,向前递推

<i,j

>T,i=1,2,,n-1

T

是所有以第j个顶点为头的弧的集合。例,求右图中顶点V6的最早发生时间。V3V4V5V6a6=3a7=2a8=1266第二十三页,共三十二页,编辑于2023年,星期一V1V2V3V4V5V6顶点vevl032668V1V3V2V4a1=3a2=2V5V6a6=3a7=2a4=3a3=2a5=4a8=1032668第二十四页,共三十二页,编辑于2023年,星期一求vl(i)的递推公式从vl(n-1)=ve(n-1)开始,反向递推

<i,j>S,i=n-2,n-3,,0S是所有以第i个顶点为尾的弧的集合。

例,求右图中顶点V1的最迟发生时间。V1V3V2a1=3a2=224第二十五页,共三十二页,编辑于2023年,星期一V1V2V3V4V5V6顶点vevl032668V1V3V2V4a1=3a2=2V5V6a6=3a7=2a4=3a3=2a5=4a8=1042678042678第二十六页,共三十二页,编辑于2023年,星期一a1a2a3a4a5a6a7a8活动ell-e011000341220253660671341V1V3V2V4a1=3a2=2V5V6a6=3a7=2a4=3a3=2a5=4a8=1V1V2V3V4V5V6顶点vevl032668042678第二十七页,共三十二页,编辑于2023年,星期一四、算法实现实现步骤:

①输入e条弧<j,k>,建立AOE-网的存储结构;

②从源点v0出发,令ve[0]=0,按拓扑有序求其余各顶点的最早发生时间ve[i](1≤i≤n-1)。如果得到的拓扑有序序列中顶点个数小于网中顶点数n,则说明网中存在环,不能求关键路径,算法终止;否则执行步骤③。

③从汇点vn出发,令vl[n-1]=ve[n-1],按逆拓扑有序求其余各顶点的最迟发生时间vl[i](n-2≥i≥2);

④根据各顶点的ve和vl的值,求每条弧s的最早发生时间e(s)和最迟发生时间l(s)。若某条弧满足条件e(s)=l(s),则为关键活动。第二十八页,共三十二页,编辑于2023年,星期一

算法实现StatusTopologicalOrder(ALGraphG,Stack&T){

//求各顶点事件的最早发生时间ve(全局变量),T为拓扑序列顶点栈

FindInDegree(G,indegree);//对各顶点求入度

InitStack(T);count=0;ve[0..G.vexnum-1]=0;//初始化

while(!StackEmpty(S))//S为零入度顶点栈

{Pop(S,j);push(T,j);++count;//j号顶点入T栈并计数

for(p=G.vertices[j].firstarc;p;p=p→nextarc){k=p→adjvex;//对j号顶点的每个邻接点的入度减1

if(--indegree[k]==0)push(S,k);

if(ve[j]+*(p→info)>ve[k])ve[k]=ve[j]+*(p→info);

}

}

if(count<G.vexnum)returnERROR;//该有向网有回路

elsereturnOK;

}第二十九页,共三十二页,编辑于2023年,星期一StatusCriticalPath(ALGraphG){

//G为有向网,输出G的各项关键活动

if(!TopologicalOrder(G,T)returnERROR;

vl[0.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论