php实现最短路径,北京地铁最短路径实现(示例代码)
北京地铁最短路径规划
github地址 github
需求理解
将地铁线路保存成一个可读入,简洁明了的文本
程序能正确读入这个文件,并获取地铁线路信息
程序能正确处理输入的命令行
地铁能正确输出指定地铁线经过的站点
程序能正确输出两个站点间的最短路径
程序要有健壮性,能通过各类性能测试
按要求编写博客,详细说明花费时间,代码,各个模块和测试用例
文本存储方式
该文本直接保存进了各条线路的各个站点,没有在文本中考虑换乘点。当读入“一号线”等文字时,将它转换为线路的id号,然后在way数组中作为下标,将后面的各个站点的id号存储进去。换乘情况的话,因为每新读入一个站点,都会给它赋一个id号,所以只要每次判断该站点是否有id号了,如已存在,该站点就是换乘点,保存换乘信息。例如上图中一号线的西单,在四号线中也存在,所以该站点就可以换乘一号线或四号线。
实际所需时间
模块结构
共一个类:Subway
Subway类共有六个函数:
public static void searchWay(String name, String args):该函数的目标是用来满足需求二,保存所查询线路的各个站点。name就是通过命令行输入的线路的名称,args就是保存信息的文件名称。
该函数先通过if语句判断来得到线路的id号,然后在way数组下得到各个站点的id号,然后根据id号调用getKey()函数得到站点名称,保存进文件中。
public static int findMinDist(int[] dist,int[] collected):该函数的作用是在未被收录的顶站中寻找dist最小的一个站点。
public static void dijkstra(String station1,String station2, String baocun):该函数的算法是采用了dijkstra算法,该算法是先利用上面的findMinDist函数找到距离起点最小的点,然后更新其他点到起点的距离。在更新的过程中,判断了某个站点是否是换乘点,如果是的话,就更新这条路的换乘次数,最后当路径长度一致时,根据换乘次数来选择是哪一条路径,当换乘次数也一致时,就两条路径都输出。判断某个站点是否是换乘点的方法是通过一个二重循环,一个一重循环;先通过二重循环找到当前站点和前一个站点在共同的哪一个线路上,再判断当前站点的前前站点是否在这条线路上,若不在,则说明前一个站点是换乘点,保存信息。
public static String getKey(int value):该函数的作用就是通过id号来得到站点的名称;
public static void main(String[] args) throws FileNotFoundException:main函数就是处理各种参数,建好map这个表,为每个站点赋好id,为每条线路赋好id号,设置好相邻站点间的距离为1,保存好每条线路上的各个站点。
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号进行比较,如果该站点是换乘点,就在下一站输出前,输出需要换乘到几号线。
性能改进
因为dijkstra算法是将起点到其他每个站点间的最短路径都求出来了,所以会加大运行时间和保存空间,所以在写代码的时候,当有一次点到了我们的终点时,就break。这样只会运行和保存起点到终点的路径,其他站点不需要考虑。
因为存在路径长度相同,换乘次数一样的情况,所以两条路径都需要输出,让乘客自主选择,所以会运行保存到文件的代码多次,所以我写了一个函数shuchu,这样只要多次调用一个函数,而不用多次书写同一份代码了。还有根据id号得到名称,也需要多次写同一份代码,所以变成一个函数,多次调用即可。
测试用例
需求一
需求二
需求三
正确性测试
十三陵景区 北邵洼(无换乘)
十三陵景区 育知路(换乘一次)
积水潭 平安里(路径长度一致,换乘次数一样,两条线路一起输出,并且二号线循环)
积水潭 苏州街(两次换乘)
莲花桥 北京西站(路径长度一致,但换乘次数少)
中国美术馆 天安门西(路径长度一致,换乘次数一样,三次,两条线路一起输出)
石厂 二号航站楼(超长线路)
国贸 高碑店(一号线和八通线)
鲁棒性测试
输了三号线:
输了不存在的站点
个人总结
这个项目采用java来完成,利用了dijkstra算法。并在原有的基础上进行了修改,在一边计算路径的情况下,一边判断是否换乘了,计算路径的换乘次数,然后选择路径短,换乘次数少的路径。
我写的代码没采用很复杂的方式,也是因为个人能力的不足,也深知还有很多更好的存储的方式,更方便,适宜的算法,但这次项目也进一步锻炼了我前期思考,准备,中期写代码,后期总结的能力。
这次数据的储存我主要采用了数组和map,通过数组来存储某条线路的站点,来存储某个站点可换乘的线路。通过map来存储站点的id号。
php实现最短路径,北京地铁最短路径实现(示例代码)相关推荐
- java地铁最短,地铁最短路径
个人项目--地铁最短路径 项目介绍 主要功能 提供一副地铁线路图,计算指定两站之间最短(最少经过站数)乘车路线:输出指定地铁线路的所有站点.以北京地铁为例,地铁线路信息保存在data.txt中,格式如 ...
- 图的最短路径java_地铁线路最短路径(JAVA实现)
项目综述 提供一副地铁线路图,计算指定两站之间最短(最少经过站数)乘车路线:输出指定地铁线路的所有站点.以北京地铁为例,地铁线路信息保存在data.txt中,格式如下: 地铁线路总数 线路名1 站名1 ...
- python写算法求最短路径,Python实现迪杰斯特拉算法并生成最短路径的示例代码
def Dijkstra(network,s,d):#迪杰斯特拉算法算s-d的最短路径,并返回该路径和代价 print("Start Dijstra Path--") path=[ ...
- java实现北京地铁换乘
文章目录 项目GitHub地址 文件存放 station.txt 设计思路与模块分析 Station.java DataBuilder.java StationIncludeLineName.java ...
- 爬虫实例之爬取北京地铁站点
目标网站:https://www.bjsubway.com/station/zjgls/# 使用模块:re.os.requests.BeautifulSoup 老样子,直接步入正题. 先看下结果: 北 ...
- 3天初版部署7天快速迭代!百度飞桨携手北京地铁落地AI口罩检测方案
允中 发自 凹非寺 量子位 报道 | 公众号 QbitAI 百度AI抗疫,又有新方案部署落地.这次,事关企业复工后,持续升级的公共交通防疫战. 近日,针对北京地铁防疫需求,百度与北京地铁合作开展了A ...
- 涨姿势!北京地铁原来是16条旅游专线
学姐按:周末想带孩子玩,又没太多时间.好不容易有时间出去了,结果半天都被堵在了路上,这让很多家长每逢周末必发愁.为什么不换种方式出行呢?北京的地铁的里程越来越长,殊不知所经之处有很多的大小景点可以玩. ...
- 北京地铁线路图纯算法附带求极权值(原创) 性能提升版
先上一张大家都看过而且熟悉的北京地铁线路图: 其中本人由于时间时间问题所以就写入了:昌平线,1,2,4,5,6,8,10,13共9条线路图: 接下来我说说我的思路 我的思路是这样的: 首先定义变量b, ...
- WPF简易北京地铁效果图
这个是百度地图上北京地铁的地址http://map.baidu.com/?subwayShareId=beijing,131,我们先看下百度上面的效果图 我要实现的内容比较简单,就是绘制这些图,和在地 ...
- oracle多条数据合并成一条_建议将北京地铁13-B线和28号线合并成一条线
由于之前北京地铁规划的28号线是一条核心区市区短线,长度仅为9公里.而地铁作为轨道交通应该是优先承担长距离乘客运输任务,可以说不到万不得已,最好不要规划这样的过短线路.又因为地铁13号线拆分后,拆分后 ...
最新文章
- OpenGL选择机制的一点讨论
- 识别哈希算法类型hash-identifier
- 【NOI2015】软件包管理器
- JDK1.6官方下载
- 数据结构开发(7):典型问题分析(Bugfix)
- mysql-电商库演练2-拆表-修改字段-添加外键
- vscode 智能提示失效
- vim中设置tab的长度的方法
- LibFewShot:小样本学习与细粒度分类(一) -- 环境部署、相关论文研究
- express 4.x 获取post提交的数据
- 关键词组合工具-自动关键词挖掘组成关键词软件免费
- 阈值分割之大津法OTSU
- apk android 应用qq表情,一句代码让你的安卓APP支持emoji表情
- 联想m7216更换墨粉流程图_联想M7216打印机加墨粉后还显示墨粉用完是为什么?...
- 中如何输入越南拼音_幼小衔接中,我们如何给孩子做拼音启蒙?
- 教你如何在Mac上打开CAJ格式的文件
- Canvas 画直线
- 0xc0000225无法进系统_Win10无法开机0xc0000225错误代码解决方法
- Java中一种容易被忽视的访问权限问题
- nodejs+vue+elementui宾馆酒店客房信息管理系统-express
热门文章
- C++ Qt实现WPS、浏览器tab页面
- 一行代码查看电脑Wifi密码
- 安装watchdog监控系统
- c语言学籍信息系统,c语言学籍信息管理系统设计
- 一:【博客分享】优秀的有趣的博客
- 微信公众号订阅号与微信服务号有什么不同
- 中望cad自定义快捷键命令_1分钟成为CAD设计高手:中望CAD命令快捷键设置详解-快捷键设置...
- android蓝牙健康 iee,Wi-Fi RTT(IEEE 802.11mc)
- 软件或者网站的版权声明中的两个时间是什么意思?该如何正确书写?
- 深度解读德勤RPA2020年市场调研报告