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号线拆分后,拆分后 ...
最新文章
- windows api打开文件对话框
- bugku ctf 杂项 啊哒 writeup || foremost的安装
- 2021-10-7 !二叉树的层序遍历
- Mybatis 实现SQL拦截并在控制台打印SQL和参数
- ASP.NET Core 优雅的在开发环境保存机密(User Secrets)
- ibatis的简介与初步搭建应用
- 蚂蚁金服OceanBase性价比是传统数据库的十倍
- CSS3 矢量图标及背景精灵
- webassembly_提升WebAssembly的安全性
- 【剑指offer】旋转数组的最小数字
- oracle dataguard 日志 很多no,Oracle DataGuard主庫丟失歸檔日志后備庫的RMAN增量恢復一例...
- win10无法连接到这个网络_win10以太网已连接无法上网怎么办?
- 算法应该怎么“玩”?
- python基于vue协同过滤算法的图书推荐系统
- ASO 相似测试
- 数据分析实战----北京租房数据统计分析
- android 照相机app,Spectre相机
- html制作象棋教程入门教程,photoshop图层样式制作象棋棋子教程
- component传值问题
- 微信后台架构浅析--读写扩散技术
热门文章
- TX2 配置xbox360无线手柄
- 树莓派中文环境的配置
- web3对象提供了所有方法。
- Lumion 9.0 建筑日景快速渲染实例教程
- 微信开放平台申请网站应用
- HearthBuddy卡组
- MyScript 手写识别数学公式、图形 自动计算
- RuntimeError: The size of tensor a (22) must match the size of tensor b (32) at non-singleton dimens
- HTML期末学生大作业 响应式动漫网页作业 html+css+javascript (1)
- 服务器DNS域名解析