♻️ 资源
大小: 28.7MB
➡️ 资源下载: https://download.csdn.net/download/s1t16/87453197
旅游线路规划
一、设计任务的描述
系统目标: 本软件旨在根据旅客的要求设计出行路线并输出,同时系统能模拟旅所在的地点 和状态,目标是为旅客提供能完美出行的计划。处于对不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途的时间尽可能短,出门旅游的游客则希望旅费尽可能省。编制一个全国城市间的交通咨询程序,为旅客提供最优决策的交通咨询。
二、功能需求说明及分析
功能需求: 设计最省钱和最少时间的算法及其需要信息的存储:最省钱和最少的算法利用迪 杰斯塔拉算法; 信息先是存储在一个文本文件中,程序可以从中读取并且存放在一个类中。 该程序所做的工作是模拟旅游交通查询,为旅客提供最有决策的交通查询。规定: 再输入城市名称时,直接输入城市的名称(汉字);输入时间时,需要输入一个 整型数据,选择功能时在界面上直接选择。程序的输出信息主要是:最快需要多 少时间才能到达,或者最少需要多少费用才能到达,以及在旅程途中临时改变目 的地时方案也相对发生变化和在规定时间内的最省钱方案。模拟旅游交通查询系 统,能实现现实生活中旅客的各种需求做出相应的程序,能实现选择功能。
- 城市总数不少于 10 个,即不能过于简单
- 建立汽车,火车,飞机的航班表 包含沿途到站、票价信息 并且要求两个城市之间不能只有一班车次
- 旅客的需求包含:起点、中点、途经城市、在某个城市的停留时间、 旅行策略(旅客可以中途改变旅行方案)
- 旅行策略包含:最少费用:不考虑时间,只需费用最少最少时间:不考虑费用,只需时间最短限时最少费用:在规定的时间内,让费用最少
- 旅行查询系统以 10s :1h 的速度推进时间轴(非查询状态不计时)
- 不考虑城市内换乘交通工具所需时间
- 系统的时间精确到小时
- 建立日志文件,对旅客状态变化和键入等信息进行记录
- 旅客在旅途中可更改旅行计划,系统做出相应的操作
- 用图形绘制地图,并在地图上反映出旅客的旅行过程
三、总体方案设计说明
开发环境:
版本库:Qt 5.12.2
IDE:Qt Creator 4.8.2
编译器:MinGW 64-bit
系统:Windows 10
概要设计:
本系统整体上分为存储系统,编辑列车城市信息以及求最小费用,最短时间,存 储系统运用到数组和类。存储系统分别存储火车,飞机,汽车列次,始发地和终 点站以及需要的费用。最短时间和最小费用使用迪杰斯塔拉算法编程。该算法主要分为三步:1,起始点(V0)与其相邻点的权值(即当前最短路径)。2,求出 当前最短路径中的最小值即是该起始点(V0)与另一点(Vi)的最短路径。3, V0 到 Vi 的距离加上 Vi 到 Vj 的距离小于 V0 到 Vj 则将 V0 到 Vi 的距离加上 Vi 到 Vj 的距离记为 V0 到 Vj 当前最短路径,循环第二,三步。如此得到 V0 到各点的最短路径,进而可以得到最想要的一条。时间复杂度为 O(n2),空间复杂度 O(n)。
总体结构:
软件结构包括软件模块和模块间的控制关系和模块组成关系。

|-----|------------|-----------|----------|
| 编 号 | 模 块 名 称 | 模 块 标 识 | 模块功能 |
| 1 | 输入模块 | Widget | 图形界面输入操作 |
| 2 | 算法以及旅客信息模块 | Traveler | 计算最优规划 |
| 3 | 绘图模块 | Mapwidget | 图形化输出 |
| 4 | 航班表模块 | Schedule | 读入并存储航班表 |
| 5 | 日志模块 | Log | 生成日志文件 |
四、数据结构说明和数据字典
数据结构说明:

Attribute 类包含了一个车次(或者航班)信息,其中有公有成员:
int from: 出发城市
int to: 目的城市
int cost: 花费
int vehicle: 类型(飞机、火车、汽车)
QString num: 车次号(或航班号)
QTime begin: 出发时间
QTime end: 到达时间
一个 Attribute 类的对象就是一个车次(或航班)信息

Schedule 类包含了一个 multimap 型的 存储城市之间交通工具时刻表的结构
multimap<int,Attribute> database: 所有城市之间交通工具时刻表

Traveler 类包含了一个旅客的全部信息 私有成员:
bool isChecked 是否途经城市 int id 旅客 id
int strategy 旅行策略 int origin 出发城市 int destination 目的城市
QDateTime start_time 出发时间
QDateTime deadline_time 截止时间(策略三使用) QDateTime used_time 已经过时间
QDateTime total_time 总用时间
std::vector throughCity 途经城市 std::vector get_plan() 得到旅行计划 QDateTime get_city_arrival_datetime(int) 到达城市时间 QDateTime get_city_departure_datetime(int)
离开城市时间
std::vector change_plan(......) 改变旅行计划
公有成员:
std::vector plan 记录最优路径 std::vector time 记录每个城市的到达时间 std::vector dijkstra(......) 迪杰斯特拉算法求策略 一、二的最优路径
void deep_first(......) 递归查找路径
void make_plan(......) 生成旅行计划 void update_adjacents(......) 更新相邻节点的值 QDateTime calculate_time(......) 计算时间 QDateTime total_datetime() 总用时
int min 最小花费 QDateTime mintime 最短时间
Ps:最后增加了对旅客信息保存功能,下次打开将自动显示
将旅客信息保存在 traveler.txt 文件中,不要删除此文件,否则下次启动程 序将无法打开文件。
实现方法:在关闭程序之前将旅客信息保存在 traveler.txt 中,再次打开程 序先读文件 traveler.txt,并将旅客信息显示在屏幕上。
五、各模块设计说明
1. Schedule
实现功能:从文件中读入 并 存储 城市之间交通工具时间表 需要对文件中数据类型做处理(例如城市在文件中用中文存 储,读入时应转换为数字编号)
实现方法:读入文件函数如下,将文件中的车次信息逐条读入并存储,对数据的处理函数为 int Schedule::CityToNum(QString city),如下所示,实 现了 中文城市 与 城市编号 之间的转换


2. Traveler
实现功能:计算出不同策略下对应的最优路径,并将得出路径传递给 Mapwidget 模块。同时支持修改路径功能。
实现方法:通过函数 std::vector Dijkstra(......)得出策略 一、二的最优路径。 函数 void DFS(......)递归查找得出路径。
讨论迪杰斯特拉和 DFS
在时间最短和费用最少两种旅行策略中,可以使用迪杰斯特拉 算法,而在一定时间范围内花费最少经过讨论并没有算法可 用,只能穷举所有路径,但是在穷举过程中可以加入剪枝策略
如图所示

数据:
私有成员:
bool isChecked 是否途经城市 int id 旅客 id
int strategy 旅行策略 int origin 出发城市 int destination 目的城市
QDateTime start_time 出发时间
QDateTime deadline_time 截止时间(策略三使用) QDateTime used_time 已经过时间
QDateTime total_time 总用时间
std::vector throughCity 途经城市 std::vector get_plan() 得到旅行计划 QDateTime get_city_arrival_datetime(int) 到达城市时间 QDateTime get_city_departure_datetime(int)
离开城市时间
std::vector change_plan(......) 改变旅行计划
公有成员:
std::vector plan 记录最优路径 std::vector time 记录每个城市的到达时间 std::vector dijkstra(......) 迪杰斯特拉算法求策略 一、二的最优路径
void deep_first(......) 递归查找路径 void make_plan(......) 生成旅行计划
void update_adjacents(......) 更新相邻节点的值 QDateTime calculate_time(......) 计算时间 QDateTime total_datetime() 总用时
int min 最小花费 QDateTime mintime 最短时间
3. Widget
从图形化界面 读入 并 存储 旅客信息,包括旅客的 出发城市、目的城市、途经城市、出发时间、截止时间、选择策略通过调用 getplan()函数,将旅客信息传递到 Traveler 模块,通过 Traveler 模块计算得出最优路径传递会 Widget 模块
实现功能: 读入旅客信息
响应图形化界面按钮请求
添加旅客
从 Traveler 获取最优路径
请求 Traveler 更改方案
实现方法:QT 按钮响应逻辑,与 Traveler 模块进行数据交互
4. Mapwidget
实现功能:读入旅客最优路径,并图形化输出 图形化输出包含了不同类型交通工具选择不同的图标(飞机、火 车、汽车)
实现方法:通过 Widget 获取的最优路径,计算图标的坐标与时间的关系 确 定每一个时间 图标在图形化界面的位置 ,实现动态显示
5. Log
实现功能:将旅客信息(所选方案)以文本格式输出到文件中 实现方法:Debug 输出


六、范例执行结果及测试情况说明
主界面:

范例:首先添加旅客,策略选择选择策略二耗时最少,城市选择北京到香港。

结果: 点击开始,可以发现在解决方案那里已经出现了解决方案,左边的地图也会按照 时间做出相应的动画。

测试情况说明:当在当天晚上十一点半开始查询北京到香港的耗时最少方案时, 解决方案时先坐次日早上六点的 ZH1333 航班在次日早上八点到达重庆,花费 722 元,再从重庆做早上九点的 ZH4951 航班在次日上午十一点到达香港,花费 505 元。因为是在晚上十一点进行这个范例测试,所以花费时间十一个小时二十分钟(次日上午十一点到达),花费 1227 元。
七、评价和改进意见
首先,调试过程中遇到的问题主要是数据类型不匹配,参数没有声明,运行结果 与要求不一致等问题。解决方法:前两个就是不断调试找出错误;后面的主要是 查阅资料,书籍和老师知道,反复阅读实例文档。 本次课程设计,我分析和设计了旅游交通查询系统,此次设计让我对计算机和软 件有了更浓厚的兴趣,让我对迪杰斯特拉算法有了更深的理解,同时也对软件的 设计的各种分析和设计有了更深的理解,我觉得课程设计很接近实际,是锻炼我 们动手能力的好机会,为以后的工作打下基础。本次试验让我明白了软件设计的 思想和方法,1、需求分析,分析为什么需要这个软件,这个软件要实现什么; 2、概要设计,设计如何实现的软件功能,要实现结构化设计,把实现软件功能 的程序模块化;3、详细设计,编写各个模块的具体实现的程序;4、上机调试, 得到运行结果;5、对程序进行分析改进,重复 4 步骤。我也通过本次课程设计 查阅了不少资料,学到了不少知识,也学到了不少调试程序的方法,最重要的是 积累了不少经验。总的来说,虽然做的途中很痛苦很难受,也遇到了很多问题, 不过最后也都是解决了,而且最后的成品做出来的时候还是蛮有成就感的。
八,用户使用说明
1、主界面(有图标和标题),开始时除了【添加旅客】按钮其他都不可点。

2、点击【添加旅客】后。

3、选择【策略】,【始发地】和【目的地】,以及【起始时间】。只有策略三才能 更改【截止时间】。
策略一:

策略三:

还可以选择途经城市,只有点击【选择途经城市】后才能选择途经的城市。

4、点击【开始】后,该按钮变为【更改】。计算完计划,显示方案信息。在左侧 画图,图标会随时间移动。


5、点击【更改】,更改计划,显示新计划信息。

6、在该旅客运行时可以再添加一个旅客。

在【选择旅客】下拉框中可以选择 1 号旅客,界面会重新显示 1 号旅客信息。

7、生成的日志信息:

8、在退出程序时,程序会提示【是否保留旅客信息】
选择【Yes】则自动将这一次旅客的信息保存到以下文件(traveler.txt)中(该 文件不要删除,与 exe 在同一目录下)。



选择【No】则清空旅客信息文件。
9、每次启动程序时都会有如下提示
选择【Yes】则自动从以上文件(traveler.txt)中读取上一次运行的旅客信息, 并直接显示在屏幕上。

选择【No】则不读取任何信息。
