关键路径算法 报告Word文档格式.docx
- 文档编号:20409047
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:12
- 大小:113.74KB
关键路径算法 报告Word文档格式.docx
《关键路径算法 报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《关键路径算法 报告Word文档格式.docx(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<
projectnumber;
i++)
Graphicmap[i].projectname=i;
Graphicmap[i].id=0;
Graphicmap[i].link=NULL;
}
printf("
某项目的开始到结束在图中的节点输入<
vi,vj,dut>
\n"
);
如:
4,9回车表示第三节点到第四节点之间的活动用了个单位时间\n"
for(intk=0;
k<
activenumber;
k++)
scanf("
%d,%d,%d"
&
begin,&
end,&
duttem);
p=(edgenode*)malloc(sizeof(edgenode));
p->
adjvex=end-1;
dut=duttem;
Graphicmap[end-1].id++;
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));
//表示活动最早开始时间
totaltime=0;
for(i=0;
i++)ve[i]=0;
if(Graphicmap[i].id==0)
topologystack[++rear]=i;
m++;
while(front!
=rear)
front++;
j=topologystack[front];
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<
projectnumber)
\n本程序所建立的图有回路不可计算出关键路径\n"
将退出本程序\n"
return0;
totaltime=ve[projectnumber-1];
vl[i]=totaltime;
for(i=projectnumber-2;
i>
=0;
i--)
j=topologystack[i];
if((vl[k]-p->
dut)<
vl[j])
vl[j]=vl[k]-p->
i=0;
|起点|终点|最早开始时间|最迟完成时间|差值|备注|\n"
for(j=0;
j<
j++)
p=Graphicmap[j].link;
e[++i]=ve[j];
l[i]=vl[k]-p->
dut;
|%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])
关键活动|"
return1;
4、数据输入
voidseekkeyroot()//先使用库函数system("
cls"
)清屏,scanf()对结点数的接收,分配相应的存储空间,调用CreateGraphic()函数和SearchMapPath()函数。
intprojectnumber,activenumber,totaltime=0;
system("
请输入这个工程的化成图形的节点数:
"
%d"
projectnumber);
请输入这个工程的活动个数:
activenumber);
vexnode*Graphicmap=(vexnode*)malloc(projectnumber*sizeof(vexnode));
CreateGraphic(Graphicmap,projectnumber,activenumber);
SearchMaxPath(Graphicmap,projectnumber,activenumber,totaltime);
整个工程所用的最短时间为:
%d个单位时间\n"
totaltime);
pause"
3)各软件模块之间的调用方式
该软件各个模块的调用主要是通过声明函数,和定义函数,再通过主函数调用实现的。
主函数:
intmain()//输出主屏信息,判断进入关键路径的程序条件,switch()对条件进行选择。
charch;
for(;
;
)
do
|欢迎进入求关键路径算法程序|\n"
80;
i++)printf("
*"
%s"
"
(S)tart开始输入工程的节点数据并求出关键路径\n"
(E)xit退出\n"
请输入选择:
%c"
ch);
ch=toupper(ch);
}while(ch!
='
S'
&
ch!
E'
switch(ch)
case'
:
seekkeyroot();
break;
四、调试分析
调试的过程中,对程序做了几点改进,增加了程序的容错能力,不论用户输入什么内容,程序都能安全检查;
寻找关键路径:
构建栈用于储存拓扑排序序列,求得每个接点的相应最早发
生时间、最迟完成时间,关键事件的求取,并输出关键路径;
从本实习题的编制过程中容易看出,主要应用拓扑排序。
五、测试结果
进入演示程序后,即显示主界面为:
根据提示,用户输入选项:
1、输入s进入数据输入界面:
2、输入节点数与工程活动个数:
3、输入节点及节点之间所用单位时间的个数<
:
4、输出工程所用最短时间:
5、按任意键回到主界面,输入e退出程序界面:
六、课程设计小结:
通过这次课程设计,我从中体会到编程的魅力,以及好的算法设计思想对整个程序质量的重要性。
以后我要学习更多的算法思想与相关知识,力争编写高质量的程序。
努力学习,在编程方面做出突出表现。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关键路径算法 报告 关键 路径 算法