目录
零、分工
控制台:张玉伟
GUI: 徐志涛
一、GitHub地址
github地址:https://github.com/ZhangWuren/SE-Team-Project
二、PSP表格
PSP | 过程 | 预估耗时 (分钟) |
实际耗时 (分钟) |
Planning | 计划 | 10 | |
·Esitimate | ·估计耗时 | 10 | 15 |
Development | 开发 | 1020 | |
·Analysis | ·需求分析 | 30 | 120 |
·Design Spec | ·生成设计文档 | 120 |
200 |
·Design Review | ·设计复审 | 30 | 20 |
·Coding Standard | ·代码规范 | 30 | 60 |
·Design | ·具体设计 | 150 | 120 |
·Coding | ·编码 | 300 | 2400 |
·Code Review | ·代码复审 | 60 | 30 |
·Test | ·测试 | 300 | 100 |
Reporting | 报告 | 130 | |
·Test Repor | ·测试报告 | 60 | 30 |
·Size Measurement | ·计算工作量 | 10 | 30 |
·Postmortem & Process Improvement Plan |
·总结,改进计划 | 60 | 30 |
总计 | 1160 | 3155 |
三、控制台程序解题思路
1. 建模思路和文本信息
在本项目中,建模的对象是北京地铁图,在建模的过程中,建立了两个类,分别为类Station和类Map。类Map包含了类Station,具体的类图在项目完成后展示。
在文本数据beijing-subway.txt中,记录了地铁站及其对应的线路,举例如下
1 苹果园
1 古城
1 八角游乐园
1 八宝山
1 玉泉路
1 五棵松
1 万寿路
1 公主坟-10
1 军事博物馆-9
1 木樨地
1 南礼士路
1 复兴门-2
1 西单-4
1 天安门西
1 天安门东
首列为当前线路,接着是对应的站名,-表示当前车站为换乘车站,跟着的是换乘线路,多个换乘线路用“,”隔开
经统计,北京市地铁最新的不重复地铁站数量为330。
2. Dijkstra算法——/b功能
在/b功能的实现过程中,将问题抽象出来,就是一个无向图最短路问题,整个地铁图为无向图,寻找两点之间站点最少的路线。很容易想到的就是曾经学过的Dijkstra算法。在Dijkstra算法中,重要的是设置邻接矩阵。
3. /c功能实现
/c功能是输出整条线路,只需要简单的输出同一条线路上的地铁站即可。
4. /a功能实现
/a功能是从选定站点出发,遍历全部的站点。在思考全遍历功能时,想起了之前相似的问题有tsp问题,哈密顿回路,欧拉回路等。其中tsp问题要求每个节点只能访问一次,和哈密顿回路类似。欧拉回路则是要求每个边都访问一次。这里的全遍历功能和它们都不太一样,本题强调要遍历所有站点,对于边并不做要求,只要点遍历到了,有的边甚至是可以忽略的,同时每个点的访问次数也可以是多次的。
经过在网络上搜索相关资料,决定采用贪心策略+dijkstra算法,从给定起点start开始,随机选取一个没有路过的节点作为end,用之前/b功能的dijkstra算法找到这两个点之间的最短路。接着将end作为新的start,再选取没有经历的节点最后end,直到所有点都遍历结束,最后再返回给定的初始start。在这个过程中,dijkstra算法的结果是局部最优解,运用贪心的策略,可以判定整个遍历的过程也可取到最优的解。
5. 换乘优化
题目中要求,换乘时因为各种原因,相当于坐了三个站。一开始我陷入了难题,因为每个站点都是独立的,譬如“公主坟”这个换乘站,公主坟既在1号线,又在10号线,在不考虑换乘为3站的情况下,它和“万寿路”军事博物馆“”莲花台“西钓鱼台”这四个站点的邻接矩阵权值都是1,但是考虑换乘优化时,权值要根据上一站点变化,陷入了僵局。
(所说权值均表示邻接矩阵权值)后来经过很长时间的思考,就是设置多个同名的换乘站表示不同地铁线上的同一个换成站,同名换乘站之间权值为0,同线路前后站权值为1,不同线路前后站权值为3。用“公主坟”举例,即创建一个1号线上的公主坟,一个10号线上的公主坟,1号线上的公主坟和“万寿路”军事博物馆“权值为1,和”莲花台“西钓鱼台”权值为3表示换乘,和10号线上的公主坟权值为0,因为同个站点本质上是在一起的,能够成功的解决换乘优化问题。
6./z测试功能实现
/z功能也比较简