地铁线路最短路径(需求分析)

文章目录

北京地铁图

项目需求

  1. 实现一个帮助用户出行时进行地铁路线规划推荐的程序
  2. 支持向用户推荐任意两站之间通过最少站数的路线
  3. 支持查询单条线路的所有站点
  4. 实现可视化界面,用网页的方式(在有能力之余)

实现语言

系统整体的算法核心主要使用Java语言来实现,可通过命令行进行数据交互。通过指定的地图数据和相关查询指令,可以实现所有的需求。

实现算法

通过对该项目的分析,我们不难发现这是最经典的求最短路径问题。所谓最短路径问题是指:如果从图中某一顶点到达另一顶点的路径可能不止一条,如何找到一条路径使得沿此路径上各边的权值总和达到最小。在本问题中,我们是要完成从地铁图中找到一条路径使得从某一起始站到达另一终点站的路径长度最小,也就是经过的站点最少。我们这里假设相邻两站之间的权重相同。那么我们解决这类问题最常用的算法有DFS/BFS算法、Floyd算法、Dijksta算法。针对该问题,我对这几类算法进行了分析:

  • DFS/BFS算法:适合解决解决单源最短路径,从起始结点开始访问所有的深度遍历路径或广度优先路径,则到达终点结点的路径有多条,取其中路径权值最短的一条则为最短路径。DFS比较适合判断图中是否有环,寻找两个节点之间的路径,有向无环图(DAG)的拓扑排序,寻找所有强连通片(SCC),无向图中寻找割点和桥等;而BFS则比较适合判断二分图,以及用于实现寻找最小生成树(MST),如在BFS基础上的Kruskal算法。还有寻找最短路径问题(如Dijkstra算法)。
  • Floyd算法:Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法。而我们这里每站之间的权值是一样的,显然我们可以选择用更简单的算法,所以不考虑使用该算法。
  • Dijksta算法:Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

通过上述分析,再加之地铁地图属于稀疏图,而且该图中每条边的权值恒定,所以我决定用最为简单也较为适合该项目的BFS算法来实现。

存储设计

在数据存储上,主要是存点或者存边两种形式。由于不同的铁路路线存在着相同的站点,即为换乘站点,如果采用存点的形式,则数据会有冗余,而且还要提前判断是那条铁路路线;如果采用存边的形式,由于边是唯一的,而换乘站点可以用两条铁路线的站点名相同来判断,同一条边不会存在两条不同的路线上,是数据不会有冗余,并且数据也不需要有序。因此我在该项目的实现中,选择的存边的形式。每个模块由一个#开始,紧跟着的是这条路线的名称。接下来包含若干条该路线的边的信息,用起点站名 终点站名来表示。每条边的起点站可以由建图后的入度为0来判断。

样例如下:

# 1号线
苹果园 古城
古城 八角游乐园
八宝山 玉泉路
...(省略)
# 2号线
西直门 积水潭
积水潭 鼓楼大街
鼓楼大街 安定门
...(省略)

文件存放

地铁线路信息保存在data.txt中,格式如下:

线路名1 站名1 站名2 站名3 ...
线路名2 站名1 站名2 站名3 ...
线路名3 站名1 站名2 站名3 ...

查询单条线路的所有站点(从起始站点开始到终点站)的结果保存在station.txt文件中,格式如下:

1号线:
苹果园-->古城-->八角游乐园-->...-->四惠东

给出起点和终点,保存最短路径到routine.txt文件中,格式如下:

从xxx到xxx共经过n站
站点1-->站点2-->...-->站点n

项目计划表

PSP 2.1 Personal Software Process Stages Time
Planning 计划
· Estimate · 估计这个任务需要多少时间 10m
Development 开发
· Analysis · 需求分析 (包括学习新技术) 3h
· Design Spec · 生成设计文档 1h
· Design Review · 设计复审 (和同事审核设计文档) 30m
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 30m
· Design · 具体设计 2h
· Coding · 具体编码 5h
· Code Review · 代码复审 1h
· Test · 测试(自我测试,修改代码,提交修改) 1.5h
Reporting 报告
· Test Report · 测试报告 1h
· Size Measurement · 计算工作量 30m
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 20m
合计 16.5h
posted @ 2020-10-20 22:35  YuQicode  阅读(613)  评论(1编辑  收藏  举报