数据结构与算法分析.ppt

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

其中T是以顶点Vk为尾的所有边的顶点集合(2≤k≤n) 如果
网中有回路,不能求出关键路径则算法中止;否则转
Step2。

while(p)//遍历j的所有出边
{
j1 T Ve(j)
j ACT[j][k] k
….
j2 …. jn
2019-8-27
模型
j
k
jn 方法 谢谢您的观赏
k=p->adjvex;
dig[k].id--;
2019-8-27
谢谢您的观赏
8
Ve(j) :事件vj的最早发生时间
Ve(j)=从源点V1 到顶点Vj 的最长路径长度。
2
5
a1=8 1
a3=14 a4=10
a7=6 4 a6=8
a8=8 7 a10=12 8
a2=12 3
a5=28
6 a9=6
•从源点到顶点Vj的最长路径,可以包括所有以顶点Vj 为终点的全部活动所需时间。经过这段路径,事件Vj才 有可能发生。
在关键路径长度的范围内,可以安排并行的活动
2019-8-27
谢谢您的观赏
6
举例:奥运会竞赛日程
地点:主会场 需要考虑的场地:中心、跑道、沙坑 需要考虑的项目:短跑、长跑、马拉松、铅球、跳高、跳
远。。。 源点:开幕式;终点:闭幕式
2019-8-27
谢谢您的观赏
7
术语: ve(j),vl(j), e(i), l(i),
2019-8-27
//AoE网数据表示
谢谢您的观赏
17
数据结构:Ve,Vl,e,l
数组 int vl[n],ve[n]; int l[maxsize],e[maxsize];
拓扑:队列: tpord[n]; int front=-1,rear=-1;
2019-8-27
谢谢您的观赏
18
初始化
if(ve[j]+p->dur>ve[k])
ve[k]=ve[j]+p->dur;
if(dig[k].id==0)
tpord[++rear]=k;
p=p->next;
}
20
求ve[k]
while(front!=rear) //栈非空循环,拓扑顺序遍历AOE求Ve[j]
{ front++; j=tpord[front]; m++; p=dig[j].link;
关键活动,就可以找到关键路径.
2019-8-27
谢谢您的观赏
15
基本思路:
1. 拓扑排序,并求出Ve(k) , 2. 逆拓扑排序,求Vl(k) 3. 根据公式和权值邻接矩阵ACT[N][N]求e(i),l(i) 4. 根据e(i),l(i)求出关键活动 5. 根据关键活动求出关键路径
a1=8 1
2 a3=14 a4=10
a7=6 4 a6=8
}edgenode;//边表结点 a2=12 3 a5=28 6
a8=8 7 a10=12 8
a9=6
typedef struct
{ vextype vertex;
//顶点标识
int id;
//入度
edgenode *link;
//指向出边表
}vexnode;
//顶点表结点
vexnode dig[n];
2019-8-27
谢谢您的观赏
5
路径长度、关键路径、关键活动:
路径长度:是指从源点到汇点路径上所有活动的持续时间 之和。
关键路径:完成工程的最短时间是从源点到汇点的最大路 径长度。因此,把从源点到汇点具有最大长度的路径称为 关键路径。
一个AOE中,关键路径可能不只一条。 关键活动:关键路径上的活动称为关键活动。
不止一条。这些路径的长度也可能不同。完成不同路径 的活动所需的时间虽然不同,但只有各条路径上所有活 动都完成了,整个工程才算完成。
因此,完成整个工程所需的时间取决于从源点到汇点的 最长路径长度,即在这条路径上所有活动的持续时间之 和。这条路径长度最长的路径就叫做关键路径(Critical Path)。
a1=8 1 a2=12
a3=14
a7=2 22
a8=8
20
46
4 a4=10
3 12
a5=28
a6=8 26 7
40 6
a9=6
a10=12
58 8
Ve(4 ):22
2019-还8-27有什么V含l(4义):?32=以58v-k2为6 终谢谢点您的的观赏活动的最迟完成时间。 11
L(i) :活动ai 的最迟允许开始时间
j ai k
l(i):
l(i) = Vl(k) - ACT[j][k]
j
ai k
2019-8-27
谢谢您的观赏
13
思考:
(1) 完成整个工程至少需要多少时间(假设网络中没有环)?
(2) 为缩短完成工程所需的时间, 应当加快哪些活动?
分析: 在AOE网络中, 有些活动顺序进行,有些活动并行进行。 从源点到各个顶点,以至从源点到汇点的有向路径可能
while(p)//遍历j的所有出边,修改ve[k]
{ k=p->adjvex;
dig[k].id--;
if(ve[j]+p->dur>ve[k])
ve[k]=ve[j]+p->dur;
if(dig[k].id==0)
tpord[++rear]=k;
p=p->next; }
}
if(m<n)
printf("\n the network has a cycle\n");
数据结构与算法分析
第六章 关键路径(5)
2019-8-27
谢谢您的观赏
1
6.7 关键路径
(1) 如何建立一个工程进度控制模型?如何估算完成整个工 程至少需要多少时间(假设网络中没有环)?
(2) 为缩短完成工程所需的时间, 应当加快哪些活动? (3) 人们用AOE网解决这个问题
2019-8-27
谢谢您的观赏
a7=6
5 a8=8
4 a6=8
7 a10=12 8
a =12 2 2019-8-27
3
a5=28 6 谢谢您的观赏
a9=6
3
AOE网的性质
活动开始时间:只有在某个顶点所代表的事件发生后,从 该顶点出发的各有向边代表的活动才能开始;
事件发生时间:只有在进入某一顶点的各有向边代表的活 动已经结束,该顶点所代表的事件才能发生;
l(i) = e(i) …………..( 3 )
l(i) = e(i)表示活动是没有时间余量的关键活动。由上述分 析知,为找出关键活动,需要求各个活动的e(i)与l(i),以
判别一个活动ai是否满足l(i) = e(i)。
Ve(k) 和Vl(k)可由拓扑排序算法得到。
e(i): e(i)= Ve(j)
l(i) = Vl(k) - ACT[j][k] …………..( 2 )
其中, ACT[j][k]是活动ai 的持续时间(< Vj , Vk> 上 的权)。
2019-8-27
谢谢您的观赏
12
⑤时间余量l(i) - e(i)
L(i) - e(i)表示活动ai 的最早可能开始时间和最迟允许开始 时间的时间余量。关键路径上的活动都满足:
2019-8-27
谢谢您的观赏
ห้องสมุดไป่ตู้14
关键路径与关键活动
复习关键路径概念:完成工程的最短时间是从源点到汇点 的最大路径长度。因此,把从源点到汇点具有最大长度的 路径称为关键路径
要找出关键路径,必须找出关键活动,即不按期完成就会 影响整个工程完成的活动。
关键活动概念:那些满足l(i) = e(i) 的活动ai 关键路径上的所有活动都是关键活动。因此,只要找到了
201•9-V8-2e7 (6)是多少?
谢谢您的观赏
9
e(i):活动ai 的最早可能开始时间
e(i) = Ve(j) …………..( 1 )
j ai
2
5
a1=8 1
a3=14 a4=10
a7=6 4 a6=8
a8=8 7 a10=12 8
a2=12 3
a5=28
6 a9=6
若活动ai 在边< Vj , Vk>上, 则e(i) 是顶点Vj 最早时间。事 件Vj发生,表明以Vj为终点的活动全部结束。所以,以Vj 为起点的所有活动ai可以立即开始。
表示实际工程计划的AOE网应该是无环的,并且存在唯一 的入度为0的开始顶点(源点)和唯一的出度为0的结束点 (汇点)。
2019-8-27
谢谢您的观赏
4
AOE网研究的主要问题:
如果用AOE 网表示一项工程,那么仅仅考虑各个子工程 之间的优先关系还不够,更多地是关心整个工程完成的最 短时间是多少,哪些活动的延迟将影响整个工程进度,而加 速这些活动能否提高整个工程的效率,因此AOE网有待研 究的问题是: (1) 完成整个工程至少需要多少时间? (2) 哪些活动是影响工程进度的关键活动?
Vj ai Vk
是指在不会引起工期延误的前提下,活动ai允许的最迟 开始时间。因为事件Vk发生表明以Vk为终点的入边所表 示的所有活动均已完成,所以事件Vk的最迟发生时间Vl(k) 也是所有以Vk为终点的入边<Vj , Vk>所表示的活动ai可 以最迟完成时间。显然,为不推迟工期,活动ai的最迟开 始时间Ll(i)应该是ai的最迟完成时间Vl(k)减去ai的持续时 间,即
2019-8-27
谢谢您的观赏
21
正拓扑顺序?
队列变化? 最后的front,rear值?
a1=4 1
2 a3=14 a4=10
a7=6
5 a8=8
4 a6=8
7 a10=12 8
a2=12 3
a5=18
6 a9=6
2019-8-27
谢谢您的观赏
22
求Ve(k)
01 2 34 5 6 7 Ve(k) 00 08 012 022 028 040 3406 508
从汇点Vn出发,令Vl(n) = Ve(n),按逆拓扑有序求其余各 顶点的最晚发生时间:
Vl(j) = min{ Vl(k)-ACT[j][k] } k∈S
其中S是以顶点Vj为头的所有边的尾顶点的集合(2≤j≤n-1)
逆序的潜在条件
模型
k1
j ACT[j][k] k
k2 S kn 2019-8-27
a7=6
5 a8=8
4 a6=8
7 a10=12 8
a =12 2 2019-8-27
3
a5=28 6 谢谢您的观赏
a9=6
16
数据结构:AOE图
typedef struct node
2
5
{ int adjvex; int dur; struct node *next;
a1=8 1
a3=14
a4=10
2
AOE网(Activity On Edge Network)
在带权的有向图中, 用结点表示事件:所有入边上进行的活动均已完成的事件 用边表示活动:起始结点事件发生后所开展的活动 边的上权表示活动的开销(如持续时间) 则称此有向图为“边表示活动的网络”,简称AOE网。
a1=8 1
2 a3=14 a4=10
void criticalpath(vexnode dig[])
{
int i,j,k,m;
int front=-1,rear=-1; 尾指针初值
//用队列。顺序队列的首
int tpord[n],vl[n],ve[n];
int l[maxsize],e[maxsize];
edgenode *p; for(i=0;i<n;i++)初始化,建立入度为0的队列。
{ ve[i]=0;
if(dig[i].id==0) tpord[++rear]=i;
2019-8-27
谢谢您的观赏
19
m=0;}
//计数拓扑排序的顶点数
Step1:求Ve(k)
从源点V1出发,令Ve(1) = 0,按拓扑序列次序求出其余各 顶点事件的最早发生时间:
Ve(k) = max{ Ve(j)+ACT[j][k] } j∈T
2019-8-27
谢谢您的观赏
10
Vl(k):事件Vk的最迟发生时间
是在保证汇点Vn在Ve(n)时刻完成的前提下,事件Vk的允
许的最迟开始时间。在不推迟工期的情况下,一个事件最
迟发生时间Vl(k)应该等于汇点的最早发生时间Ve(n )减去
从Vk到Vn的最大路径长度。 28
24 5
Ve(n ):58
while(p)//遍历j的所有出边(j,k),改vl[j]
ve(j):事件vj的最早发生时间。事件用v标识,事件 的编号用括号中的数字标识,v的下标区分“最早” 和“最晚”。 vl(j):事件vj的最晚发生时间。
事件用“发生”描述。 e(i):活动ai的最早开始时间。没有v的符号就是表
示活动,括号中是活动的编号,e表示最早开始时 间,l表示最晚。 l(i):活动ai的最晚开始时间。 活动用“开始”
tpord 12345678
8
28
2
5
a1=8
0
a7=6 a3=14 22
1
4
a2=12 1a24=10
a6=8
40
3 2019-8-27
6
a5=28
a8=8
3466a10=12 58
7
8
a9=6 谢谢您的观赏
10 21 31 42 51 62 72 81
2
3
4
4
6
5
6
7
7
8
23
Step2(回退阶段):
相关文档
最新文档