结对编程(地铁线路最短路径)

一、需求分析
实现一个帮助进行地铁出行路线规划的命令行程序。
1、任务
需求1:
实现一个支持显示地铁线路与计算换乘的程序。之后,用户可以通过命令行启动这个程序。程序在启动时,会读取不同命令对应的命令行参数。对于地铁线路信息图,我们约定它采用参数 -map 作为标志。程序启动时需要通过读取 -map 参数来获得对应的自定义地铁文件(命名为 subway.txt),从而得到地铁线路图的信息。

需求2:
实现基础的查询操作。比如说,用户希望查询指定地铁线经过的站点。这样,在应用程序需要支持一个新的命令行参数 -a,它指定了用户希望查询的地铁线路。这样,在给定地铁线路时,你的程序就需要能够从线路的起始站点开始,依次输出该地铁线经过的所有站点,直到终点站。输出的文件我们使用 -o 命令行参数来指定。

需求3:
实现一个计算任意两个站点间最短路径(经过的站点数最少)的程序,并输出经过的站点的个数和路径(包括出发站,目的站与换乘线路)。如果用户希望坐地铁,他希望能通过最少的站数从出发点到达目的地,这样就可以在命令行中以 -b 参数加两个地铁站点名称分别作为出发与目的,比如用户希望知道 洪湖里 到复兴路 之间的最短路线是怎样的,他就可以使用如下命令让程序将结果写入 routine.txt 中:subway.exe -b 洪湖里 复兴路 -map subway.txt -o routine.txt。

2、PSP表格

二、计算模块接口的设计与实现
采用BFS算法求两个站之间的最短路径,定义两个实体类:
站点信息Station类:

地铁线路Line类:

关键类Solve类:
public void getSubwayMessage();读入地铁信息subway.txt中的每条地铁信息。
public void getStationByLine(String linename):传入参数是一个地铁线名,获得整个地铁线的地铁站。
private void BFS(String st, String ed):传入参数 开始的地铁站,结束的地铁站。BFS算法,广度优先搜索。
public List calPassStations(String st, String ed):传入参数 开始的地铁站,结束的地铁站。这个是在BFS后的改进,在加入备忘录后,通过最后一个站回退到初始站,因此能找出这个最短路径,用列表List返回。
public void getChangeInfo(List list):传入参数 最短路径的列表 加入最短路径的中所有Station,计算出当前Station的所属线,即Station.line。
public void output(List list)传入参数 最短路径的列表 这时候所有的站都被我们计算过所属站,功能主要是计算换乘信息存入routine.txt。

三、计算模块部分单元测试展示。
主要对关键类solve中的每个函数进行测试:

测试读取出整个天津地铁的线路和总站点信息

测试根据地铁线路名将本条线路地铁读入station.txt文件中

测试工具类中定义的计算出换乘站点所属的线路

测试最短路径中的换乘站点属于哪条线路

测试获得获得某条输入路线的信息并存储

四、效果展示
1、程序启动时,通过-map读取subway.txt文件中的地铁信息

2、通过-info 几号线,将几号线的信息存入station.txt中

3、通过-way 起始站 终点站,打印出路径的信息,存入routine.txt中

五、总结
总结:本次实验,由于自己水平有限,所以通过查询相关资料,在队友的带领下,一步步完成。对于本次地铁路线规划中核心算法BFS有了深入了解,同时熟悉了java编程,从算法的研究到达了应用的开发,项目中仍然存在许多的不足,如两个站点之间存在多条路径的话,用BFS算法可能就难以实现,需要用到以BFS算法思想的Dijkstra算法,这些都需要后面学习,不断改进。总之,这次结对编程使我收获很多,对我完成后面的团体项目有很大的帮助。

github地址:https://github.com/xiaofancheng/subway

猜你喜欢

转载自www.cnblogs.com/cxfff/p/11802709.html