- 1、本文档共25页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
山大公交线路上优化路径的查询实验报告
山东大学 计算机科学与技术 学院
数据结构 课程实验报告
?
学号: 姓名: 班级: 实验题目:公交线路上优化路径的查询 实验学时:32 实验日期: 硬件环境:
软件环境:
实验内容与设计:
1.实验内容:
问题描述:
最短路径问题是图论中的一个经典问题,其中的Dijkstra算法一直被认为是图论中的好算法,但有的时候需要适当的调整Dijkstra算法才能完成多种不同的优化路径的查询。
对于某城市的公交线路,乘坐公交的顾客希望在这样的线路上实现各种优化路径的查询。设该城市的公交线路的输入格式为:
线路编号:起始站名(该站坐标);经过的站点1名(该站坐标);经过的站点2名(该站坐标);……;经过的站点n名(该站坐标);终点站名(该站坐标)。该线路的乘坐价钱。该线路平均经过多少时间来一辆。车速。
例如:63:A(32,45);B(76,45);C(76,90);……;N(100,100)。1元。5分钟。1/每分钟。
假定线路的乘坐价钱与乘坐站数无关,假定不考虑公交线路在路上的交通堵塞。
对这样的公交线路,需要在其上进行的优化路径查询包括:任何两个站点之间最便宜的路径;任何两个站点之间最省时间的路径等等。
基本要求:
① 根据上述公交线路的输入格式,定义并建立合适的图模型。
② 针对上述公交线路,能查询获得任何两个站点之间最便宜的路径,即输入站名S,T后,可以输出从S到T的最便宜的路径,输出格式为:线路x:站名S,…,站名M1;换乘线路x:站名M1,…,站名M2;…;换乘线路x:站名MK,…,站名T。共花费x元。
③ 针对上述公交线路,能查询获得任何两个站点之间最省时间的路径(不考虑在中间站等下一辆线路的等待时间),即输入站名S,T后,可以输出从S到T的考虑在中间站等下一辆线路的等待时间的最省时间的路径,输出格式为:线路x:站名S,…,站名M1;换乘线路x:站名M1,…,站名M2;…;换乘线路x:站名MK,…,站名T。共花费x时间。
④ 针对上述公交线路,能查询获得任何两个站点之间最省时间的路径(要考虑在中间站等下一辆线路的等待时间),即输入站名S,T后,可以输出从S到T的考虑在中间站等下一辆线路的等待时间的最省时间的路径,输出格式为:线路x:站名S,…,站名M1;换乘线路x:站名M1,…,站名M2;…;换乘线路x:站名MK,…,站名T。共花费x时间。
实现提示:
需深入考虑,应根据不同的应用目标,即不同的优化查询来建立合适的图模型。
实验设计:
(1)实验需求:
(1)输入数据:总的路线数目,各路线的站点数目,各站点的名称、位置坐标以及各公交路线的速度及票价。
(2)输出数据:输入数据的预处理结果(中间链表)与多个索引数组,三个不同权值的邻接矩阵的值(距离,时间,票价),以及各种不同需求下公交线路的结果。
(3)功能:实现在不同查询条件下最优公交线路的输出。
(2)实现思想:
首先需要对输入的数据进行预处理。此处运用双向链表来存储各站点的名称、横纵坐标及相对位置关系。然后用一个公交车Bus类来存储各个线路的票价、速度及总线路。
之后需要整合所有链表以生成邻接矩阵。首先将所有链表进行第一步处理,算出相邻两点间距离存入第一个结点中原横坐标的位置,特别的,每个链表最后一个站点对应结点的相同位置则存储为NoEdge(99999)。接着将各站点按顺序编号存于原链表纵坐标位置。接下来将各路线的链表连接在一起形成一个存有全部路线的新链表wholeRoad。
对wholeRoad进行处理。因为各路线中站点可能出现重复的情况,因此需要对编号进行去重操作。遍历链表若发现某站点名出现过两次或两次以上,则将第二个以后的编号皆赋成第一个的编号值,同时设置一个变量count来记录多次出现的的站点数。count初始值为0,若出现一次重复则count加1,同时后面所有的编号赋为原编号减去count。通过以上方法来解决重复站点问题。
根据最终站点编号建立原始编号与最终编号的索引数组和最终编号与站点名的索引数组,并提供逆向查找方法。最后生成以距离为邻接矩阵时依照的就是最终的编号。不过在生成过程中还是按照总线路链表进行循环,遍历总路线链表并根据索引将对应的距离存入真正的位置,其他位置均设为NoEdge。而生成以时间为权值和以票价为权值的邻接矩阵过程基本一样,只不过是将对应位置的值除相应速度或换为相应票价乘上线路编号的平方(原因下方解释)。
在最终邻接矩阵处理中主要运用Dijkstra算法。在时间最少与距离最短查询时直接使用Dijkstra算法即可。然而在票价最少时需要对算法进行调整。因为坐公交车时在一条线路上一直乘坐只需要交一次车票钱因此不能直接将票价进行累加,然而不同线路间也可
文档评论(0)