首页 > 技术文章 > 个人项目-地铁出行路线规划

bunnywwwwyj 2019-09-22 01:21 原文

这是一个“实现一个帮助进行地铁出行路线规划的命令行程序”的个人作业。

以下将分为三个板块:对于该项目的基本理解、设计思路以及项目psp计划。

基本理解

问题定义

为了实现地铁出行路线的规划,需要设计一个能够计算地铁线路最短路径的程序。

下面以北京城市轨道交通线网图为例来设计:
avatar

需求分析

  • 需求1

    • 得到地铁线路图的信息

      需要实现一个支持显示地铁线路与计算换乘的程序(编译后的二进制文件名为 subway.exe )。

      可以通过命令行启动该程序,启动时需要通过读取-map参数来获得对应的自定义地铁文件( subway.txt ),从而得到地铁线路图的信息。

      一个调用应用程序的示例如下:

      subway.exe -map subway.txt
      
  • 需求2

    • 查询指定地铁线经过的站点

      在应用程序上,需要支持一个新的命令行参数-a,指定用户希望查询的地铁线路。

      在给定地铁线路时,程序需要从线路的起始站点开始,依次输出该地铁线经过的所有站点,直到终点站。输出的文件使用-o参数来指定。

      一个调用应用程序的示例如下:

      subway.exe -a 1号线 -map subway.txt -o station.txt
      
  • 需求3

    • 计算从出发到目的站点之间的最短路线并输出经过的站点的个数和路径

      在命令行中以-b参数加两个地铁站点名称分别作为出发站与目的站,让程序将结果写入 routine.txt 中。

      程序将计算从出发到目的站点之间的最短(经过的站点数最少)路线,并输出经过的站点的个数和路径(包括出发与目的站点)。如果需要换乘,会在换乘站的下一行输出换乘的线路。输出的文件使用-o参数来指定。

      一个调用应用程序的示例如下:

      subway.exe -b 中关村 西土城 -map subway.txt -o routine.txt
      

设计思路

因为在数据结构的学习过程中用到比较多的是C++,所以这里采用C++来实现。

线路概览

每条线路的起点:

地铁线路名 起始站点
1号线 苹果园
2号线 西直门
4号线 安和桥北
5号线 宋家庄
6号线 金安桥
7号线 北京西站
8号线 朱辛庄
9号线 郭公庄
10号线 巴沟
13号线 西直门
14号线 张郭庄
15号线 俸伯
16号线 西苑
八通线 四惠
昌平线 昌平西山口
亦庄线 宋家庄
房山线 郭公庄
首都机场线 东直门
大兴线 公益西桥
S1线 石厂

每条线路的详细站点信息:

avatar
avatar
avatar
avatar

设计要点

为了实现这个程序,需要考虑以下几个要点:

  • 要点1 —— subway.txt 的存储格式

    1号线: 苹果园 古城 八角游乐园 ...
    2号线: 西直门#4#13 积水潭 鼓楼大街#8 ...
    ...
    S1号线: 石厂 小园 栗园庄 ...
    

    线路名后用“:”与其后站点间隔。

    站点间用“ ”间隔。

    若某站为换乘站,在其后用“#数字”的方式,表示在当前线路上的该站点可换乘到“#”后数字序号所指的线路上,如2号线的西直门可以换乘到4号线以及13号线。

  • 要点2 —— routine.txt 的输出格式

    假设某乘客想要从中关村到西土城,那么输入如下:

    subway.exe -b 中关村 西土城 -map subway.txt -o routine.txt
    

    得到的输出如下:

    5 
    中关村 
    海淀黄庄 
    10号线 
    知春里 
    知春路 
    西土城
    

    5表示从出发到目的站点之间的最短路线为5站。

    接下来输出所经过的所有站点(包括出发与目的站点)。

    海淀黄庄为4号线与10号线的换乘站,因此在它的下一行输出需要换乘的线路。

  • 要点3 —— 异常情况

    1. 文件读取时格式解析错误导致数据乱码
    2. 文件不存在导致文件数据无法读取
    3. 命令格式输入错误
    4. 站点名称输入错误
    5. 已存在 routine.txt
  • 要点4 —— 注意点

    1. 文件的格式规范
    2. 文件存取时的判断
    3. 输入格式需符合要求
    4. 上一次得到的结果 routine.txt 在下一次运行前需清空,以免干扰下一次的结果
  • 要点5 —— 测试点

    1. 同一条线路上的出发和目的站点
    2. 不同线路上的出发和目的站点(换乘1次、2次甚至多次)
    3. 输入错误的出发或目的站点(有报错提示)
    4. 双线并行线路
    5. 超长线路

程序思路

通过命令行运行时带入的参数执行相应的操作,若参数不正确给出提示并且不执行程序。

通过无向图保存地铁线路中的各个站点,并用Dijkstra算法得到起始和目的站点之间的最短路径。若存在等长的路径,则选择换乘较少的路径,若换乘数相等则都可以选择。

项目psp计划

PSP Personal Software Process Stages Time
Planning 计划
· Estimate · 估计这个任务需要多少时间 2h
Development 开发
· Analysis · 需求分析(包括学习新技术) 4h
· Design Spec · 生成设计文档 2h
· Design Review · 设计复审(和同事审核设计文档) 1h
· Coding Standard · 代码规范(为目前的开发制定合适的规范) 1h
· Design · 具体设计 2h
· Coding · 具体编码 6h
· Code Revieq · 代码复审 1h
· Test · 测试(自我测试,修改代码,提交修改) 3h
Reporting 报告
· Test Report · 测试报告 2h
· Size Measurement · 计算工作量 1h
· Postmortem & Process Improvement Plan · 事后总结,并提出过程改进计划 1h
合计 26h

最后

个人觉得北京城市轨道交通线路还是挺复杂的,比如地铁1号线和地铁八通线其实并不互通(原本以为是同一条线路),但是有换乘站;地铁4号线和地铁大兴线似乎是一条线;地铁1号线和地铁6号线都有苹果园站,但是该站不是换乘站,这样的话两条铁路之间的换乘好像不是很方便;对于有些站点来说,多次换乘路线相较于直达路线更近,但是现实生活中,对于大部分人来讲,换乘是一件很麻烦的事情,可能更愿意接受直达... 总之,感觉北京地铁出行线路的规划是一个挺庞大的工程。

推荐阅读