结对项目——地铁

  • 结对项目——数独
    • 1. Github项目地址
    • 2. 成果展示
    • 3. 团队成员
    • 4. PSP耗时
    • 5. 项目功能要求及算法描述
      • 5.1 项目需求分析
      • 5.2 功能实现
        • 5.2.1 线路站点查询
        • 5.2.2 两点之间的最有效线路
        • 5.2.3 站点全遍历
        • 5.2.4 特殊处理
      • 5.3 站点全遍历算法详解
    • 6. 设计实现过程
      • 6.1 函数关系图
      • 6.2 类关系图
      • 6.3 程序流程图
      • 6.4 单元测试设计
      • 6.5 代码质量分析
    • 7. 性能分析及改进
      • 7.1 性能分析
    • 8. 测试
      • 8.1 单元测试
      • 8.2 黑盒测试
      • 8.3 全遍历结果测试 /z
    • 9. 前后端合并
    • 10. UI界面
      • 10.1 界面预览
      • 10.2 线路信息查询
      • 10.3 最短路查询
      • 10.4 全遍历
    • 11. 数据存储
      • 11.1 文本文件
      • 11.2 XML格式
      • 11.3 数据库
      • 11.4 自定义二进制格式
    • 12. 扩展功能
      • 12.1 处理多地图
      • 12.2 程序移植
    • 13. 总结
      • 13.1 收获
      • 13.2 不足

结对项目——数独

1. Github项目地址

Github: QuickSubway
包括地铁功能实现、DLL封装、UI界面及文档部分
如果觉得对你有帮助的话请帮我打个星星呀

2. 成果展示

站点全遍历效果如下:

3. 团队成员

  • XCyclone :前端界面设计

  • FSMM :后端功能开发

4. PSP耗时

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 60 30
· Estimate · 估计这个任务需要多少时间 60 30
Development 开发 2810 2570
· Analysis · 需求分析(包括学习新技术) 120 120
· Design Spec · 生成设计文档 120 100
· Design Review · 设计复审(和同事审核设计文档) 60 60
· Coding Standard · 代码规范(为目前的开发指定合适的规范) 30 30
· Design · 具体设计 120 120
· Coding · 具体编码 2000 1500
· Code Review · 代码复审 60 40
· Test · 测试(自我测试,修改代码,提交修改) 300 600
Reporting 报告 210 240
· Test Report · 测试报告 60 60
· Size Measurement · 计算工作量 30 30
· Postmortem & Process Improvement Plan · 事后总结,并提出过程改进计划 120 150
合计 3080 2840

5. 项目功能要求及算法描述

5.1 项目需求分析

项目要求:实现一个地铁命令行程序(以最新北京地铁为例),能够完成

  1. 根据地铁线路,查询该线的所有站名,按序输出。

  2. 找到给定起点到终点的最有效线路。

  3. 给定起点,遍历地铁的所有车站。

  4. 换乘时增加额外消耗,在次条件下遍历。

  5. 根据站点的坐标信息,实现图形界面程序。

(详细需求分析报告文档见github)

5.2 功能实现

  本项目采用面向对象的设计方法,程序运行时读取地铁信息文件,初始化Subway类保存信息,由不同功能参数调用不同的方法实现,其中难点主要集中在站点全遍历问题上。

5.2.1 线路站点查询

  线路信息由数据文件输入并保存,输入线路后直接查询并按顺序输出相应站点即可。要注意判断线路的正确性。

5.2.2 两点之间的最有效线路

  因查找记录不同站点间距离实现难度较大,所以在本项目中,只将站点数目和换乘情况考虑进去,分别实现了查询两站之间的站点最少路径和考虑换乘因素后的最短路径。由于是单元最短路,所以采用了经典的最短路算法dijkstra实现,dijkstra的时间复杂度是O(n2)O(n^2)O(n2),经过堆优化到O(nlogn)O(nlogn)O(nlogn),北京地铁站点个数只有不到350个,完全可以接受,难点在于路径和换乘信息的记录。考虑换乘因素后只要判断换乘后在距离上加3即可。

5.2.3 站点全遍历

  站点全遍历要求尽可能快地遍历地铁的所有车站,并将路线输出,在此基础上增加换乘加3站的要求进行求解。该功能是本项目中的难点,属于NP问题,目前还没有一种精确的解法能够有效实现该功能,所以如何实现并尽可能优化是该项目的核心问题之一,在求解过程中,我们思考过不同方法,并逐步改进,最后优化为共经历550次站点完成全部遍历,相关算法接下来详细介绍。由于时间限制,我们没有继续研究下去,大家有什么想法可以在评论区留言,一起探讨。

5.2.4 特殊处理

  北京地铁线路为双向,所以本项目将地铁线路抽象为一张无向图,但需要注意机场线为单向线,需要特殊处理。

5.3 站点全遍历算法详解

  站点全遍历要求尽可能快地遍历地铁的所有车站。这个问题与经典问题旅行商和中国邮递员问题都不同,要求遍历所有车站而不是所有路线,并且容易理解不可能每个车站只经过一次(因为有许多单线,走到终点后必须原路返回)。
  这个问题属于NP问题,可用状压dp法求出精确解,但时间复杂度是O(2n)O(2^n)O(2n),对于300多个点显然不能实现。
  最后我们采用欧拉回路算法,通过对现有地铁图进行适当地增边和删边,使得地铁线路图变为一个欧拉图(即所有点的度数均为偶数),找到一条欧拉回路作为站点遍历路径。因为欧拉回路要求经过所有边一次且仅一次,且最后回到出发点,所以求解欧拉回路一定能实现对所有站点的全遍历。
  地铁线路图转换为欧拉图的方法如下:所有单支线路增加一条相同的边到分叉点,使其成为一个环,在剩下的所有度数为奇数的站点中进行相邻两两匹配,经过适当增删使其满足度数为偶数的条件。如图所示:

6. 设计实现过程

6.1 函数关系图

函数关系调用图如下:

6.2 类关系图

主类只有一个Subway,其他两个类为Line和Node,与主类是聚合关系。(类图由vs2017自动生成)

6.3 程序流程图

程序流程图如下:

6.4 单元测试设计

单元测试主要分为以下几个部分:

  1. 输入合法性检测

  2. 两点之间最短路径正确性

  3. 全遍历正确性

  4. 机场线特判

具体测试用例将在后面单元测试设计模块给出。

6.5 代码质量分析

  在代码完成后,使用vs2017自带的代码分析功能进行了质量分析,改正了一些可能出现问题的警告,全部都是类的部分成员变量和成员函数没有初始化造成的。虽然这些变量会在后续的程序运行过程中进行赋值,但初始化符合代码规范,规避了日后可能因此出现异常情况的风险。

7. 性能分析及改进

  利用vs2017自带的性能分析工具对本项目进行分析,找出代码中的性能瓶颈并改进,提高程序运行效率。

7.1 性能分析

性能分析结果如下图所示:

  由分析结果得知,程序中比较耗时的部分是度文件信息的读取部分。在本项目中为了方便处理,采用了按行的数据流读取方式,由于北京地铁图信息量较小,并不影响程序的整体性能,处理时间完全在接受范围内,所以没有对此做出改进。如果后续文件的信息量增多,可以采用二进制方式一次性读取文件,能极大地改善效率。

8. 测试

为了进行有效测试,我在这里又对之前完成的代码做了些许调整,但不影响整体算法和设计架构。

8.1 单元测试

  本项目一共设置了16组单元测试用例,分别对输入参数的合法性、特殊站点的处理,最短路径求解和全局遍历求解进行了测试。
测试结果如下,全部通过:

8.2 黑盒测试

功能测试结果如下:

  1. 线路信息查询

输入

房山线

输出

阎村东
苏庄
良乡南关
良乡大学城西
良乡大学城
良乡大学城北
广阳城
篱笆房
长阳
稻田
大葆台
郭公庄
  1. 最短路径查询(最少站点)

输入

QuickSubway.exe /b 霍营 安立路

输出

6
霍营
立水桥 换乘5号线
立水桥南
北苑路北
大屯路东 换乘15号线
安立路
  1. 最短路径查询(最少换乘)

输入

QuickSubway.exe /c 霍营 安立路

输出

11
霍营
育新
西小口
永泰庄
林萃桥
森林公园南门
奥林匹克公园 换乘15号线
安立路
  1. 机场线特判

输入

QuickSubway.exe /b 2号航站楼 3号航站楼

输出

3
2号航站楼
三元桥
3号航站楼

输入

QuickSubway.exe /b 3号航站楼 2号航站楼

输出

2
3号航站楼
2号航站楼

8.3 全遍历结果测试 /z

  按照项目要求,对全遍历的输出结果进行了测试。分别测试结果的正确性、是否有遗漏站点、遍历次序是否合理、起点和终点是否相同。由于测试文件较大,具体测试情况可下载代码运行查看。

9. 前后端合并

  本项目为团队合作项目,由我和另一位同学合作开发,我负责后端功能,队友负责前端UI设计。因对不同语言的熟练程度和不同开发工具的便利程度等因素影响,我们分别采用不同语言实现。前端用C#,后端用C++,最后通过将后端程序封装为DLL动态链接库,再由前端调用来完成项目合并。

10. UI界面

  本项目的UI界面基于C# winform开发,在实现过程中接口调用、多线程、屏幕分辨率及动态线路显示等问题均称为本项目的难点。由于界面部分是队友实现的,所以具体开发过程不多做介绍,可参考前文给出的队友博客。

10.1 界面预览

UI界面如下:

10.2 线路信息查询

6号线:

10.3 最短路查询

圆明园->长春桥:

10.4 全遍历

全遍历:

11. 数据存储

11.1 文本文件

  简单易用,容易测试和编辑,但读取慢,尺寸大。由于本项目较小,开发周期较短,为了操作简单考虑,采用了文本文件储存的方法。

11.2 XML格式

  内容和结构完全分离;作为纯文本格式互操作性强,可在不同的操作系统间通信;有标准语法格式,规范统一;支持多种编码;可扩展性较好。且XML格式的文件多用于网页信息储存,如果将程序移植到web端,可考虑采用此方法存储数据。

11.3 数据库

  技术成熟、应用广泛;数据管理能力强,安全程度高。当需要存储的信息内容较多时,如扩展为多地铁信息查询程序,则可以考虑使用数据库存储。

11.4 自定义二进制格式

  根据具体程序设计,尺寸小,读取速度快。

12. 扩展功能

  项目的基本功能完成后,我对扩展需求进行了思考,但由于时间所限,没有进一步实现。

12.1 处理多地图

  本项目的实现均为读入数据后动态处理,所以如果换其他城市的地铁地图,只需将其线路信息安装指定格式加载即可,较易实现。

12.2 程序移植

  本项目在开发过程中没有重点考虑程序的移植行,但因为在程序设计中采用了模块化的方法,所以可以使用之前实现功能的函数,进行封装后再调用。但由于之前没有经验,实际操作起来应该还会有很多难点,之后可以投入时间进一步实现移植。

13. 总结

13.1 收获

  在本项目的完成过程中,我学习到了很多新知识,进一步接触到软件项目开发的基本流程,也对软件需求分析、软件设计、代码编写、测试等几个模块有了深入的理解。

  1. 团队合作开发。本项目是团队合作项目,在项目的开发过程中,我深刻地认识到合作的重要性,和队友可以互相帮助,共同思考,一起为我们的项目努力,这个过程是比任何技能的学习都宝贵的。

  2. git多人合作的学习。本项目由github管理,学习到了如何在github上多人合作共同开发。

  3. 对面向对象程序设计的认识。本项目采用了面向对象的程序设计方法,模块化的设计方法使代码结构更加清晰。

  4. 编程能力的提升。由于本项目的开发时限较短,题目对于我们来说也有一定难度,最后能在短时间内顺利完成,我的编程能力得到了很大的提升。

13.2 不足

  由于时间限制,本项目只实现了要求的基本功能,没有进一步完成扩展功能,较为遗憾,后期可以进一步推进。

[软件工程基础]结队项目——地铁相关推荐

  1. [软件工程基础]结对项目——地铁

    目录 一.项目地址与成员博客 二.PSP表格 三.解题思路 3.1.项目需求分析 3.2.线路站点查询 3.3.最短路查询 3.4.全遍历查询 四.设计实现 4.1.程序流程图 4.2.后端实现部分 ...

  2. 软件工程基础结对项目——地铁

    一.GitHub的网址 首先还是先附上GitHub 项目地址:https://github.com/lytning98/subway 队友的博客地址:传送门 二.PSP表格和预估时间 PSP2.1 P ...

  3. 软件工程基础-个人项目-数独游戏

    软件工程基础-个人项目-数独游戏 ----------------------------------------------------------------------------------- ...

  4. 软件工程基础个人项目——数独(5)

    软件工程基础个人项目--数独 点击这里可看github上的具体代码 本次个人项目关于数独的生成与求解 PSP表格 PSP2.1 Personal Software Process Stages 预估耗 ...

  5. 软件工程基础——个人项目——数独(1)

    软件工程基础--个人项目--数独(1) 一.实现目标 1.生成数独终局 命令行输入如下: sudoku.exe -c 20 sudoku.exe为最终实现程序,-c确定活动为生成数独终局,20为生成结 ...

  6. 软件工程基础课-结对项目-地铁

    一.项目地址 二.PSP 三.解题思路 3.1 面向对象设计与分析 3.2 关键算法的实现 3.2.1 Dijkstra算法 3.2.2 鸡肋的全遍历 四.设计实现过程 4.1 代码风格规范 4.2 ...

  7. [软件工程基础]结对项目 数独程序扩展

    (1)在文章开头给出Github项目地址.(1') 项目地址:https://github.com/JerryYouxin/sudoku (2)在开始实现程序之前,在下述PSP表格记录下你估计将在程序 ...

  8. [软件工程基础]个人项目——数独

    目录 一.Github项目地址 二.PSP估计 三.解题思路描述 3.1. 生成终局 3.1.1.暴力搜索--回溯法 3.1.2.模板法 3.2.求解数独 3.2.1.暴力搜索--回溯法 3.2.2. ...

  9. 软件工程基础-个人项目-数独

    个人项目–数独 目录) 个人项目--数独 1 项目地址 2 PSP表格 3 思路描述 3.1 数独终局生成 3.1.1. 暴力法 3.1.2. 全排列及行变换 3.2 功能实现思路 3.2.1. 数独 ...

  10. 软件工程基础-结对项目-WordCount(单词计数)

    结对项目要求 Github项目地址 https://github.com/richardevan/wordcount PSP表格 PSP2.1 Personal Software Process St ...

最新文章

  1. vim编辑器异常退出产生备份文件
  2. 文本特征处理(n-garm表示方法、长度规范)
  3. 过去的一年,我在读研
  4. python 怎么读-Python怎么读
  5. buildroot mysql
  6. 【Linux】—— /usr/bin/perl 被 MySQL-community-server-8.0.26-1.el7.x86_64 需要,解决方法
  7. 整型和浮点型之间的转化
  8. mysql配置主从时报错及处理
  9. HDU 6342 Expression in Memories(模拟)多校题解
  10. 【视频】超级账本HyperLedger:Fabric源码走读(一):项目构建与代码结构
  11. AMOS分析技术:路径分析;用SPSS做路径分析麻烦?那就用AMOS分析吧
  12. 数据中台之数据集成平台的数据抽取
  13. 网页(HTML)转换为PDF
  14. java根据地址解析省市区信息
  15. vue 强制清除浏览器缓存
  16. python的list的基本操作、list循环、切片、字典基本操作、字典嵌套、字符串常用方法...
  17. d3.js d3.scale.ordinal() --详解 rangeBands
  18. Python基础:函数
  19. linux下刻录光盘读取不了_Linux下刻录光盘
  20. springboot+redis实现微博热搜排行榜

热门文章

  1. 在RFID标准协议中 ISO18000-6B和ISO18000-6C的优点及区别
  2. eda多功能数字钟课程设计_eda多功能数字钟设计_相关文章专题_写写帮文库
  3. 破解wifi时遇到rtl8187 - [phy1]SIOCSIFFLAGS: Name not unique on network
  4. Phase2 Day11 Set Map
  5. mikumikudance
  6. 双色球机器人博客博客,双色球预测程序算法
  7. .NET Framework高低版本兼容问题解决办法
  8. lockdir便携式文件夹加密器(单文件绿色版)
  9. Druid创始人Eric Tschetter详解开源实时大数据分析系统Druid
  10. 计算机网络实验:netmeeting 在局域网上的应用