个人项目关于北京地铁线路出行线路规划



一  问题重述

1.实现地铁线路的加载

2.实现查询指定线路所有站点(包括换乘信息)

3.实现查询指定两个站点间的最短路径



二  功能设计

1.实现地铁线路的加载

-map subway.txt //将存储在subway.txt文件里的地铁线路进行读取

2.实现查询指定线路所有站点

-a 地铁线路名称 -map subway.txt -o station.txt //读取subway.txt文件信息后,通过输入的地铁线路名称,将指定地铁线路的所有站点写入station.txt文件

3.实现查询指定两个站点间的最短路径

-b 起始站点 目的站点 -map subway.txt -o routine.txt //读取subway.txt文件信息后,通过输入的起始站点和目的站点,将最短路径的所有站点写入routine.txt文件

 



三  项目内容

1.文本地图存储方式

地铁线路名称
站点1 站点2[其它途经地铁线1][其它途经地铁线2……] …… 站点n

以地铁1号线为例

1号线
苹果园 古城 八角游乐园 八宝山 玉泉路 五棵松 万寿路 公主坟[10号线] 军事博物馆[9号线] 木樨地 南礼士路 复兴门[2号线] 西单[4号线] 天安门西 天安门东 王府井 东单[5号线] 建国门[2号线] 永安里 国贸[10号线] 大望路[14号线东段] 四惠[八通线] 四惠东[八通线]

注意:地铁站名使用中文字符以外,其它所有字符均采用英文半角字符。站点信息中也应不存在空格符,比如 公主坟[ 10号线]

2.文本与程序数据转换

class SubwayLine
{
	public String Name;
	public List<String> InLineSubwayStationsName;
}
class Station
{
	public String Name;
	public boolean IsTransferStation ;
	public List<String> PlacedSubwayLineName;
}

  

这里以两行为一个单位进行读取,能够读取地铁线路名称及对应的所有站点信息

while ((lineTxt = br.readLine()) != null) {//首先读取第一行的地铁线路名称

        sl.setName(lineTxt);
    if((lineTxt = br.readLine()) != null) {//然后读取第二行站点信息
	stations=lineTxt.split(" ");       //对第二行站点信息进行以空格切分,并且存入String[]stations
	subwaystations=new ArrayList<>(stations.length);
        List<String> updatesubwaystations=new ArrayList<>(stations.length);   Collections.addAll(subwaystations, stations);     ******

然后用正则表达式对每个站点的信息进行提取,存入SubwayLine结构,然后合并所有SubwayLine为一个Hashtable SubwayLines的排序列表。结合所有路线信息,创建另一个排序列表List<String> subwaystationnames 实现站点名与邻接矩阵下标的对应关系,不会创建重复的站点名键

  

3.创建邻接矩阵(UDG)

	 public MatrixUDG(List<String> vexs, ArrayList<ArrayList<String>> edges) {//vexs为地铁所有站名集合,edges为二维数组存放每个站点所处所有线路的相邻站点信息

	        // 初始化"顶点数"和"边数"
	        int vlen = vexs.size();
	        int elen = edges.size();
	        // 初始化"顶点"
	        mVexs = new ArrayList<String>();
	        mVexs.addAll(vexs);

	        // 初始化邻接矩阵
	        mMatrix=new int[vlen][vlen];
	        for(int i=0;i<vlen;i++) {
	        	for(int j=0;j<vlen;j++)
	        		mMatrix[i][j] =INF;
	        }

	        for (int i = 0; i < elen; i++) {
	            // 读取边的起始顶点和结束顶点
	            int p1 = getPosition(edges.get(i).get(0));
	            int p2 = getPosition(edges.get(i).get(1));	          

	            mMatrix[p1][p2] = 1;
	            mMatrix[p2][p1] = 1;
	        }

	    }

  

4.Floyd算法(求多源最短路径)

 public  void floyd(int[][] matrix){//通过已经建立的mMatrix矩阵,进行floyd算法计算
  int size=matrix.length;
  for(int i=0;i<size;i++){
   for(int j=0;j<size;j++){
    path[i][j]=-1;
    dist[i][j]=matrix[i][j];
   }
  }
  for(int k=0;k<size;k++){
   for(int i=0;i<size;i++){
    for(int j=0;j<size;j++){
     if(dist[i][k]!=INF&&
      dist[k][j]!=INF&&
      dist[i][k]+dist[k][j]<dist[i][j]){//dist[i][k]+dist[k][j]>dist[i][j]-->longestPath
      dist[i][j]=dist[i][k]+dist[k][j];
      path[i][j]=k;
     }
    }
   }
  }

 }

采用Floyd最短路径算法进行计算,这个方法较为简单,一次计算所有的路径后存储于矩阵中,采用了递归的方式,不断在两点之间寻找最短中转点,直到两个点为相邻点,这样就可以通过Floyd路径矩阵找到完整的路径

5.测试

-map BJsubway.txt  ----->成功读取subway.txt文件

  

-a 1号线 -map BJsubway.txt -o station.txt  ----->已将结果写入station.txt文件     

  

  station.txt内容

  苹果园
  古城
  八角游乐园
  八宝山
  玉泉路
  五棵松
  万寿路
  公主坟
  军事博物馆
  木樨地
  南礼士路
  复兴门
  西单
  天安门西
  天安门东
  王府井
  东单
  建国门
  永安里
  国贸
  大望路
  四惠
  四惠东

-b 大井 动物园 -map BJsubway.txt -o routine.txt  ----->已将结果写入routine. txt文件

  routine.txt内容

  共计9个站点
  大井
  七里庄
  六里桥东
  北京西站
  军事博物馆
  白堆子
  白石桥南
  国家图书馆
  动物园



四 项目总结学习

本次个人项目共花费四天时间,虽然还有细节未完成

第一天计划并完成文本地图的存储和文本数据与程序的转化,对先前的地铁线路信息的存储格式进行修改,通过查询构建新的存储结构,之后在数据与程序的转化上,粗浅学习了正则表达式

第二天计划并完成无向图的邻接矩阵的创建,将vexs地铁站点名称集合和edges各站点相邻信息输入,得到以INF,1分布的邻接矩阵(mMatrix[i][j]==1表示站点i与站点相邻,INF表示无邻边)

第三天计划并完成Floyd算法实现两点最短路径,学习和比较了Floyd算法和Dijksta算法,Floyd算法的path[][]矩阵的更新比较难理解,将构建的邻接矩阵作为输入,得到两点的最短路径

第四天整理和完成代码修正,文档博客编写

整个项目完成下来,头是真的大,各种细小的东西都得自己研究,比如:各种类型之间的转换,subwaylines该用什么结构进行存储,List<String>的内容如何存入txt文件,如何将Object对象存入txt文件等等,总的来说,这次的个人项目对自己帮助挺大的,感觉学会了独立生存,别人的建议只能是咨询,自己的想法才是关键

Github地址:https://github.com/Kuzzri/JavSubway

原文地址:https://www.cnblogs.com/ggsmd31701088/p/11671055.html

时间: 2024-08-28 11:47:00

个人项目关于北京地铁线路出行线路规划的相关文章

项目三 北京地铁之psp表格

PSP2.1 Personal software process stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 80 80 ·Estimate ·估计这个任务需要多少时间 70 60 Development 开发 200 ·Analysis ·需求分析(包括学习新技术) 2000 ·Design Spec ·生成设计文档 70 ·Design Review ·设计复审(和同事审核设计文档) 120 ·Coding Standard ·代码规范(为当前的开发制定合适的规

北京地铁出行线路规划——个人项目

项目地址 详见: 一.基本功能 获取地铁线路图. 以参数 -map 作为标志,来获得对应的自定义地铁线路图信息文件(命名为 Subway.txt).输入格式如: java Subway -map Subway.txt 获取指定地铁线路. 以参数 -a 作为标志,并输入指定地铁线路,输出的文件以参数 -o 来指定.从线路的起始站点开始,依次输出该地铁线经过的所有站点,直到终点站.输入格式如: java Subway -a 1号线 -map Subway.txt -o Station.txt 输入起

北京地铁出行线路规划——代码实现

项目概述 根据输入的出发站和终点站推荐最短路线,显示搭乘线路及经过站点 采用Dijkstra算法,采用HashMap作为主要数据存取结构 运行结果:       代码分析  txt文件用空格分隔,先存储在LinkedHashSet中 public class Data { public static LinkedHashSet<List<Station>> lineSet = new LinkedHashSet<>();//List<Station>集合 p

个人项目-地铁出行线路规划程序

PSP表格 PSP 2.1 Personal Software Process Stages Planning Time(H) Used Time(H) Planning 计划 0.5 0.25 · Estimate · 估计这个任务需要多少时间 0.5 0.25 Development 开发 25.5 45.9 · Analysis · 需求分析 (包括学习新技术) 10 13 · Design Spec · 生成设计文档 2 3 · Design Review · 设计复审 (和同事审核设计

天津地铁出行线路规划项目需求分析与设计思路分析

天津地铁出行线路规划项目需求分析与设计思路分析 项目概要 以下是天津地铁线路总图,本项目的受众可以通过本软件,获得天津市地铁出行最便捷,最快速的线路推荐. 需求分析 实现一个帮助进行地铁出行路线规划的命令行程序. 支持地铁线路的更改,站点更改.取消与添加,以及线路的局部封闭. 支持查询线路的所有站点. 支持查询到某终止站点的途径最少站点的路线. 数据存储结构分析 由于单一的线路表与站点表是无法表示如此复杂的地铁线路情况的. 有多个前驱的站点如:,以及有多个后继的站点如:,这种情况无法只通过这两个

个人项目——北京地铁线路规划

一.前言 现实和理想的差距总是那么大,在过程中碰到的坑比预期的还多(说那么多,其实就是自己菜),过程中复习了淡忘已久的许多算法和数据结构,一边深刻的体会着自己是多菜,一边也体会到了自身一点点微小的进步,大概. 二.项目简介 实现北京地铁查询功能 附上一张北京地铁的图: 三.项目地址 https://github.com/fireworks-EX/MetroLinePlanning 四.需求分析 1.确定储存及读取地铁线路数据文件的格式 2.支持用户输入的地铁线路的查询 3.提供用户指定两站点间的

个人项目--北京地铁线路规划(已完成)

一.任务: 实现一个帮助进行北京地铁出行路线规划的命令行程序. 二.需求分析及实现 需求1 在程序启动时,自动获取到地图信息 需要实现一个支持自动加载subway.txt 文件的程序 需求2 查询指定地铁线经过的站点 在应用程序上,需要支持一个新的命令行参数  -a ,指定用户希望查询的地铁线路. 在给定地铁线路时,程序需要从线路的起始站点开始,依次输出该地铁线经过的所有站点,直到终点站.输出的文件使用-o参数来指定. 一个调用应用程序的示例如下: java subway -a 1号线 -map

北京地铁线路规划

北京地铁线路规划 任务 个人项目的主要任务就是通过地铁出行的人能够通过该软件很快找到最快到达目的地的出行线路规划. 项目需求 用户根据-map参数来获得所有北京地铁线路信息 java subway -map subway.txt 那么这里的重点就在于如何存储这个subway.txt文件了,首先我们还是看一张北京地铁1号线的图 ![](https://img2018.cnblogs.com/blog/1806411/201909/1806411-20190922113916097-18761194

北京地铁线路规划程序

程序说明: 这个项目是记录地铁线路并且加以计算,所以储存线路是其中的关键部分. 经过慎重的思考以及选择,最后决定采用链表的形式储存整个地图,因为地图的站点分布不均匀,采用邻接矩阵很不合适无法对齐,这样的方式也比邻接链表要方便. 最终的储存结构中,每个站点都有一个单独的station对象,并且储存了相关的信息,站与站之间按照线路排列,每一条线路的起点被专门放在一个数组里面方便访问. 问题地址:http://www.cnblogs.com/jiel/p/5852591.html 输入文件说明: 保存