ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:66.15KB ,
资源ID:4072121      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4072121.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实现求关键路径算法.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实现求关键路径算法.docx

1、实现求关键路径算法沈阳航空航天大学课 程 设 计 报 告 课程设计名称:数据结构课程设计 课程设计题目:实现求关键路径的算法 院(系):计算机学院专 业:计算机科学与技术班 级:04010102学 号:2008040101058姓 名:刘小靖指导教师:许清完成日期:2014年1月9日第一章 需求分析 1.1 题目内容与要求内容:自拟定合适的方式从键盘上输入一个AOE网,使用图的邻接表存储结构存储该AOE网,然后求出该AOE网的关键路径。输入AOE网的方式要尽量的简单方便,程序要能够形象方便地观察AOE网和它的关键路径基本要求:1熟悉图的存储结构及操作方式;2熟悉求关键路径的算法;3熟练运用开发

2、环境;4完成软件的设计与编码;5. 熟练掌握基本的调试方法;6. 提交符合课程设计规范的报告;1.2 题目理解与功能分析该题实质要求用数据结构中的图形知识编写一个求无循环有向帯权图中从起点到终点所有路径,经分析、比较求出长度最大路径,从而求出关键路径。通常我们用有向图表示一个工程。在这种有向图中,用顶点表示活动,用有向边表示活动Vi必须先于活动Vj进行。如果在这种图中用有向边表示一个工程中的各项活动(ACTIVITY),用有向边上的权值表示活动的持续时间(DURATION),用顶点表示事件(EVENT),则这种的有向图叫做用边表示活动的网络,简称AOE网络。在AOE网络中,从源点到各个顶点,可

3、能不止一条。这些路径的长度也可能不同。不同路径所需的时间虽然不同,但只有各条路径上所有活动都完成了,这个工程才算完成。因此,完成整个工程所需的时间取决于从源点到汇点的最长路径长度,即在这条路径上所有活动的持续时间之和。这条路径长度就叫做关键路径(critical path)。 程序所要达到的功能:输入并建立AOE网;输出关键活动并求出这个工程的关键路径;求出完成这个关键路径的最少时间并输出,该程序结束。第二章 概要设计2.1 设计思路基本设计思路:(1) 以某一个求无循环有向帯权图蓝本。(2) 观察并记录这个图中每个弧的起始点及权值。 (3) 用记录的结果建立E网,即边表示活动的网络,并用图的

4、形式表示。(4) 用领接表来存储图这些信息。 (5) 用Create( )函数建立AOE图。(6) 用CriticPath ( )函数求出最大路径,并打印出关键路径。(7) 编写代码并测试。2.2 系统模块图图2-1系统模块图第三章 详细设计3.1 图存储结构的建立1. 先建立邻接表的存储单元,为建立邻接表做准备。为图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点vi的边(对于有向图是以vi为尾的弧)。每个结点由3个域组成,其中邻接域(adjvex)指示与顶点vi邻接的点在图中的位置,链域(nextedge)指示下一条边或弧的结点,权值域(W)存储边或弧的权值大小。在表头结点除了

5、设有链域(firstedge)指向链表中第一个结点之外,还设有存储顶点v或其他有关的数据域(data)和存储顶点入度的域(id)(代码如下)。 typedef struct node int adjvex; int w; struct node *nextedge; edgenode; typedef struct char data; int id; edgenode *firstedge; vexnode; 2. 然后构造有向图。第一,输入顶点信息存储在顶点表中,并初始化该顶点的便表。第二,首先输入边所依附的两个顶点的序号i和j然后生成新的邻接点序号为j的边表结点,最后将该结点插入到第i个

6、表头部。(代码如下) for(int k=0;kadjvex =end-1; p-w =duttem; Graphend-1.id +; p-nextedge =Graphbegin-1.firstedge ; Graphbegin-1.firstedge =p; 3.2 求关键路径的算法利用AOE网进行工程管理时,需解决的两个主要问题:其一,计算完成整个工程的最短工期;其二,确定关键路径,以找出哪些活动时影响工程进度的关键。计算其过程必须分别在拓扑有序和逆拓扑有序的前提下进行。也就说,vek必须在事件vk所有前驱的最早发生的时间求得之后才能确定。因此,可以在拓扑排序的基础上计算vek和vlk

7、。由此得到求解关键路径的方法:首先输入e条有向边,建立AOE网的邻接表存储结构;然后从始点出发,令事件的最早发生时间为0,按拓扑有序求其余各顶点时间的最早发生时间vek;其次从终点出发,令事件最迟发生时间等于其最早发生时间,按你你逆拓扑排序求其余各顶点事件最迟发生时间 vlk。最后根据各顶点事件的ve和vl值,求所有活动最早开始时间ee和最迟开始时间el。如果某活动满足条件eeel,则为关键活动。 if(eli=eei) printf( 此弧为关键活动 ); 同时,为计算各顶点事件的ve值是在拓扑排序的过程中进行的,因此需一个队列来记录拓扑排序,如果顶点的入度为0,则该顶点从队尾进入队列,拓扑

8、排序时,从队头出队列。第四章 调试分析 在调试的过程中,遇到过很多的问题,我觉得在这之中的比较具有技术含量的问题就是在求事件的最晚发生的时间时,不知如何着手,然后我翻阅了一些书籍和上网查了一些资料,最后确定采用堆栈的方法,保存拓扑排序的顶点序列,然后根据后进先出的原则,进行求事件的最晚发生世间的计算。另外就是很多的特殊情况需要考虑,比如说有向图含有环,这种情况是要编程加以排除,开始事件有多个,关键路径不只一条等一些很细节的问题。第一组测试方案及结果如下:图4-1 建立有向图图4.2 邻接表输出图图4.3 关键路径输出图第二组测试方案及结果如下:图4.4 建立有向图图4.5 邻接表输出图图4.6

9、 关键路径输出图参考文献1 严蔚敏编.数据结构(C语言版).北京: 清华大学出版社,1997.22 谭浩强著.C语言程序设计(第二版).北京: 清华大出版社,2001.33 夏克俭编著.数据结构.北京: 国防工业出版社,2000.74 彭勃.数据结构.北京: 电子工业出版社,2007.65 宜晨编著.Visual C+5.0实用培训教程.北京:电子工业出版社,1998.5附 录(程序清单)#include#includeusing namespace std;typedef string Vertex;typedef int InfroType;/*存放权值*/#define null 0co

10、nst int MAXN = 20;typedef struct ArcNode int adjvex; struct ArcNode * nextarc; InfroType Infro; bool flag;ArcNode;typedef struct VNode Vertex data; int count; ArcNode *firstarc;VNode;typedef struct Graph VNode adjlistMAXN; int n, e; Graph;int visitedMAXN;int veMAXN;int vlMAXN;int stackMAXN;int stMAX

11、N;int tp;int top;int max(int x, int y) if( x y) return x; else return y;int min(int x, int y) if(x n = 0; g-e = 0; for(i = 0; i adjlisti.firstarc = null; g-adjlist i.count = 0; bool Empty(Graph * g) if( g-n = 0 & g-e = 0 ) return true; else return false;int Find(Graph * g,Vertex v) if(Empty(g) cout

12、图为空. endl; return -1; int i; for(i = 0; i n; i+) if(g-adjlisti.data = v) return i; return -1;void Create(Graph * & g) int i, i1, i2; Vertex v1, v2; InfroType w; cout 请输入顶点数和边数: g-n g-e; cout 请输入顶点: endl; for(i = 0; i n; i+) cin g-adjlisti.data ; ArcNode * p; p = null; cout 边和权值: endl; for(i = 1; i e

13、; i+) cin v1 v2 w ; i1 = Find(g, v1); i2 = Find(g, v2); if( i1 != -1 & i2 != -1) p = new ArcNode; p-adjvex = i2; p-Infro = w; p-flag = false; p-nextarc = g-adjlisti1.firstarc ; g-adjlist i1.firstarc = p; void Output(Graph *g)/*按照存储结构输出*/ if(Empty(g) cout 图为空. endl; return; int i; cout 按照邻接表输出为: endl

14、; for( i = 0; i n; i+) cout adjlist i.data; ArcNode * p; p = g-adjlist i.firstarc ; while(p) cout ( adjlistp-adjvex .data , Infro nextarc ; cout endl; bool Topsort(Graph * g, int &infro, int & v) int stackMAXN; int stMAXN; int tp; int top; memset(ve, 0, sizeof(int) * MAXN); Rdu(g, 1); top = -1; tp =

15、 -1; int i, m, n; ArcNode * p; p = null; infro = 0; for(i = 0; i n; i+) if(g-adjlist i.count = 0) if(g-adjlist i.firstarc & infro adjlist i.firstarc -Infro ) infro = g-adjlist i.firstarc -Infro ; m = v; for(i = 0; i n; i+) if(!g-adjlist i.firstarc) if( v = m) v = i; else cout 结束事件不唯一. endl; return f

16、alse; if(infro = -1) cout 没有找到开始事件. endl; return false; if(v = -1) cout 没有找到结束事件. endl; return false; for(i = 0; i n; i+) vli = INT_MAX; for(i = 0; i n; i+) if(g-adjlist i.count = 0) stack+top = i; while( top + 1 ) m = stacktop-; g-adjlist m.count = -1; st+tp = m; p = g-adjlist m.firstarc ; while(p)

17、 n = p-adjvex ; if(g-adjlist n.count = -1) cout 该有向图有环. Infro) ; g-adjlist n.count -; if(g-adjlist n.count = 0) stack+top = n; p = p-nextarc; if(tp n - 1) cout 拓扑排序不成功. endl; return false; else cout 拓扑排序成功. adjlist sttp.firstarc ; while(p) vlsttp = min(vlsttp, vlp-adjvex - p-Infro ); p = p-nextarc ;

18、 p = g-adjlist sttp.firstarc ; while(p) if(vlsttp = vlp-adjvex - p-Infro ) p-flag = true; p = p-nextarc ; tp-; return true;void Path(Graph * g,int u, int v,int path, int d) int j, i; ArcNode * p; p = null; visitedu = 1; d+; pathd = u; p = g-adjlist u.firstarc ; if(u = v) cout 关键路径: ; cout adjlist pa

19、th0.data; for(i = 1; i = d; i+) cout adjlist pathi.data; cout 总工期: vev adjvex ; if(visitedj = 0 & vlj = vej & p-flag ) Path(g, j, v, path, d); p = p-nextarc ; visitedu = 0; d-;void CriticPath(Graph * g) if(Empty(g) cout 图为空. endl; return; int infro, v, i; infro = -1; v = -1; if(Topsort(g, infro, v)

20、= false | infro = -1 | v = -1) return ; Rdu(g, 1); for(i = 0; i n; i+) if(g-adjlist i.count = 0 & g-adjlist i.firstarc & g-adjlist i.firstarc -Infro = infro) memset(visited, 0, sizeof(int) * MAXN); memset(st, 0, sizeof(int) * MAXN); Path(g, i, v, st, -1); void Menu() cout 有向网的相关操作 endl; cout 1 endl;

21、 cout 2 endl; cout 3 endl; cout 0 endl; cout 请输入. choose; switch(choose) case 1: Init(g); Create(g); break; case 2: Output(g); break; case 3: CriticPath(g); break; default: return; 课程设计总结:从这次给我的课程设计任务中我深刻地体会到了。任何事情并不是想我们想的那样简单和容易。只有扎扎时时的学习知识才能解决实际生活中的实际问题。从这次课设中也让我明白以后要多了解相关知识,更多的做一些实践动手活动,将知识运用到实际问

22、题中。同时,增加自己的动手能力,这样才能便于我们更好的解决问题。为今后打下好的基础。在这个过程中遇到过很多的问题,有时候需要反复的修改和测试程序,在编程的过程中,随时会发现新的问题,随时要更改和调试程序。我觉得在调试的过程中,最开始的时候出现有多条关键路径的图但是程序却只输出一条关键路径,我仔细查看程序,发现每个事件的最早开始时间和最迟开始时间是没有问题的,最终确定在采用有向图的深度优先遍历的时候,没有将访问标志数组恢复,所以只能输出一条关键路径。当我编完程序后,我感到很欣喜,这毕竟是我的第一次课程设计任务。能完成让我感到什么叫做编程的快乐,什么叫做乐趣。督促我更加努力的学习我的专业课:计算机科学与技术。指导教师评语:指导教师(签字): 年 月 日课程设计成绩

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1