关键路径算法 报告.docx
- 文档编号:7301112
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:12
- 大小:113.74KB
关键路径算法 报告.docx
《关键路径算法 报告.docx》由会员分享,可在线阅读,更多相关《关键路径算法 报告.docx(12页珍藏版)》请在冰豆网上搜索。
关键路径算法报告
数据结构课程设计报告
题目:
关键路径算法
院(系):
计算机工程学院
专业:
计算机科学与技术
班级:
嵌入式1091
学生:
吕帅
指导教师:
寇海洲孙成富
邱军林殷路
2010年12月
目录
一、设计目的3
二、设计内容3
三、程序设计步骤4
四、调试分析12
五、测试结果12
六、课程设计小结16
一、设计目的
1、能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。
2、提高程序设计和调试能力。
学生通过上机实习,验证自己设计的算法的正确性。
学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
3、初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。
4、训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
5、培养根据选题需要选择学习书籍,查阅文献资料的自学能力。
二、设计内容
1、系统名称:
关键路径算法
AOE网(即边表示活动的网络),在某些工程估算方面非常有用。
它可以使人们了解:
(1)研究某个工程至少需要多少时间?
(2)哪些活动是影响工程进度的关键?
在AOE网络中,从源点到汇点的有向路径可能不止一条,但只有各条路径上所有活动都完成了,这个工程才算完成。
因此,完成整个工程所需的时间取决于从源点到汇点的最长路径长度,即在这条路径上所有活动的持续时间之和,这条路径就叫做关键路径(criticalpath)。
2、要求:
1以某一工程为蓝本,采用图的结构表示实际的工程计划时间。
2调查并分析和预测这个工程计划每个阶段的时间。
3用调查的结果建立AOE网,并用图的形式表示。
4用CreateGraphic()函数建立图的邻接表存储结构,能够输入图的顶点和边的信息,并存储到相应存储结构中。
5用SearchMaxPath()函数求出最大路径,并打印出关键路径。
6编写代码并调试、测试通过。
[测试数据]
利用教材p185的图7.30(a)中的数据调试程序。
[实现提示]
实现的关键和难点在于对四个术语的理解和应用即:
ei表示顶点vi所代表的事件的最早发生时间;li表示顶点vi所代表的事件的最迟发生时间;Tes(i,j)表示活动ak的最早开工时间;Tls(i,j)表示活动ak的最迟开工时间。
活动ak为关键活动的充分必要条件是活动ak的最早开工时间与它的最迟开工时间相等。
三、程序设计步骤
1)功能分析说明图:
2)采用主要的数据结构类型。
1、数据结构
typedefstructnode
{
intadjvex;
intdut;
structnode*next;
}edgenode;
typedefstruct
{
intprojectname;
intid;
edgenode*link;
}vexnode;
//vexnodeGraphicmap[PROJECTNUMBER];
2、构建AOE-网
voidCreateGraphic(vexnode*Graphicmap,intprojectnumber,intactivenumber)//构建AOE-网,for(scanf())逐个对图结点信息(包括两邻接点,权值)输入接收,并与分配存储空间。
{
intbegin,end,duttem;
edgenode*p;
for(inti=0;i { Graphicmap[i].projectname=i; Graphicmap[i].id=0; Graphicmap[i].link=NULL; } printf("某项目的开始到结束在图中的节点输入 printf("如: 4,9回车表示第三节点到第四节点之间的活动用了个单位时间\n"); for(intk=0;k { scanf("%d,%d,%d",&begin,&end,&duttem); p=(edgenode*)malloc(sizeof(edgenode)); p->adjvex=end-1; p->dut=duttem; Graphicmap[end-1].id++; p->next=Graphicmap[begin-1].link; Graphicmap[begin-1].link=p; } } 3、寻找关键路径 intSearchMaxPath(vexnode*Graphicmap,intprojectnumber,intactivenumber,int&totaltime)//寻找关键路径,构建栈用与储存拓扑排序序列,求得每个接点的相应最早发生时间、最迟完成时间,关键事件的求取,并输出关键路径。 { inti,j,k,m=0; intfront=-1,rear=-1; int*topologystack=(int*)malloc(projectnumber*sizeof(int));//用来保存拓扑排列 int*vl=(int*)malloc(projectnumber*sizeof(int));//用来表示在不推迟整个工程的前提下,VJ允许最迟发生的时间 int*ve=(int*)malloc(projectnumber*sizeof(int));//用来表示Vj最早发生时间 int*l=(int*)malloc(activenumber*sizeof(int));//用来表示活动Ai最迟完成开始时间 int*e=(int*)malloc(activenumber*sizeof(int));//表示活动最早开始时间 edgenode*p; totaltime=0; for(i=0;i for(i=0;i { if(Graphicmap[i].id==0) { topologystack[++rear]=i; m++; } } while(front! =rear) { front++; j=topologystack[front]; m++; p=Graphicmap[j].link; while(p) { k=p->adjvex; Graphicmap[k].id--; if(ve[j]+p->dut>ve[k]) ve[k]=ve[j]+p->dut; if(Graphicmap[k].id==0) topologystack[++rear]=k; p=p->next; } } if(m { printf("\n本程序所建立的图有回路不可计算出关键路径\n"); printf("将退出本程序\n"); return0; } totaltime=ve[projectnumber-1]; for(i=0;i vl[i]=totaltime; for(i=projectnumber-2;i>=0;i--) { j=topologystack[i]; p=Graphicmap[j].link; while(p) { k=p->adjvex; if((vl[k]-p->dut) vl[j]=vl[k]-p->dut; p=p->next; } } i=0; printf("|起点|终点|最早开始时间|最迟完成时间|差值|备注|\n"); for(j=0;j { p=Graphicmap[j].link; while(p) { k=p->adjvex; e[++i]=ve[j]; l[i]=vl[k]-p->dut; printf("|%4d|%4d|%4d|%4d|%4d|",Graphicmap[j].projectname+1,Graphicmap[k].projectname+1,e[i],l[i],l[i]-e[i]); if(l[i]==e[i]) printf("关键活动|"); printf("\n"); p=p->next; } } return1; } 4、数据输入 voidseekkeyroot()//先使用库函数system("cls")清屏,scanf()对结点数的接收,分配相应的存储空间,调用CreateGraphic()函数和SearchMapPath()函数。 { intprojectnumber,activenumber,totaltime=0; system("cls"); printf("请输入这个工程的化成图形的节点数: "); scanf("%d",&projectnumber); printf("请输入这个工程的活动个数: "); scanf("%d",&activenumber); vexnode*Graphicmap=(vexnode*)malloc(projectnumber*sizeof(vexnode)); CreateGraphic(Graphicmap,projectnumber,activenumber); SearchMaxPath(Graphicmap,projectnumber,activenumber,totaltime); printf("整个工程所用的最短时间为: %d个单位时间\n",totaltime); system("pause"); } 3)各软件模块之间的调用方式 该软件各个模块的调用主要是通过声明函数,和定义函数,再通过主函数调用实现的。 主函数: intmain()//输出主屏信息,判断进入关键路径的程序条件,switch()对条件进行选择。 { charch; for(;;) { do { system("cls"); printf("|欢迎进入求关键路径算法程序|\n"); for(inti=0;i<80;i++)printf("*"); printf("%s","(S)tart开始输入工程的节点数据并求出关键路径\n"); printf("%s","(E)xit退出\n"); printf("%s","请输入选择: "); scanf("%c",&ch); ch=toupper(ch); }while(ch! ='S'&&ch! ='E'); switch(ch) { case'S': seekkeyroot(); break; case'E': return1; } } } 四、调试分析 调试的过程中,对程序做了几点改进,增加了程序的容错能力,不论用户输入什么内容,程序都能安全检查; 寻找关键路径: 构建栈用于储存拓扑排序序列,求得每个接点的相应最早发 生时间、最迟完成时间,关键事件的求取,并输出关键路径; 从本实习题的编制过程中容易看出,主要应用拓扑排序。 五、测试结果 进入演示程序后,即显示主界面为: 根据提示,用户输入选项: 1、输入s进入数据输入界面: 2、输入节点数与工程活动个数: 3、输入节点及节点之间所用单位时间的个数 4、输出工程所用最短时间: 5、按任意键回到主界面,输入e退出程序界面: 六、课程设计小结: 通过这次课程设计,我从中体会到编程的魅力,以及好的算法设计思想对整个程序质量的重要性。 以后我要学习更多的算法思想与相关知识,力争编写高质量的程序。 努力学习,在编程方面做出突出表现。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关键路径算法 报告 关键 路径 算法