城市道路交通图的计算与分析.docx
- 文档编号:30387821
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:17
- 大小:105.07KB
城市道路交通图的计算与分析.docx
《城市道路交通图的计算与分析.docx》由会员分享,可在线阅读,更多相关《城市道路交通图的计算与分析.docx(17页珍藏版)》请在冰豆网上搜索。
城市道路交通图的计算与分析
滁州学院
课程设计报告
课程名称:
数据结构
设计题目:
城市道路交通图的计算与分析
系别:
计算机科学与技术
专业:
计算机科学与技术
组别:
第五组
起止日期:
2011年5月20日~2011年6月20日
指导教师:
杨斌
计算机科学与技术系二○一一年制
课程设计题目
城市交通道路交通图的计算与分析
组长
姚旺
学号
2010211139
班级
10级计科1班
系别
计算机科学与技术
专业
计算机科学与技术
组员
杨泽培张金磊秦翔向士阳周来宇
指导教师
杨斌
课程设计目的
理解图的储存结构和基本操作并能运用于实际问题
课程设计所需环境
MicrosoftvisualC++6.0,windowsXP
课程设计任务要求
完成城市交通路线图显示与输入,用结点表示站点,用边表示线路,用权值表示距离,要求结点数不小于10个;在内存中选择合适数据结构存储上述城市交通路线图;计算任意两个站点的最短路径,给出经过的站点;计算交通图的最小生成树。
课程设计工作进度计划
序号
起止日期
工作内容
分工情况
01
2010.5.25---
2010.5.28
城市交通图的抽象和图的存储结构算法设计
负责人:
张金磊
02
2010.5.29---
2010.6.2
各站点的任意两站点的最短距离算法设计
负责人:
向士阳
03
2010.6.3---
2010.6.4
用floyed算法求两个站点的最短路径算法设计
负责人:
秦翔、周来宇
04
2010.6.5---
2010.6.6
打印两个站点的路径及最短距离算法设计
负责人:
姚旺
05
2010.6.7---
2010.6.8
求最小生成树的算法设计
负责人:
杨泽培
06
2010.6.9---
2010.6.10
各算法的合并、嵌入,课程设计文档的设计
负责人:
杨泽培、姚旺
教研室审核意见:
教研室主任签字:
年月日
目录
1、引言3
1.1、从城市道路交通图谈起3
1.2、用计算机处理实际问题的意义5
2、需求分析5
2.1、城市道路交通图的抽象5
2.2、城市道路交通图算法的设计流6
3、概要设计6
3.1、城市道路交通图算法的进一步分析6
4、详细设计7
4.1、城市道路交通图算法的实现7
4.2、部分代码11
5、调试与操作说明11
5.1、城市道路交通图算法的调试与完善11
6、总结12
6.1、课程设计的总结与体会12
7、致谢12
8、参考文献13
9、附录13
目录字体不对,按照第三组或者模板的格式认真修改。
课程设计的主要内容
1、引言
计算机作为21世纪的功能强大的设备,在生活和生产中已经扮演着十分重要的角色。
那么计算机究竟是怎么处理实际问题,用它处理实际问题有什么意义?
下面我们通过具体问题来讨论。
1.1、从城市道路交通图谈起
21世纪,城市交通已相当发达,因此,如果不对城市交通进行有效地管理,那么将会出现车祸等一系列社会问题。
如果把城市主要的道路和交通站点设计在一张图上,那么就可以很方便地进行管理,以下是北京市的交通图
图1.1北京市的交通图
如果我们把交通图里的各站点用圆表示,各道路用线段表示,那么我们就可以得到下面的结果
7
图1-2城市道路交通图模型
从图中可以发现,城市道路交通图变成了我们熟悉的数据结构里的图结构,因此,我们对交通图的操作就可以转化成对图的基本操作,比如,如果要搜索交通图上的各站点,就可以转化成图的深度遍历或广度遍历,如果要计算两站点之间的最短路程,就可以转化成求两结点间的最短路径等[1]。
这样一来,我们就可以把和交通图有关的问题交给计算机处理,就可以提高效率,节省时间。
1.2、用计算机处理实际问题的意义
上一节中我们谈到了城市交通道路交通图可以通过抽象成数据结构里的图的结构进而可以交给计算机处理,其实现实中还有很多实际问题都可以抽象成计算机模型进而用计算机处理,比如工资表管理问题可以抽象成线性表,一个工程中的关系可以抽象成AOV网等[2]。
用计算机处理问题最明显的好处就是高效率,众所周知,计算机有着极快的计算速度,现实中有些数据之间没有规律可寻,因此实现它们之间的运算就无法利用数学公式,只能一步步地运算,这对人来说是枯燥而费时的工程,但如果交给计算机,可以不到几秒就可以实现庞大的运算,因而节省了许多时间,而人所做的只是设计出算法的基本思想而已。
如今,计算机作为一种工具已经拥有了不可替代的地位,我们作为计算机专业的学生一定要把握机遇,学会将实际问题与学习的知识相结合,提高自身分析问题,解决问题的能力。
接下来我们将以城市道路交通图为例,说明如何将实际问题抽象成计算机可处理的问题。
2、需求分析
之前两节已经谈到实际问题可以抽象成某一模型然后交给计算机解决,但是这种抽象是有条件的,我们抽象出来的模型应与具体事物有一定的相似之处,比如城市交通道路交通图可以抽象成图结构,但是不能抽象成栈或队列,因为它不是线性结构,而栈和队列是典型的线性结构,同时它也不可以抽象成树结构,那是因为它可能是“多对多”的关系,而树是典型的“一对多”结构。
同时,一旦我们把一具体问题交给计算机处理,我们必须要让计算机理解这种实际问题,即我们要用计算机能“识别”的语言来描述它,因此我们在设计算法时不能仅仅局限于基本思想,同时也要考虑到具体实现。
综上,在正式开始设计城市道路交通图的算法时,我们要对其需求进行分析。
2.1、城市道路交通图的抽象
之前已经讨论过,交通图可以抽象成图的结构,将各站点记为图的各结点,各道路记为图的边,那么道路的长度就可以表示为边的权值。
由于各道路之间是相互联通的,所以我们可以用无向图来表示。
图有两种存储结构,一种是邻接矩阵,一种是邻接表,由于邻接矩阵操作简单,故我们用邻接矩阵来存储。
我们主要讨论城市交通路线图的显示与输入,两个站点的最短路径,交通图的最小生成树,因此我们可以运用深度遍历,拓扑排序,Prim等算法的基本思想,这样一来城市道路交通图的抽象工作基本完成了
2.2、城市道路交通图算法的设计流
这一节中我们主要讨论城市道路交通图算法的设计流程和任务分配问题。
本次算法的目的与要求是:
完成市城交通路线图显示与输入,用结点表示站点,用边表示线路;在内存中选择合适数据结构存储上述城市交通路线图;计算任意两个站点的最短路径,给出经过的站点;计算交通图的最小生成树。
其中涉及到5个基本问题:
1.图的邻接矩阵存储(此任务由张金磊同学完成)
2.任意两站点的最短距离(此任务由向士阳同学完成)
3.求两个站点的最短路径(此任务由秦翔同学完成)
4..打印两个站点的路径及最短距离(此任务由姚旺同学完成)
5.打印最小生成树(此任务由杨泽培同学完成)
这5个问题按以上所示顺序依次完成后再由周来宇同学将各算法合并成完整的算法并设计文稿。
本次课程设计可在MicrosoftvisualC++6.0里运行。
3、概要设计
城市道路交通图算法的基本思想:
此算法为城市交通路线图显示与输入,用结点表示站点,用边表示线路,用权值表示距离,结点数不小于10个;在内存中选用邻接矩阵存储上述城市交通路线图并计算任意两个站点的最短路径,给出了经过的站点;计算交通图的最小生成树。
3.1、城市道路交通图算法的进一步分析
图3-1领结矩阵存储数据图
1.首先将图的各个节点序数存储在一维数组中,然后将各个节点的路径存储在二维数组中,对于节点之间无直接路径的用一个计算机可以容许的大的数来代替无穷大存储,用领结矩阵存储数据。
2.任意两站点的最短距离(此任务由向士阳同学完成):
用两个for循环输出两个节点的最短路径,如果是同一节点无需输出其最短路径,否则输出其最短路径。
3.求两个站点的最短路径(此任务由秦翔同学完成):
用三个for循环修改任意两个节点的最短路径并存储在一维数组中,在用另一个一位数组存储下任意两节点之间的路径。
4..打印两个站点的路径及最短距离(此任务由姚旺同学完成):
任意输入两个节点的序号,不论输入的序号大小,总是先最大的序号输出,然后按正序或逆序输出所经过的路径,最后将序号最小的节点输出。
5.打印最小生成树(此任务由杨泽培同学完成):
首先从第一节点开始存储第一节点到其它节点的路径长度,寻找路径最短的并存储其路径和节点,然后修改从此节点到其它节点的最短路径、找最短路径并存储其路径和节点,以此循环到最后一个节点输出结束。
4、详细设计
4.1、城市道路交通图算法的实现
/*城市道路交通图的计算与分析(组长:
姚旺,组员:
秦翔、张金磊、向士阳、杨泽培、周来宇)*/
#include
#include
#defineINT_MAX10000
#definen100
#defineMAXVEX100
typedefstruct
{
inta[n];/*存储结点信息*/
intb[n][n];
intc,e;
}woo;
staticintpath[n][n];
staticintshortest[n][n];
//////////////////////////////////////////////////////////////////////////////
voidshortestbus(woo*&G);
voidprim(woo*&G);
voiddisplay(inti,intj);
voidfloyed(woo*&G);
///////////////////////////////////////////////////////////////////////////////
intmain(void)/*图的邻接矩阵存储(张金磊)*/
{
woo*G=newwoo;
inti,j,a,b,x;
printf("输入结点数和边数:
");
scanf("%d%d",&G->c,&G->e);
printf("输入顶点的信息:
");
for(i=1;i<=G->c;i++)
scanf("%d",&G->a[i]);
for(i=1;i<=G->c;i++)
for(j=1;j<=G->c;j++)
if(i==j)G->b[i][j]=0;
elseG->b[i][j]=INT_MAX;
i=1;
while(i<=G->e)
{
scanf("%d%d%d",&a,&b,&x);
G->b[a][b]=x;
G->b[b][a]=x;
i++;
}
shortestbus(G);
prim(G);
return0;
}
///////////////////////////////////////////////////////////////////////////////
voidshortestbus(woo*&G)/*任意两站点的最短距离(向士阳)*/
{
inti,j;
floyed(G);
for(i=1;i<=G->c;i++)
for(j=1;j<=G->c;j++)
if(i==j);/*如果同一站点到同一站点无需找最短路径*/
else
{
display(i,j);/*找最短路径*/
}
return;
}
////////////////////////////////////////////////////////////////////////////////
voidfloyed(woo*&G)/*用floyed算法求两个站点的最短路径(秦翔)*/
{
inti,j,k;
for(i=1;i<=G->c;i++)
for(j=1;j<=G->c;j++)
{
shortest[i][j]=G->b[i][j];
path[i][j]=0;
}
for(k=1;k<=G->c;k++)
for(i=1;i<=G->c;i++)
for(j=1;j<=G->c;j++)
if(shortest[i][j]>(shortest[i][k]+shortest[k][j]))/*用path[][]记录从i到j的最短路径上点j的前驱站点的序号*/
{
shortest[i][j]=(shortest[i][k]+shortest[k][j]);
path[i][j]=k;
path[j][i]=k;
}
}
////////////////////////////////////////////////////////////////////////////////
voiddisplay(inti,intj)/*打印任意两个站点的路径及最短距离(姚旺)*/
{
inta,b;
a=i;
b=j;
printf("两站点间最短路径是:
");
if(shortest[i][j]!
=INT_MAX)
{
if(i { printf("%d",b); while(path[i][j]! =0)/*把i到j的路径上所有经过的站点按逆序打印出来*/ { printf("<-%d",path[i][j]); if(i j=path[i][j]; else i=path[j][i]; } printf("<-%d",a); printf("(%d->%d)最短距离是: %d米\n",a,b,shortest[a][b]); } else { printf("%d",a); while(path[i][j]! =0)/*把i到j的路径上所有经过的站点按顺序打印出来*/ { printf("->%d",path[i][j]); if(i j=path[i][j]; else i=path[j][i]; } printf("->%d",b); printf("(%d->%d)最短距离是: %5d米\n",a,b,shortest[a][b]); } } else printf("输入错误! 不存在此路! \n"); } ////////////////////////////////////////////////////////////////////////////// voidprim(woo*&G)/*最小生成树(杨泽培、周来宇)*/ { inti,j,k,max; intlowcost[MAXVEX]; intclosest[MAXVEX]; for(i=2;i<=G->c;i++)/*从顶点1开始*/ { lowcost[i]=G->b[1][i]; closest[i]=1; } closest[1]=0; for(i=2;i<=G->c;i++) { max=INT_MAX; j=2; k=i; while(j<=G->c) { if(lowcost[j] =0) { max=lowcost[j]; k=j; } j++; } printf("(%d->%d)",closest[k],k); closest[k]=0; for(j=2;j<=G->c;j++) if(closest[j]! =0&&G->b[k][j] { lowcost[j]=G->b[k][j]; closest[j]=k; } } printf(""); } /////////////////////////////////////////////////////////////////////////// 4.2、部分代码 节点数和边数: 33 输入顶点的信息: 1234 121013202340 5、调试与操作说明 5.1、城市道路交通图算法的调试与完善 节点数和边数: 33 输入顶点的信息: 1234 121013202340 输出: 两点间的最短路径是: 2<-1<1->2>最短距离是: 10米 两点间的最短路径是: 3<-1<1->3>最短距离是: 20米 两点间的最短路径是: 2->1<2->1>最短距离是: 10米 两点间的最短路径是: 3<-1<-2<2->3>最短距离是30: 米 两点间的最短路径是: 3->1<3->1>最短距离是: 20米 两点间的最短路径是: 3->1->2<3->2>最短距离是: 30米 <1-2><1-3> 输入节点数为3、边数为3并输入相应的节点之间的边数最后输出各个间的最短路径、最短距离和最小生成树。 6、总结 6.1、课程设计的总结与体会 此课程设计完成城市交通路线图显示与输入,用结点表示站点,用边表示线路,用权值表示距离,结点数不小于10个;在内存中选择邻接矩阵存储城市交通路线图;计算任意两个站点的最短路径,给出经过的站点;计算交通图的最小生成树。 此程序各个节点序数存储在一维数组中,然后将各个节点的路径存储在二维数组中,对于节点之间无直接路径的用一个计算机可以容许的大的数来代替无穷大存储,用领结矩阵存储数据[3]。 用两个for循环输出两个节点的最短路径,如果是同一节点无需输出其最短路径,否则输出其最短路径。 用三个for循环修改任意两个节点的最短路径并存储在一维数组中,再用个一位数组存储下任意两节点之间的路径。 任意输入两个节点的序号,不论输入的序号大小,总是先最大的序号输出,然后按正序或逆序输出所经过的路径,最后将序号最小的节点输出,这也是是我们这次课程设计的难点。 首先从第一节点开始存储第一节点到其它节点的路径长度,寻找路径最短的并存储其路径和节点,然后修改从此节点到其它节点的最短路径、找最短路径并存储其路径和节点,以此循环到最后一个节点输出结束。 通过此课程设计了加深了我们对图的相关算法与存储方式,城市交通站点与线路的输入与存储,站点间最短路径、交通图的最小生成树等问题的理解、增加了我们学习数据结构的兴趣和积极性同时也完善了我们对图的不足地方对今后的学习有很大帮助。 我们小组各成员齐心协力完成课程设计加深了我们团结的力量、提高了共同完成课程设计的能力,也为以后的工作打下了基础。 此课程设计也存在许多问题,此课程设计没有实现具体以城市作为节点而是以序号表示,我们将再次改进这个缺点 7、致谢 感谢姚旺、秦翔、张金磊、向士阳、杨泽培、周来宇成员的齐心努力。 8、参考文献 [1]胡学刚.数据结构(C语言版)[M].北京: 高等教育出版社,2008. [2]严蔚敏,吴伟明.数据结构(C语言版)[M].北京: 清华大学出版社,2008. [3]徐孝凯.数据结构辅导与提高[M].北京: 清华大学出版社,2008. 9、附录 图是较线性表和树更为复杂的数据结构。 在图形结构中,结点之间的关系可以是任意的,图中任意两个元素之间都可能相关。 指导教师评语: 指导教师签名: 年月日 成绩 教研室审核意见: 教研室主任签字: 年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 城市道路 交通图 计算 分析