1. 实验内容
全国交通咨询模拟
使用语言:Java语言
编译环境:openJDk-1.8
2. 问题描述
处于不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能地短,出门旅游的游客期望旅费尽可能省,而老年旅客则要求中转次数最少。本题目要求编制一个全国城市的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。具体要求如下:
-
提供对城市信息进行编辑(如:添加或删除)的功能。
-
城市之间的交通工具是火车。提供对列车时刻表的管理功能(增加,删除,查询,修改)。
-
提供两种最优决策:最快到达和最省钱到达。
-
旅途中耗费的总时间应该包括中转站的等候时间。
-
咨询以用户和计算机的对话方式进行。由用户输入起始站、终点站、最优决策原则,输出信息:最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
3. 需求分析
经过分析,本系统需完成的主要功能如下:
- 设计城市地图的类
- 设计站点(有向边)的类
- 设计实现弗洛伊德算法解决多源最短路径问题
- 通过文件读取写入修改站点城市班次等信息
- 设计工具类方法完成时间的计算
- 设计可视化界面进行交互操作
4. 概要设计
-=ADT=-
{
boolean setURL(String newURL); //设置操作文件路径
ArrayList<String> getPermulation(int[] arr); //获取全排列的所有可能
BufferedReader getBr(String vehicle); //获取对应的BufferedReader
boolean addInfo(String vehicle,String info); //添加指定信息到指定文件中
boolean deleteInfo(String vehicle,String start,String end); //删除文件中的信息
String transformTime(int costTime); //将分钟(整形)转化为x小时x分钟的字符串形式
StringBuilder getPathInfo(String path,String vehicle,String bestChoice,int costInfo); //获取路径的具体信息,从文件中读取挑选并存入StringBuilder中,并返回StringBuilder
MGraph readInfo(String vehicle); //从指定文件中读取数据,生成一个MGraph对象并返回
void FinishPath(MGraph mg); //完成路径
int addWaitTime(MGraph mg,int v,int u,int w); //添加中转站的等待时间
int getCostTime(String date1,String date2); //传入两个字符类型的时间,计算出两个时间的差值
}
5. 存储结构
使用邻接矩阵的形式存储图
6. 算法流程图
设置顶点 vi 到顶点 vk 的最短路径已知为 Lik,顶点 vk 到 vj 的最短路径已知为 lkj,顶点 vi 到 vj 的路径为 li,则 vi 到 vj 的最 短路径为: min(Lk+Lkj),Lij), vk 的取值为图中所有顶点,则可获得 vi 到 vj 的最短路径。
至于 vi 到 vk 的最短路径 Lik 或者 vk 到 vj 的最短路径 Lkj,是以同样的方式获得。
7. 算法时间复杂度分析
使用弗洛伊德算法时间复杂度为 O(n3)
8. 调试分析
在有向图的重新构建的时候易出现空指针异常,由于弗洛伊德算法循环量较大,调试时出现问题时需要多点定位寻找错误点,在判断齐之后又出现了以下问题:
【问题一】
现象:时间输出出现错误。
原因:加入额外的时间解析类。例如在 12:00 11:00 中间的时间应该为 23 个小时而非-1 小时或 1 小时,当前后时间差为负数时应 +24 小时而进行计算。并在优化体验中计算的单位为小时和分钟,应注意分钟为 60 进制。
【问题二】
现象:ImageView 组件图片无法加载。
原因:路径文件夹应加载在 out 文件夹下。Fxml 的路径设置和 Java 默认的路径设置不尽相同,Java 中的相对路径默认实现是从工程文件的根目录开始寻址,而 JavaFx 是从当前文件夹通过相对路径寻址。
9. 运行结果及分析
9. 参考文献
梁勇著,戴开宇译,《Java 语言程序设计与数据结构》(进阶篇)(原书第 11 版),机械工业出版社,2018