C实现关键路径算法课程设计报告Word格式文档下载.docx

上传人:b****6 文档编号:16231886 上传时间:2022-11-21 格式:DOCX 页数:14 大小:109.37KB
下载 相关 举报
C实现关键路径算法课程设计报告Word格式文档下载.docx_第1页
第1页 / 共14页
C实现关键路径算法课程设计报告Word格式文档下载.docx_第2页
第2页 / 共14页
C实现关键路径算法课程设计报告Word格式文档下载.docx_第3页
第3页 / 共14页
C实现关键路径算法课程设计报告Word格式文档下载.docx_第4页
第4页 / 共14页
C实现关键路径算法课程设计报告Word格式文档下载.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

C实现关键路径算法课程设计报告Word格式文档下载.docx

《C实现关键路径算法课程设计报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C实现关键路径算法课程设计报告Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。

C实现关键路径算法课程设计报告Word格式文档下载.docx

3.3输出图的各顶点和弧的实现6

3.4计算各顶点的入度7

3.5输出关键路径7

4调试分析8

5用户使用说明9

6测试结果9

6.1录入数据9

6.2功能实现9

6.3测试结论11

致谢13

参考文献14

摘要

具有最大路径长度的路径称关键路径,关键路径上的活动称关键活动。

课程设计主要要求求有向图的关键路径。

用领接表存储结构储存有向图。

用深度遍历的方式输出有向图的顶点和弧。

程序实现了存储有向图,输出有向图的各顶点和弧,计算顶点的入度和求有向图的关键路径这四个功能。

用领接表存储结构储存有向图,用深度遍历的方式输出有向图的顶点和弧,用遍历查找的方式计算顶点的入度。

求关键路径时先用拓扑排序函数判断有向图是否有回路,调用求关键活动的函数找到关键路径,最后输出。

 

关键词:

领接表;

入度;

AOE网;

关键路径;

引言

工程有很多的阶段,这些阶段之间有一定的先后关系和自己的时间。

我们可以用图来表示工程,将其输入程序中,可以用程序计算出工程的相关信息,如,工程完成的最短时间,哪些活动会影响工程的进度等。

要解决这些问题就可以用领接表储存图,并计算各个事件和各个阶段的最早发生时间和最晚发生时间,得到关键活动,从而的到关键路径。

1需求分析

从键盘上输入图的各顶点和弧上的权值,用领接表储存。

在屏幕上输出图的顶点和弧。

计算输出顶点的入度。

如果图是AOE网,输出关键路径。

1.1任务与分析

1、首先定义边节点和顶点的结构体,将输入的数据用链接表储存起来,领接表即是顺序+链式的存储方式。

将顶点顺序储存,将该顶点为起点的弧指向的另一顶点及其相关信息存储在链表中。

2、采用深度遍历的方式,输出顶点和弧。

3、判断顶点是否在弧尾,在弧尾就在入度的计数变量上加一。

4、首先要将图进行拓扑排序,看是否有回路,没有回路才能求关键路径。

求AOE网的关键路径要先求到各个事件的最早发生时间和最迟发生时间,再求有向边的最早和最迟发生时间,活动的最晚发生时间和最早发生时间相减等于0时,该活动即为关键活动,再将关键活动按顺序连起来极为关键路径。

1.2测试数据

带权有向图测试数据如下:

测试数据1如图1-1:

图1-1测试图1

测试数据2如图1-2:

图1-2测试图2

测试数据3如图1-3:

图1-2测试图3

2概要设计

2.1设计思路

程序分总的来说分为四大功能模块:

输入储存;

输出顶点和弧;

输出各顶点的入度;

输出关键路径。

在输出关键路径的模块中包括:

拓扑排序判断是否有回路;

计算各事件的最早发生时间和最晚发生时间;

求活动的最晚发生时间,判断该活动是否是关键活动;

首先调用输入存储模块创建图,用菜单工作的方式来实现对各个输出功能模块的调用。

输入储存:

ALGraph<

T>

:

ALGraph(Ta[],intn,inte)

输出顶点和弧:

voidPrint();

输出各顶点的入度:

voidindegree();

输出关键路径:

voidcritical_path(ALGraphG);

输出关键路径模块中的子模块:

拓扑排序:

voidTopSort(ALGraphG);

事件的时间:

voidvv(ALGrapphG);

判断是否是关键活动:

voidkeyEvent(ALGraphG);

2.2层次图

各模块间的层次如图2-1:

图2-1各模块间的层次图

3详细设计

3.1主函数的实现

首先输入图的顶点的个数和边的个数,程序通过输入的数来判断要创建的图的大小,调用图的构造函数,输入图的相关信息。

之后,为了方便用户操作,用工作菜单的方式来实现对各个功能的调用。

voidmain()

{

intn,e;

intchoose=1;

//控制

intwhich;

//功能选择变量

string*vname;

//[MaxSize];

cout<

<

"

请输入图的顶点数:

;

cin>

>

n;

while(n<

0||n>

20)

{

cout<

顶点个数应在-20之间!

请重新输入!

endl;

cin>

}

请输入图的边数:

e;

while(e<

0)

您输入的顶点个数小于零!

vname=newstring[n];

请输入顶点:

for(intj=0;

j<

j++)

vname[j];

ALGraph<

string>

g(vname,n,e);

while(choose==1)

-------------------------------------------------------"

\n1******-------输出该有有向图的个顶点和弧--******"

\n2******-------计算各顶点的入度--------------******"

\n3******-------计算AOE网的关键路径------------******"

\n4******-------退出--*******---------------******"

which;

switch(which)

{

case1:

g.Print();

break;

case2:

g.indegree();

case3:

g.critical_path();

case4:

choose=0;

}

}

3.2数据录入实现

定义边表节点和顶点表节点。

structArcNode

{

intadjvex,weight;

ArcNode*next;

};

template<

classT>

structVertexNode

Tvertex;

intin;

ArcNode*firstedge;

用构造函数实现数据的录入,录入时根据程序的提示录入数据。

vertexNum=n;

arcNum=e;

inti,j,k,w;

for(i=0;

i<

vertexNum;

i++)

{

adjlist[i].vertex=a[i];

adjlist[i].firstedge=NULL;

for(k=0;

k<

arcNum;

k++)

请输入图中弧的起始点及权值:

其格式为<

起点,终点,权值>

i>

j>

w;

ArcNode*s;

s=newArcNode;

s->

adjvex=j;

weight=w;

next=adjlist[i].firstedge;

adjlist[i].firstedge=s;

3.3输出图的各顶点和弧的实现

对图进行深度遍历,输出顶点和弧。

voidALGraph<

Print()//输出有向图的个顶点和弧

for(inti=0;

i<

i++)

ArcNode*p;

p=adjlist[i].firstedge;

while(p)

cout<

adjlist[i].vertex<

---->

intj;

j=p->

adjvex;

adjlist[j].vertex<

'

\t'

权值:

p->

weight<

p=p->

next;

3.4计算各顶点的入度

用双重循环,外层循环找到各个顶点,内层循环计算有几条弧指向外层循环中的顶点,用累加器累加,最后累加器得到的数就是该顶点的入度。

indegree()//输出每个顶点的入度

ArcNode*p;

intcount;

count=0;

for(intj=0;

if(j!

=i)

{

p=adjlist[j].firstedge;

while(p)

{

if(p->

adjvex==i)count++;

p=p->

}

}

elsecontinue;

adjlist[i].in=count;

的入度为:

adjlist[i].in<

3.5输出关键路径

首先,调用拓扑排序判断有向图中是否回路,有回路不能求关键路径,没有回路则求关键路径。

先调用vv函数求顶点的最早发生时间和最迟发生时间,在调用keyEvent函数找到关键活动,再将关键路径串起来输出。

critical_path()

intts[MaxSize],ve[MaxSize],vl[MaxSize];

if(TopSort(ts)==0)

有关键路径!

intk,v;

k=ts[0];

vv(ve,vl,ts);

keyEvent(ve,vl,ts);

关键路径:

adjlist[k].vertex;

for(inti=0;

10;

if(ev[i].v1==k)

{

v=ev[i].v2;

cout<

->

adjlist[v].vertex;

k=ev[i].v2;

else

,没有关键路径!

4调试分析

问题1:

在类中定义私有成员intts[],用来储存经过拓扑排序后的顶点的编号,但在拓扑排序的函数中无法对数组进行写入。

分析及解决方法:

没有想明白是什么原因。

直接在调用拓扑排序函数是传入数组ts来代替类的私有成员intts[]来储存经过拓扑排序后的顶点的编号。

问题2:

在运行求事件的最早发生时间和最迟发生时间的函数时,发生读写位置冲突的问题。

经检查后发现是传入的用来储存事件最早发生时间和最迟发生时间的数组ve和vl没有进行初始化。

用for循环语句对两个数组进行初始化。

问题3:

当调用求关键路径的方法时程序运行到一半时不再运行。

经调试后发现是求顶点的最早发生时间和最迟发生时间

的vv函数的while循环中少写了P=P->

next语句导致出现了死循环。

在while循环中加上P=P->

next语句。

5用户使用说明

按照提示输入数据后,在菜单出现后,从键盘输入功能的编号就可以实现不同的功能。

简单,方便,易操作。

6测试结果

 用测试数据1进行测试。

6.1录入数据

从键盘上输入顶点的个数,边的条数,再根据提示输入顶点、边、权值,用领接表来进行储存。

如图6-1所示:

图6-1录入存储

6.2功能实现

根据菜单选择功能。

测试输出各顶点和弧的功能,结果如图6-2所示。

图6-2输出顶点和弧

测试计算各顶点的入度功能,结果如图6-3所示。

图6-3计算各顶点的入度

测试计算AOE网的关键路径的功能,结果如图6-4所示。

图6-4计算AOE网的关键路径

6.3测试结论

通过测试得知该程序实现了需求中的所有功能。

测试的结果完全符合预期结果。

结论

通过这次实训,使我学到了很多。

由于求关键路径的算法在上课时没有深入学习,课后没有重视关键路径这块基本上没有理解,我在编程中遇到了很多困难,但在攻克困难的过程中提高了自己的自学能力,分析问题及解决问题的能力、熟练运用理论知识的能力。

同时,让我更深入的掌握了有关求AOE网关键路径等方面的知识,巩固了所学内容。

我从这次课程设计中所得的另外一个很大的收获是:

不能因为问题难就逃避它,只有勇于尝试才可能解决根本问题。

数据结构这门课程对我们学习好这个专业很重要,在以后,我会尽量利用我的空闲时间把以前不熟的和掌握不牢固的知识点再学习一遍。

尽管这次的实习是独立的个人工作,但在完成课程设计遇到困难时,也得到了很多老师的指导和同学的帮助。

然我明白了合作的重要性。

在实训过程中收获了很多的丰富的经验知识,更加深了我对一些算法和新知识的理解与应用,让我受益匪浅。

在实训中认识自己不足的地方。

自己了解一些算法,但是在具体编程的时候不会应用。

写的程序复杂度高,效率低下。

因此,在以后的学习中我会更加注重学以致用。

致谢

感谢有这次实训的机会。

通过这次实训,我学到了很多,认识到了自己的不足。

感谢老师的耐心的指导。

感谢同学的热心帮助。

参考文献

[1]严蔚敏,吴伟民.数据结构.清华大学出版社出版。

[2]严蔚敏,吴伟民.数据结构题集(C语言版).清华大学出版社.2003年5月。

[3]唐策善,李龙澎.数据结构(作C语言描述).高等教育出版社.2001年9月

[4]朱战立.数据结构(C++语言描述)(第二版本).高等出版社出版.2004年4月。

[5]胡学钢.数据结构(C语言版).高等教育出版社.2004年8月。

[6]陈明编著.数据结构.北京:

清华大学出版社,2005年。

[7]王红梅,胡明,王涛编著(C++版)(第2版).清华大学出版社.2011年6月

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 育儿知识

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

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