Compare commits

..

35 Commits

Author SHA1 Message Date
yangtengze 5955db9dab change
1 year ago
yangtengze eaef1e6a9d change
1 year ago
yangtengze d6ca81fcb3 change
1 year ago
yangtengze 81db3eecb7 Merge branch '杨腾泽'
1 year ago
yangtengze 50c2acf937 change
1 year ago
pu82zbfle 5785d337c5 Update README.md
1 year ago
pu82zbfle 319382b65c Update README.md
1 year ago
李培毅 c5c0de9d35 1
1 year ago
p2i3t8vuh fcdc8f5d67 Update README.md
1 year ago
刘鑫成 0058d419d3 123456
1 year ago
刘鑫成 56e1334dd0 12345
1 year ago
p2i3t8vuh 7127204611 Update README.md
1 year ago
p2i3t8vuh 4c3d94f29b Update README.md
1 year ago
p2i3t8vuh dbaa03016d Update README.md
1 year ago
p2i3t8vuh 62bd11abf7 Update README.md
1 year ago
p2i3t8vuh ec4c843e0d Update README.md
1 year ago
刘鑫成 9101256f1a 修改
1 year ago
pi9jl6p58 705b67e5ec Update README.md
1 year ago
pi9jl6p58 231259d2fa Update README.md
1 year ago
刘鑫成 5e562cc30a 123
1 year ago
p2i3t8vuh 2996b7565e Update README.md
1 year ago
p2i3t8vuh e875682330 Update README.md
1 year ago
p2i3t8vuh 97f29fa17e Update README.md
1 year ago
p2i3t8vuh 0586d3f972 Update README.md
1 year ago
p2i3t8vuh 33c35066fa Update README.md
1 year ago
p2i3t8vuh 4e018694bd Update README.md
1 year ago
p2i3t8vuh 74bbadd294 Update README.md
1 year ago
p2i3t8vuh 27ba46d149 Update README.md
1 year ago
p2i3t8vuh d8c541a791 Update README.md
1 year ago
刘鑫成 49ca7b54e6 系统实现
1 year ago
刘鑫成 e38566bbb2 实现
1 year ago
刘鑫成 6910ccbfc7 111
1 year ago
刘鑫成 0ff6efdb73 修改一部分
1 year ago
刘鑫成 8864c98679 1
1 year ago
pi9jl6p58 6f32345c3e Update README.md
1 year ago

@ -24,12 +24,18 @@
| 25 | 25 | 25 | 25 | | 25 | 25 | 25 | 25 |
(1) 基于真实的公路数据建立导航地图模型,编制成格式简单的数据文件包括城市线路名称、站点名称。
(2)系统能够读取公路导航地图数据文件,建立公路模型,也能够将模型输出成数据文件,以便验证模型的正确性。
(3)通过人机交互的方式输入起点和终点站名称,系统给出路径长度最短的导航路径。
(4)能够读取不同的地铁导航地图进行功能测试。
# 1. 系统分析 # 1. 系统分析
通过各种算法,实现公路导航
## 1.1 问题描述 ## 1.1 问题描述
设计一个城市公路导航系统,能够计算出省内及周边任意两个城市之间的导航路径及最短距离。选择一个合适的省份,省内及周边城市数量在 100 个左右(最少不低于 80 个)。查阅相关资料获取邻近城市之间的公路里程数据,建立导航地图。任意指定两个城市作为起点和终点,系统能够计算出两个城市之间的最短距离和导航路径。 交通网络中常常提出这样的问题:从甲地到乙地之间是否有公路连通?在有多条通路的情况下,哪一条路最短?导航系统便可以解决这样的问题。与此同时,城市的扩建,新地点的添加,新道路的修建,需要导航系统具备添加新地点,添加新路线的功能。而受一些生态工程的实施,例如退耕还林还草,和自然条件的影响,本来存在的一些地点或道路需要删除或更改,此时导航图还应该及时的更新,以适应新的查找两点间最短路径的需要。
除此之外,用户的查找应是极为方便的,对于最短路线, 新添加的地点和路径以及删除的地点和路径的感知应是直观的,这样才能真正的给使用导航系统的人们提供方便。
1基于真实的公路地图数据建立导航地图模型编制成格式简单的数据文件包括城市名称以及邻近城市之间的公路里程数。 1基于真实的公路地图数据建立导航地图模型编制成格式简单的数据文件包括城市名称以及邻近城市之间的公路里程数。
@ -50,72 +56,123 @@
明确解决问题的关键,核心数据结构,核心算法等。 明确解决问题的关键,核心数据结构,核心算法等。
确定解决问题的总体思路和方案。 确定解决问题的总体思路和方案:使用dijkxtra最短路径进行计算
## 1.3 需求分析 ## 1.3 需求分析
### 1输入和输出 ### 1输入和输出
输入形式: 输入城市编号,即可显示该城市的具体信息,最短路径等。
构建图时,输入顶点、弧涉及的信息,包括:起始地、目的地、长度、该弧此时间段的平均速度等信息; 输入:城市的编号,城市之间的路径
用户或者客户要输入出发地和目的地,并选择何种最优决策的路线规划。 输出:城市的编号,名称,最短路径
输出形式:根据用户需求输出对应信息
输出最短路程所需要的路线信息和最短路程;
输出最短时间所需要的路线信息和最短时间。
### 2数据字典 ### 2数据字典
地点 = 城市名 + 编号 + 地点介绍 + 弧边 城市 = 城市编号 + 城市名称 + 城市介绍
城市编号:城市的唯一标识符
主键城市名称:城市的中文名称
城市位置:城市的坐标位置
城市之间的路径
### 3数据文件 ### 3数据文件
系统中需要读取xx数据文件以获取xx数据或者需要导出xx数据。举例说明xx数据文件的具体格式。
### 4参数设定 系统中需要读取以下文件以获得城市的边信息数据
系统开始运行时,需要设置的参数。可以用户手册的形式给出设定参数的过程,如系统提示信息和用户输入等。 creat.h
### 5XX功能
其他具体功能。 功能:创建图结构
输入:给图中的点赋予该点的编号,名称以及简介
输出:无
首先简要说明该功能的主要作用,可以用户手册的形式给出系统提示信息、用户输入和系统输出等。
### 6XX功能 function.h
其他功能逐项列出。
功能:连接任意两个点
输入:两个点的编号
输出:无
menu.cpp
功能:输出所有的功能目录
输入:选择的功能编号
输出返回一个值给main函数
short.h
功能用Dijkstra算法求给出的一点到其余个点的最短路径
输入:源点
输出:地点的最短路程以及路径
### 4参数设定
构建图结构给图中点位赋予编号,名称,简介
### 5地图信息修改功能
输入修改编号,即可对指定城市进行修改
功能:修改城市信息
输入:要修改的城市编号
输出:无
### 6路经查询功能
输入任意两个城市,输出这两个城市之间的最短路径(路径距离和具体的经过的城市名称)
### 6导航规划功能
系统可以根据用户输入的出发地和目的地,计算出最短路径,供用户导航。
# 2. 系统设计
## 2.1 概要设计
系统划分为几个模块,可以画模块图。
逐个说明每个模块的功能(输入、输出、做什么,这里不写怎么做)。
# 2. 系统设计
## 2.1 概要设计
查找数据模块:城市信息、道路连接信息、路径长度等数据,提供给其他模块作为输出。
最短路径查询模块:接收用户输入出发地和目的地,用Dijkstra算法计算最短路径,输出路径距离和路径序列。
数据修改模块:根据用户想要修改的城市信息,输入编号,修改此城市信息
删除数据模块:根据用户想要删除的城市,输入编号,删除该城市与其邻接点城市的所有信息。
增加数据模块:添加城市,添加编号,添加该城市的邻接点及路径信息。
DFS遍历输出输出所有城市信息。
## 2.2 数据结构设计 ## 2.2 数据结构设计
首先,分析对比几种可选的数据结构设计方案。如图可以采用邻接矩阵,也可以采用邻接表,表示集合可以用普通的查找表,还可以用不相交集。给出每一种设计方案的特点(优势、不足等)。然后,综合考虑各种因素(空间、时间、乃至团队成员的水平等),给出你的选择。 首先,分析对比几种可选的数据结构设计方案。如图可以采用邻接矩阵,也可以采用邻接表,表示集合可以用普通的查找表,还可以用不相交集。给出每一种设计方案的特点(优势、不足等)。然后,综合考虑各种因素(空间、时间、乃至团队成员的水平等),给出你的选择。
### 1xxx结构 ### 1邻接矩阵
```
给出核心数据结构的设计,包括文字描述和示意图。讲清楚数据是如何组织的。多个数据结构,逐一列出。 struct MatGrath
{
int vexnum; //顶点数
int arcnum; //边数
VertexType vexs[M]; //在图结构体中调用点的结构体
ArcCell arc[M][M]; //在图结构体中调用边的结构体
};
```
例如3个城市的网络它的邻接矩阵可以表示为
### 2xxx结构 ```
青岛市 即墨区 胶州市
青岛市 0 51 41
即墨区 51 0 56
胶州市 41 56 0
给出核心数据结构的设计,包括文字描述和示意图。讲清楚数据是如何组织的。 ```
### ###
@ -124,6 +181,78 @@
首先,分析对比几种可选的算法设计方案。如是否排序,广度优先或深度优先搜索等。给出每一种设计方案的特点(优势、不足)。然后,综合考虑各种因素(空间、时间、乃至团队成员的水平等),给出你的选择。 首先,分析对比几种可选的算法设计方案。如是否排序,广度优先或深度优先搜索等。给出每一种设计方案的特点(优势、不足)。然后,综合考虑各种因素(空间、时间、乃至团队成员的水平等),给出你的选择。
### 1Dijkstra算法 ### 1Dijkstra算法
```
int Ppath2(MatGrath &G,int path[],int i,int v) //前向递归查找路径上的顶点
{
int k;
k=path[i];
if (k==v)
return k; //找到了起点则返回
Ppath2(G,path,k,v); //找顶点k的前一个顶点
printf("%s->",G.vexs[k].sight);//输出顶点k
}
int danyuan(MatGrath &G,int v)//求两点之间的最短路径
{
int dist[MAXV],path[MAXV];
int s[MAXV];
int mindis,i,j,u;
for (i=1; i<=G.vexnum; i++)
{
dist[i]=G.arc[v][i].length; //距离初始化
s[i]=0; //s[]置空
if (G.arc[v][i].length<INF) //
path[i]=v;
else
path[i]=-1;
}
s[v]=1;
path[v]=0; //源点编号v放入s中
for (i=1; i<=G.vexnum; i++) //循环直到所有顶点的最短路径都求出
{
mindis=INF; //mindis置最小长度初值
for (j=1; j<=G.vexnum; j++) //选取不在s中且具有最小距离的顶点u
if (s[j]==0 && dist[j]<mindis)
{
u=j;
mindis=dist[j];
}
s[u]=1; //顶点u加入s中
for (j=1; j<=G.vexnum; j++) //修改不在s中的顶点的距离
if (s[j]==0)
if (G.arc[u][j].length<INF && dist[u]+G.arc[u][j].length<dist[j])
{
dist[j]=dist[u]+G.arc[u][j].length;
path[j]=u;
}
}
for(i=1; i<=G.vexnum; i++)
if (s[i]==1&&v!=i)
{
printf(" 从%s到%s的最短路径长度为:%d米\t路径为:",G.vexs[v].sight,G.vexs[i].sight,dist[i]);
printf("%s->",G.vexs[v].sight); //输出路径上的起点
Ppath2(G,path,i,v); //输出路径上的中间点
printf("%s\n",G.vexs[i].sight); //输出路径上的终点
}
}
int Ppath1(MatGrath &G,int path[][MAXV],int v,int w) //前向递归查找路径上的顶点
{
int k;
k=path[v][w];
if (k==-1) return 0; //找到了起点则返回
Ppath1(G,path,v,k); //找顶点i的前一个顶点k
printf("%s->",G.vexs[k].sight);
Ppath1(G,path,k,w); //找顶点k的前一个顶点j
}
```
求最短路径Dijkstra算法的实现 求最短路径Dijkstra算法的实现
@ -155,13 +284,6 @@ while (Father[vvv] != -1 && Father[vvv] != v)
给出核心算法的设计,包括伪代码或流程图。多个核心算法,逐一列出。只列举解决问题的核心算法,重点讲清楚是如何解决问题的。 给出核心算法的设计,包括伪代码或流程图。多个核心算法,逐一列出。只列举解决问题的核心算法,重点讲清楚是如何解决问题的。
### 2XXX算法
给出核心算法的设计,包括伪代码或流程图。
@ -170,9 +292,9 @@ while (Father[vvv] != -1 && Father[vvv] != v)
# 3. 系统实现 # 3. 系统实现
本次使用的程序语言为C++开发工具为VScode 采用C++、利用VSCode实现
介绍项目的文件结构,以及主要函数的功能 本程序首先是用户编辑界面用户根据自己的需求编写地图从而加入顶点的数组之中创建的地图用邻接矩阵存储在从主函数之中进行调用实现对两个算法的调用。用户在输入顶点以及边的信息都会存储在存储成功之后会提示用户存储成功之后进入到菜单界面菜单界面提供两种选择口合分别可以调运Dijkstra和Floyd算法调用之后输入相应的口令以及要查询的城市编号 算法会根据邻接矩阵存储的地图进行计算求出最短路径。在以后使用完系统后可输入口合 0系统会结束一切运算退出程序
@ -201,20 +323,17 @@ struct MatGrath
VertexType vexs[NO]; //在图结构体中调用点的结构体 VertexType vexs[NO]; //在图结构体中调用点的结构体
ArcCell arc[NO][NO]; //在图结构体中调用边的结构体 ArcCell arc[NO][NO]; //在图结构体中调用边的结构体
}; };
```
对该数据结构的特点进行分析。
## 3.2 核心算法的实现 ## 3.2 核心算法的实现
主函数可以分为以下几个模块:
1. 数据读取模块:读取CityInfo.txt文件,构建城市网络,存储在邻接矩阵中。
2. 用户交互模块:提供用户交互界面,获取用户位置信息及路径查询请求。
3. 位置确定模块:通过城市名称获取城市在邻接矩阵中的位置序号,以供路径查询使用。
4. 路径查询模块:选择Dijkstra算法或动态规划算法计算路径,并返回路径信息。
5. 路径显示模块:将计算得到的路径用可视化方式显示给用户。
在验证到其他城市中间不超过 2 个城市时新建一个二维数组将原二维数组中的权值全部改为1这样用dijkstra算法得到的权值最小的路径就经过节点最少的路径。 在验证到其他城市中间不超过 2 个城市时新建一个二维数组将原二维数组中的权值全部改为1这样用dijkstra算法得到的权值最小的路径就经过节点最少的路径。
@ -277,14 +396,16 @@ int ShortestPath(MatGrath &G,int v,int w)//求两点之间的最短路径
printf("从%d到%d不存在路径\n",v,w); printf("从%d到%d不存在路径\n",v,w);
} }
``` ```
int Ppath2(MatGrath &G,int path[],int i,int v) //前向递归查找路径上的顶点
{
int k;
k=path[i];
if (k==v)
return k; //找到了起点则返回
Ppath2(G,path,k,v); //找顶点k的前一个顶点
printf("%s->",G.vexs[k].sight);//输出顶点k
}
对该算法的时间和空间复杂度进行分析。
@ -299,6 +420,20 @@ int ShortestPath(MatGrath &G,int v,int w)//求两点之间的最短路径
测试应考虑到输入数据的特殊情况。 测试应考虑到输入数据的特殊情况。
给出若干测试用例,包括输入、预期结果、运行结果或是否通过测试。运行结果和预期结果一致,为通过测试。 给出若干测试用例,包括输入、预期结果、运行结果或是否通过测试。运行结果和预期结果一致,为通过测试。
测试样例如下:
测试样例1
输入:曹县 滨州
预期输出:曹县->滨州 437
实际输出:曹县->郓城->邹平->滨州 437
实际结果和预期结果一致
测试样例2
输入:滨州 济南
预期输出:不存在
实际输出Error!!!请输入正确的城市名称
实际结果和预期结果一致
@ -322,12 +457,12 @@ int ShortestPath(MatGrath &G,int v,int w)//求两点之间的最短路径
杨腾泽:通过这次数据结构课程设计,我对《数据结构》这门课程有了更深一步的了解,使我对《数据结构》这门课程掌握以及运用更加灵活·同时也让我发现了自已在这门课上的不足与缺陷,同时也明确了自己在以后的类似课程中的具体学习方法。 杨腾泽:通过这次数据结构课程设计,我对《数据结构》这门课程有了更深一步的了解,使我对《数据结构》这门课程掌握以及运用更加灵活·同时也让我发现了自已在这门课上的不足与缺陷,同时也明确了自己在以后的类似课程中的具体学习方法。
这次在应用中我发现了自己的很多不足在编写城市公路导航系统的过程中自己C语言方面的只是掌握太少很多功能需求只能退而求其次一次又一 次的更改,一次又一次的失败,也终于是在最后也完成了自己的要求,同时我也 知道了平时用功学习的重要性。尤其是在日常学习之中,对于单一的只是点也许 掌握的还不错,但是自己动手太少,实践经验严重不足,且面临课程设计之时,要求多方面的只是结和编码,对于我而言还是有很大的难度的。 如此次对于邻接 矩阵的存储于读取,以及最短路算法的实现,两个及其重要的算法,狄克斯特算法和佛洛依德算法,在具体的应用上还是有很多不足 这次在应用中我发现了自己的很多不足在编写城市公路导航系统的过程中自己C语言方面的只是掌握太少很多功能需求只能退而求其次一次又一 次的更改,一次又一次的失败,也终于是在最后也完成了自己的要求,同时我也 知道了平时用功学习的重要性。尤其是在日常学习之中,对于单一的只是点也许 掌握的还不错,但是自己动手太少,实践经验严重不足,且面临课程设计之时,要求多方面的只是结和编码,对于我而言还是有很大的难度的。 如此次对于邻接 矩阵的存储于读取,以及最短路算法的实现,两个及其重要的算法,狄克斯特算法和佛洛依德算法,在具体的应用上还是有很多不足
刘鑫成: 刘鑫成:本次的系统研发研活动,让我体验到了程序开发的复杂性与程序开发成功的自豪感,一个项目的完成离不开一个团队的团结协作,在进行项目时,需要对其进行反复的纠错和改进,在更改和发现中不断地改进和提升自,从而丰富自己。这次团队体验,让我能够初步地体会到一个团队间的分工协作的重要性,成员分工以及项目领导者的重要性,让我受益匪浅
李培毅:
孙英皓: 李培毅:本次的系统研发研活动让我受益匪浅,面对一个具有挑战性的项目,首先是我们不能畏惧, 要以一种积极的心态去面对,分析并抓住关键所在。因为我们所即将 应对的每一个项目都是既需要实际操作,又需要详细规划的。其次团队成员之间的合作是非常重要的,只有进行有效的沟通交流,互相帮助,我们的任务才能顺利快速的完成。
孙英皓:本次的系统研发研活动让我受益良多。我深刻体会到了算法在实际问题解决中的重要性,无论是个人工作还是团队项目,都发挥着无可替代的作用。
此次项目使我更加深入地了解算法的重要性,并培养了我解决问题的能力。给予了我宝贵的经验,对我产生了积极的影响,在今后我也将继续学习数据结构、算法、软件工程等方面的知识,不断完善自己。

Loading…
Cancel
Save