工程规划问题数据结构课程设计.docx
- 文档编号:9151907
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:30
- 大小:232.35KB
工程规划问题数据结构课程设计.docx
《工程规划问题数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《工程规划问题数据结构课程设计.docx(30页珍藏版)》请在冰豆网上搜索。
工程规划问题数据结构课程设计
滁州学院
课程设计报告
课程名称:
数据结构
设计题目:
工程规划的设计与实现
系别:
计算机科学与技术系
专业:
网络工程
组别:
第一组
起止日期:
2011年6月1日~2011年6月26日
指导教师:
刘士喜
计算机科学与技术系二○○九年制
课程设计任务书
课程设计题目
工程规划的设计与实现
组长
史言
学号
2010211212
班级
网工2班
系别
计算机与科学技术
专业
网络工程
组员
束勇2010211213司石磊2010211214
史仁兴2010211211史芳彬2010211210
指导教师
刘士喜
课程设计目的
为了解决在实际工程领域中的最短时间,对此该课程设计解决了对于某个工程的关键活动以及最短时间。
课程设计所需环境
WINDOWSXPMicrosoftVisualC++6.0
课程设计任务要求
根据该课程设计的目的,我们首先查阅了大量资料,做了充分的需求分析,完成了该课程的概要设计
课程设计工作进度计划
序号
起止日期
工作内容
分工情况
1
6.1
开会讨论课程设计,并进行小组内人员的分工
史言对小组成员进行明确分工
2
6.2~
6.5
讨论分析课程设计,具体分析
史言束勇史仁兴
司石磊史芳彬
3
6.6~
6.10
查阅相关资料,编写课程设计的前些部分
司石磊束勇
4
6.11~
6.16
课程设计的概要设计的编写及修改
史芳彬史仁兴
5
6.17~
6.22
详细设计的编写及调试
史言史仁兴
6
6.23~
6.26
最后的总结,心得。
并将课程设计打印
束勇司石磊
指导教师签字:
年月日
教研室审核意见:
教研室主任签字:
年月日
目录
1.引言-4-
2.需求分析-4-
2.1工程-4-
2.2AOE网-4-
2.2.1AOE网的定义-4-
2.2.2AOE网具有的性质-5-
2.2.3AOE网的应用-5-
2.3关键路径-5-
2.3.1关键路径的研究意义:
-5-
2.4分析-6-
2.4.1问题描述-6-
2.4.2示例-6-
2.5基本要求:
-7-
2.5.1具体要解决的问题-7-
2.5.2程序设计分析-7-
2.6需求分析的目的:
-8-
3.概要设计-8-
3.1算法分析:
-8-
3.2算法步骤:
-9-
3.3函数的主要功能:
-9-
3.4数据结构:
-9-
3.4.1数据结构:
-9-
3.4.2程序模块:
-10-
3.4.3程序流程:
-10-
4.详细设计-12-
4.1求取关键路径-12-
4.2主程序建立-13-
5.调试与操作说明-14-
5.1开始界面-14-
5.2进入求关键路径的系统-15-
5.3输入节点数和活动个数-16-
5.4输入某项目的信息(弧头,弧尾,权值)打印出关键路径-17-
5.5例如:
如图所示的图程序测试-18-
5.6回路测试-20-
6.课程设计的总结和体会-21-
7.致谢:
-21-
8.参考文献:
-21-
9.附录:
-21-
课程设计的主要内容
1.引言
随着社会经济的飞速发展,尤其是在工程领域,发展迅速,而关键路径是从工程领域抽象出来的问题的求解方法。
关键路径扮演了工程规划的指导者的重要角色,是一种非常重要的估算一项工程所需的最短时间的依据。
2.需求分析
2.1工程
我们通常把计划、施工过程、生产流程、程序流程等都当成一个工程。
工程通常分为若干个称为“活动”的子工程。
完成了这些“活动”,这个工程就可以完成了。
2.2AOE网
2.2.1AOE网的定义
通常用AOE-网来表示工程。
AOE-网是用顶点表示事件,弧表示活动,弧上的权值表示活动持续的时间的有向图叫AOE(ActivityOnEdgeNetwork)网。
AOE网常用于估算工程完成时间。
例如:
图1一个AOE网实例
图1是一个网。
其中有9个事件v1,v2,…,v9;11项活动a1,a2,…,a11。
每个事件表示在它之前的活动已经完成,在它之后的活动可以开始。
如v1表示整个工程开始,v9表示整个工程结束。
V5表示活动,a4和a5已经完成,活动a7和a8可以开始。
与每个活动相联系的权表示完成该活动所需的时间。
如活动a1需要6天时间可以完成。
2.2.2AOE网具有的性质
只有在某顶点所代表的事件发生后,从该顶点出发的各有向边所代表的活动才能开始。
只有在进入某一顶点的各有向边所代表的活动都已经结束,该顶点所代表的事件才能发生。
表示实际工程计划的AOE网应该是无环的,并且存在唯一的入度过为0的开始顶点和唯一的出度为0的完成顶点。
2.2.3AOE网的应用
AOE-网可以用来估算工程的完成时间。
他可以使人们了解:
研究某个工程至少需要多少时间?
哪些活动是影响工程进度的关键?
1.2.4AOE网的设计步骤:
以某一工程为蓝本,采用图的结构表示实际的工程计划的时间。
调查以分析和预测这个工程计划个阶段的时间。
用调查的结果建立AOE网(ActivityOnEdgeNetwork),即边表示活动的网络,并用图的形式表示。
用图来存储这些信息。
用CreateGraphic();函数建立AOE图。
用SearchMapPath();函数求出最大路径,并打印出关键路径。
编写代码
测试
2.3关键路径
由于AOE-网中的有些活动可以并行进行,从开始点到各个顶点,以致从开始点到完成点的有向路径可能不止一条,这些路径的长度也可能不同。
完成不同路径的活动所需的时间虽然不同,但只有各条路径上所有活动都完成了,这个工程才算完成。
因此,完成工程所需的最短时间是从开始点到完成点的最长路径的长度,即在这条路径上的所有活动的持续时间之和.这条路径长度就叫做关键路径(CriticalPath)。
2.3.1关键路径的研究意义:
关键路径可以很方便的让我们估算出某个工程最短的时间开销,以及这个工程中哪些活动,即哪些项目是主要的,是影响工程进度的关键,从而让我们对工程的实施作出更好的时间安排,并且可以分清主次,抓住核心工程,做到有的放矢。
总的来说,正因为关键路径可以帮助我们对工程进行非常有必要的估算,让我们得以看清全局,作出更为优化的安排,所以可见关键路径的求出对一项工程而言是非常必要的。
这亦是本次对关键路径求法的研究意义所在。
2.4分析
2.4.1问题描述
为了规划和管理的方便,他们将一个工程分为若干个项目,每个项目都可以独立进行。
所有项目都工作完毕时,整个工程也就完成了。
每个项目都需要一定的工作时间。
工程最后总耗时是从第一个项目开始到最后一个项目结束的这段时间。
各个项目之间可能存在也可以不存在相互制约关系。
如果有制约关系,则可能是以下四种之一(设两个项目分别为p和q):
(1)SASpq(pSartAfterqStart,项目p在项目q开始之后才能开始)
(2)FASpq(pFinishAfterqStart,项目p在项目q开始之后才能结束)
(3)SAFpq(pSartAfterqStart,项目p在项目q结束之后才能开始)
(4)FAFpq(pFinishAfterqStart,项目p在项目q结束之后才能结束)
如果没有制约关系,则可同时进行。
2.4.2示例
例如:
SAF13表示项目1必须在项目3完成后才能开始。
若项目3工作时间为3,起始时刻为2,则项目1最早在时刻5才能开始。
请你根据各个项目的工作时间及先后关系,找出一种安排工程的方案,使整个工程尽可能快的完成。
输入:
输入文件的第一行为项目总数N(1≤N≤100),设项目的编号依次为1,2,…,N。
下面N行依次为完成每个项目所需的工作时间(每个项目占一行)。
这个时间为不超过100的正整数。
接下来若干行是一些项目间先后次序关系的列表,每行的格式为:
<先后次序关系符><项目p编号><项目q编号>
其中:
<先后次序关系符>为SAS、FAS、SAF、FAF中的任意一个,“(”表示一个空格符。
整个文件以一个字母“#”表示结束(单独占一行)
输出:
若问题有解,则输出文件有N行,依次输出项目1到项目N的最早开始时间(设整个工程从0时刻开始)。
每行的格式为:
(项目编号最早开始时间)。
若问题无解,则输出文只有一行,为一个正整数0。
输入输出示例1:
project.in
3
2
3
4
SAF21
FAF32
#
project.out
10
22
31
输入输出示例2:
project.in
3
1
1
1
SAF21
SAF32
SAF13
#
project.out
0
(1)选取建图的一种算法建立图,有邻接矩阵,邻接表,十字链表,邻接多重表等多种方法,要选取一种适当的方法建立图,才能提高算法效率,降低时间复杂度和空间复杂度。
(2)两个相邻顶点与它们之间的边表示活动,边上的数字表示活动延续的时间。
对于给出的事件AOE网络,要求求出从起点到终点的所有路径,经分析、比较后找出长读最大的路径,从而得出求关键路径的算法,并给出计算机上机实现的源程序。
完成不同路径的活动所需的时间虽然不同,但只有各条路径上所有活动都完成了,这个工程才算完成。
2.5基本要求:
2.5.1具体要解决的问题
将项目中的各项活动视为有一个时间属性的结点,从项目起点到终点进行排列;
用有方向的线段标出各结点的紧前活动和紧后活动的关系,使之成为一个有方向的网络图;
用正推法和逆推法计算出各个活动的最早开始时间,最晚开始时间,最早完工时间和最迟完工时间,并计算出各个活动的时差;
找出所有时差为零的活动所组成的路线,即为关键路径;
2.5.2程序设计分析
选取建图的一种算法建立图;
选取邻接表的算法来建立图,是一种顺序+链式存储结构。
用顺序表存放顶点,为每个顶点建立一个单链表,单链表中的结点表示依附于该顶点的边或以该顶点为尾的弧。
两个相邻顶点与它们之间的边表示活动,边上的数字表示活动延续的时间
参照该工程所化的AOE-网,求出从起点到终点的所有路径,然后通过拓扑排序和逆拓扑排序求出最早与最晚发生时间,找出长度最大的路径,从而求得关键路径,计算出完成工程的最短时间。
2.6需求分析的目的:
在该部分,即需求分析中,根据设计题目的要求,充分地分析和理解问题,叙述系统的功能要求,明确问题要求做什么,以及限制条件是什么。
程序所能达到的功能:
通过输入所要构建的图的顶点数,弧数,创建图,并打印出来,对图进行拓扑排序,求得此图的最早发生时间和最迟发生时间,并求得关键活动和关键路径,打印出来。
3.概要设计
3.1算法分析:
求关键路径必须在拓扑排序的前提下进行,有环图不能求关键路径;
只有缩短关键活动的工期才有可能缩短工期;
若一个关键活动不在所有的关键路径上,减少它并不能减少工期;
只有在不改变关键路径的前提下,缩短关键活动才能缩短整个工期。
关键路径 :
从源点到汇点的路径长度最长的路径叫关键路径。
活动开始的最早时间e(i);
活动开始的最晚时间l(i);
定义e(i)=l(i)的活动叫关键活动;
事件开始的最早时间ve(i);
事件开始的最晚时间vl(i)。
设活动ai由弧
e(i)=ve(j)
l(i)=vl(k)-dut(
求ve(i)和vl(j)分两步:
1.从ve
(1)=0开始向前递推
ve(j)=Max{ve(i)+dut()}
T, 2<=j<=n
其中,T是所有以j为弧头的弧的集合。
2.从vl(n)=ve(n)开始向后递推
vl(i)=Min{vl(j)-dut()}
S, 1<=i<=n-1
其中,S是所有以i为弧尾的弧的集合。
两个递推公式是在拓扑有序和逆拓扑有序的前提下进行。
3.2算法步骤:
输入e条弧
从源点v1出发,令ve
(1)=0,求ve(j),2<=j<=n。
从汇点vn出发,令vl(n)=ve(n),求vl(i) 1<=i<=n-1。
根据各顶点的ve和vl值,求每条弧s(活动)的最早开始时间e(s)和最晚开始时间l(s),其中e(s)=l(s)的为关键活动。
3.3函数的主要功能:
3.3.1CreateGraphic()函数:
构建AOE网,for(scanf())逐个对图节点信息(包括两邻接点,权值)输入接收,并与分配存储空间。
3.3.2SearchMapPath()函数:
寻找关键路径,构建栈用与储存拓扑排序序列,求得每个接点的相应最早发生时间、最迟完成时间,关键事件的求取,并输出关键路径。
3.3.3Seekkeyroot()函数:
先使用库函数system(“cls”)清屏,scanf()对接点数的接收分配相应的存储空间,调用CreateGraphic()函数和SearchMapPath()函数。
3.3.4Main()函数:
输出主屏信息判断进入关键路径的程序条件,swith()对条件进行选择。
3.4数据结构:
3.4.1数据结构:
typedefstructnode//边表结点
{intadjvex;//邻接点编号
intdut;//弧的信息
structnode*next;//下一条弧指针
}edgenode;
typedefstruct//顶点表结点
{
intprojectname;//顶点域
intid;//顶点的入度信息
edgenode*link;//边表头指针
}vexnode;
3.4.2程序模块:
求关键路径需要通过建立A0E网、计算关键路径和主程序这三个模块来共同完成,每一个都不可缺少,如图2所示:
图2求关键路径的步骤简图
3.4.3程序流程:
开始主函数运行,然后swith()函数进行对条件选择,再调用Seekkeyroot(),CreateGraphic和SearchMapPath函数进行运算,最后退出调试,如图3所示。
图3求关键路径的程序流程图
4.详细设计
4.1求取关键路径
利用AOE网进行工程管理时,需解决的两个主要问题:
其一,计算完成整个工程的最短工期;其二,确定关键路径,以找出哪些活动时影响工程进度的关键。
因此须计算以下几点:
事件的最早发生时间ve[k];
事件最迟发生时间vl[k];
活动最早开始时间ee[i];
活动的最迟开始时间el[i];
计算其过程必须分别在拓扑有序和逆拓扑有序的前提下进行。
也就说,ve[k]必须在事件vk所有前驱的最早发生的时间求得之后才能确定。
因此,可以在拓扑排序的基础上计算ve[k]和vl[k]。
由此得到求解关键路径的方法:
首先输入e条有向边,建立AOE网的邻接表存储结构;然后从始点出发,令事件的最早发生时间为0,按拓扑有序求其余各顶点时间的最早发生时间ve[k];
(代码如下)
while(p){
k=p->adjvex;
Graph[k].id--;
if(ve[j]+p->w>ve[k])
ve[k]=ve[j]+p->w;
}
接着从终点出发,令事件最迟发生时间等于其最早发生时间,按你你逆拓扑排序求其余各顶点事件最迟发生时间vl[k];最后根据各顶点事件的ve和vl值,求所有活动最早开始时间ee和最迟开始时间el。
如果某活动满足条件ee=el,则为关键活动。
(代码如下)
if(el[i]==ee[i]){
printf("此弧为关键活动");
}
同时,为计算各顶点事件的ve值是在拓扑排序的过程中进行的,因此需一个队列来记录拓扑排序,如果顶点的入度为0,则该顶点从队尾进入队列,拓扑排序时,从队头出队列。
if(Graph[k].id==0)
topology_queue[++rear]=k;
p=p->nextedge;
4.2主程序建立
该部分主要是对所建立的函数的调用。
包括:
建立图的函数CreateGraph();
计算关键路径的函数SearchMapPath();
最后程序结束。
这样安排可以增强程序的可读性,使程序便于理解,也便于日后的对程序的维护和修改等操作。
首先,建立一个边的信息结构体,包括邻接点的编号和弧的信息以及下一条指针的结点等信息。
typedefstructnode//边表结点
{
intadjvex;//邻接点编号
intdut;//弧的信息
structnode*next;//下一条弧指针
}edgenode;
然后,再建立顶点的信息结构体,其中包括表结点、顶点域、顶点的入度等信息。
typedefstruct//顶点表结点
{
intprojectname;//顶点域
intid;//顶点的入度信息
edgenode*link;//边表头指针
}vexnode;
接着,根据这些信息建立一个有向图,在创建过程中,需要注意:
先是将各定点的入度设为零,然后每加一个入度就加一,如果是减得话就是输入终点,还有就是正确输入弧的信息要和格式一样。
部分程序段如下:
voidCreateGraphic(vexnode*Graphicmap,intprojectnumber,intactivenumber)//创建图
{
intbegin,end,duttem;//分别代表弧的头节点,尾节点,活动时间
edgenode*p;//边表头指针
for(inti=0;i { Graphicmap[i].projectname=i;//顶点的命名按0,1,2,3...... Graphicmap[i].id=0;//顶点的信息的度数均赋为零 Graphicmap[i].link=NULL; } printf("\n"); printf("请输入某项目的信息,并请用整形数字表示(格式: 弧头,弧尾,权值): \n"); printf("例如: 输入1,2,4即代表结点1与4之间的活动需要4个时间单位。 \n"); printf("\n"); for(intk=0;k { scanf("%d,%d,%d",&begin,&end,&duttem);//请输入第%d条的起点、终点和权值 p=(edgenode*)malloc(sizeof(edgenode));//临时分配存储空间 p->adjvex=end-1;//因为是从零开始记的,如要减一,就是让终点插入到邻接表内 p->dut=duttem;//该弧的活动时间为duttem Graphicmap[end-1].id++;//入度加一 p->next=Graphicmap[begin-1].link; Graphicmap[begin-1].link=p;//让下一个节点作为下一插入节点的前驱节点 } } 下一步就是根据建立的图求关键活动、编写主函数,进行求解,调试。 源代码见附录。 5.调试与操作说明 按照要求输入一组关于无循环有向帯权图所有信息。 5.1开始界面 提示界面会显示“欢迎进入秋关键路径算法程序”,其中s(start)表示开始输入工程的节点数据并求出关键路径,e(exit)表示退出具体如图3所示。 图3开始界面 5.2进入求关键路径的系统 例如输入s 提示输入符合标准,欢迎进入求关键路径的系统! 请输入这个项目的AOE-网的节点数: 图4输入节点 5.3输入节点数和活动个数 提示请输入这个项目的AOE-网的节点数;请输入这个项目的AOE-网的活动个数; 例如节点数3,活动的个数3,具体如图5所示。 图5输入活动个数 5.4输入某项目信息并打印关键路径 例如输入1,2,4即代表1与4之间的活动需要4个时间单位,打印出关键路径: 1,2,41,3,52,3,6,如图6所示。 图6输入权值 5.5回路测试 本程序所建立的图有回路不可计算出关键路径,将退出本程序。 整个工程所用的最短时间为: 0个单位时间,如图7所示。 图7回路测试 6.课程设计的总结和体会 该课程设计旨在解决当今工程领域中的最短时间以及关键活动问题。 在该课程设计中,用到了AOE网的性质、求解和拓扑排序等方法,进而求得最短时间和关键活动。 该课程设计包括引言、需求分析、概要设计、详细设计、调试与操作说明等几大部分。 在各个部分中,本次课程设计中简明扼要的阐述了该部分的内容及功能。 为该部分的理解及详细设计中的代码的理解都起到了重要的作用。 另外,在调试与操作说明这一部分中,调试了多组数据,为程序的正确奠定了基础。 在经过了几次调试后,验证了该程序的正确性。 因此,此次工程规划的设计与实现课程设计是有效的。 7.致谢: 感谢一年来刘老师的教育,让我们知道了如何做一个课程设计,同时感谢刘老师给我们提出的宝贵的意见。 另外非常感谢在此次课程设计中帮助我们小组的同学们。 8.参考文献: [1]严蔚敏,吴伟民.数据结构[M].北京: 清华大学出版社,2006. 谭浩强.C程序设计(第二版): 清华大学出版社,2006 胡学钢.数据结构(C语言版): 高等教育出版社,2008 9.附录: 源程序清单 #include #include #include #include typedefstructnode//边表结点 { intadjvex;//邻接点编号 intdut;//弧的信息 structnode*next;//下一条弧指针 }edgenode; typedefstruct//顶点表结点 { intprojectname;//顶点域 intid;//顶点的入度信息 edgenode*link;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 工程规划 问题 数据结构 课程设计