北京地铁最短路径实现

北京地铁最短路径规划

github地址 github

需求理解

  • 将地铁线路保存成一个可读入,简洁明了的文本
  • 程序能正确读入这个文件,并获取地铁线路信息
  • 程序能正确处理输入的命令行
  • 地铁能正确输出指定地铁线经过的站点
  • 程序能正确输出两个站点间的最短路径
  • 程序要有健壮性,能通过各类性能测试
  • 按要求编写博客,详细说明花费时间,代码,各个模块和测试用例

    文本存储方式

该文本直接保存进了各条线路的各个站点,没有在文本中考虑换乘点。当读入“一号线”等文字时,将它转换为线路的id号,然后在way数组中作为下标,将后面的各个站点的id号存储进去。换乘情况的话,因为每新读入一个站点,都会给它赋一个id号,所以只要每次判断该站点是否有id号了,如已存在,该站点就是换乘点,保存换乘信息。例如上图中一号线的西单,在四号线中也存在,所以该站点就可以换乘一号线或四号线。

实际所需时间

模块结构

共一个类:Subway
Subway类共有六个函数:

  1. public static void searchWay(String name, String args):该函数的目标是用来满足需求二,保存所查询线路的各个站点。name就是通过命令行输入的线路的名称,args就是保存信息的文件名称。
    该函数先通过if语句判断来得到线路的id号,然后在way数组下得到各个站点的id号,然后根据id号调用getKey()函数得到站点名称,保存进文件中。
  2. public static int findMinDist(int[] dist,int[] collected):该函数的作用是在未被收录的顶站中寻找dist最小的一个站点。
  3. public static void dijkstra(String station1,String station2, String baocun):该函数的算法是采用了dijkstra算法,该算法是先利用上面的findMinDist函数找到距离起点最小的点,然后更新其他点到起点的距离。在更新的过程中,判断了某个站点是否是换乘点,如果是的话,就更新这条路的换乘次数,最后当路径长度一致时,根据换乘次数来选择是哪一条路径,当换乘次数也一致时,就两条路径都输出。判断某个站点是否是换乘点的方法是通过一个二重循环,一个一重循环;先通过二重循环找到当前站点和前一个站点在共同的哪一个线路上,再判断当前站点的前前站点是否在这条线路上,若不在,则说明前一个站点是换乘点,保存信息。
  4. public static String getKey(int value):该函数的作用就是通过id号来得到站点的名称;
  5. public static void main(String[] args) throws FileNotFoundException:main函数就是处理各种参数,建好map这个表,为每个站点赋好id,为每条线路赋好id号,设置好相邻站点间的距离为1,保存好每条线路上的各个站点。


  6. public static void shuchu(int[] dist,int[] path,int[][] exchange,int e,int s,int count,int[] changePoint, String baocun):该函数是用于将最短路径上所经过的站点和在哪个站点换乘几号线的信息保存到文件名问baocun的文件中去;先用wayTo这个数组保存整条路径,然后将wayTo这个数组里的id号和保存的换乘点的id号进行比较,如果该站点是换乘点,就在下一站输出前,输出需要换乘到几号线。

    性能改进

  7. 因为dijkstra算法是将起点到其他每个站点间的最短路径都求出来了,所以会加大运行时间和保存空间,所以在写代码的时候,当有一次点到了我们的终点时,就break。这样只会运行和保存起点到终点的路径,其他站点不需要考虑。
  8. 因为存在路径长度相同,换乘次数一样的情况,所以两条路径都需要输出,让乘客自主选择,所以会运行保存到文件的代码多次,所以我写了一个函数shuchu,这样只要多次调用一个函数,而不用多次书写同一份代码了。还有根据id号得到名称,也需要多次写同一份代码,所以变成一个函数,多次调用即可。

    测试用例

    需求一

    需求二


    需求三


    正确性测试

  9. 十三陵景区 北邵洼(无换乘)
  10. 十三陵景区 育知路(换乘一次)
  11. 积水潭 平安里(路径长度一致,换乘次数一样,两条线路一起输出,并且二号线循环)
  12. 积水潭 苏州街(两次换乘)
  13. 莲花桥 北京西站(路径长度一致,但换乘次数少)
  14. 中国美术馆 天安门西(路径长度一致,换乘次数一样,三次,两条线路一起输出)
  15. 石厂 二号航站楼(超长线路)
  16. 国贸 高碑店(一号线和八通线)

    鲁棒性测试

  17. 输了三号线:
  18. 输了不存在的站点

个人总结

这个项目采用java来完成,利用了dijkstra算法。并在原有的基础上进行了修改,在一边计算路径的情况下,一边判断是否换乘了,计算路径的换乘次数,然后选择路径短,换乘次数少的路径。
我写的代码没采用很复杂的方式,也是因为个人能力的不足,也深知还有很多更好的存储的方式,更方便,适宜的算法,但这次项目也进一步锻炼了我前期思考,准备,中期写代码,后期总结的能力。
这次数据的储存我主要采用了数组和map,通过数组来存储某条线路的站点,来存储某个站点可换乘的线路。通过map来存储站点的id号。

原文地址:https://www.cnblogs.com/luolingjie/p/11666316.html

时间: 2024-11-03 20:57:02

北京地铁最短路径实现的相关文章

最短路径(图论-北京地铁线路查询)

目录 1 int main(){ 2 3 printf("北京地铁乘坐线路查询系统\n"); 4 /*---------------------------------------------------*/ 5 6 /*---------------------------------------------------*/ 7 freopen("bgstations.txt","r",stdin); 8 int LINE; /*地铁总线数*/

用Python计算北京地铁的两站间最短换乘路线

用Python计算北京地铁的两站间最短换乘路线 地铁数据 地铁数据用字典表示: {station:{neighbor1:line number,neighbor2:line number,-},station2:{-},-} 现在我们有地铁的站名,下面就是如何将地铁站名转化为上面所需要的标准字典格式. 从网上找到的地铁站名为字符串: line1=u'''苹果园 古城路 八角游乐园 八宝山 玉泉路 五棵松 万寿路 公主坟 军事博物馆 木樨地 南礼士路 复兴门 西单 天安门西 天安门东 王府井 东单

北京地铁乘坐线路查询

[问题描述] 编写一个程序实现北京地铁最短乘坐(站)线路查询,输入为起始站名和目的站名,输出为从起始站到目的站的最短乘坐站换乘线路.注:1. 要求采用Dijkstra算法实现:2)如果两站间存在多条最短路径,找出其中的一条就行. [输入形式] 文件bgstations.txt为数据文件(可从课程网站中课程信息处下载),包含了北京地铁的线路及车站信息.其格式如下: <地铁线路总条数> <线路1> <线路1站数> <站名1> <换乘状态> <站

地铁最短路径代码分析

地铁最短路径代码分析 相关链接: https://github.com/jindsad/subwayDijkstra 实验要求说明: 根据实验要求,要实现5块部分. 1.导入txt中储存的地铁线路. 2.通过地铁线路生成地铁图,并记录每条线路的站点. 3.通过Dijkstra算法算出最短路径,储存在列表中. 4.遍历路径列表,记录线路转变,存入字符串. 5.将最短路径字符串导出txt. 模块分析: 保存站点和线路的类 站点类名Vertex包含属性有名字,相邻节点,所属线路,距离起始点最短路径,在

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

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

北京地铁出行规划

一.Github代码链接     repo 二.程序基本功能描述 1.获得北京地铁单条线路所有站点信息 java SubwayStart -a 线路名称 -map 地铁线路文件.txt-o 输出文件.txt 或者 java SubwayStart -a 线路名称(直接显示) -map 地铁线路文件.txt 2.获得两个站点间最短线路 java SubwayStart -b 起始站点 目的站点 -map 地铁线路文件.txt -o 输出文件.txt 或者 java SubwayStart -b 起

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

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

北京地铁规划项目总结

一.项目介绍 实现一个帮助进行地铁出行路线规划的命令行程序. github链接:https://github.com/blakeyoungc/subway 主要需求:1.地铁线路图信息的导入     2.查询指定地铁线经过的站点 3.计算从出发到目的站点之间的最短(经过的站点数最少)路线,并输出经过的站点的个数和路径(包括出发与目的站点). 采用https://map.bjsubway.com/上的北京地铁线路图:  二.需求实现 主要模块介绍: 序号 模块名 功能 对应java类 1 主模块(

北京地铁项目

北京地铁项目 github:https://github.com/leo-xlz/Subway-beijing 模块分析----- zucc.edu.cn.model 存放站点信息和路径信息 station.java private String name;//站点名字 private String line;//所属路线 private List<Station> linkStations = new ArrayList<>();//相邻连接站点 routine.java · p