1.简介

之所以写这边文章是因为开发了一个地铁到站提醒App,其中就需要计算最短地铁换乘路线,这个方案在网上找了很久能找到一点最短路径的思路,但这些思路计算最短路径要花费的时间太久给人体验很不好。我的这个算法思想和人思考找到一条最短换乘线路一样,先找到所要换乘路线,再从路线中找到从那个站换乘(有些路线共同站台可能不止一个),为了更快提供用户查询路线,我还做了一个自动学习记忆的一个算法,该算法很简单就是在用户查询路线的时候先查询一个数据库,这个数据库保存了之前所有用户的查询路线如果本次用户要查询的路线已经有人查过则可以直接返回这样可以更快获取结果,如果没有人搜索过用户要查询的路线,则会通过最短换乘路径推荐算法查询结果并将结果保存起来完善路线数据库,为了让提供更好体验我提前写好了脚本把一个城市所有路线每两个站换乘路线都计算好了并全部保持到了数据库中,这样数据库基本就能满足用户所要查询的路线,这个方案是不是很好,哈哈哈有点作弊的嫌疑,但没关系只要可以达到目的对任何人没有影响就ok。

因为我这个是个人开发为了节约成本再一些方面做的有些不足。1.所有查询的路线数据库是保存到了APP本地数据库提前内置了一个各个城市路线数据库,这样很不灵活也导致App包体积变大了不少,2.因为没有通过服务器查询路线导致某个线路改变时数据库无法实时更改,3.最短路径算法内置到了APP中导致优化算法后需要发包很麻烦这种算法最好放在服务端。

总而言之没有服务器节约了成本但上面很多问题也是很麻烦,如果要想做一个长远APP必须要把站台数据,路线数据,推荐算法都放在后台。

2.流程图

算法流程:

1.通过数据库查询路线,

2.如果路线不存在通过算法查询,

3.将新查询到的路径保持到数据库中

3.算法解析

(1).最少换乘路线算法:

不论是公交还是地铁飞机火车等交通方式,要想知道从一个地方到另一个地方我们先要找到要经过那些路线,再找这些路线应该在哪里换乘最少,首先要构建一个路线模型。

下面给一个例子让你看懂构建过程,从深圳地铁路线来看。

如图所示深圳现在有8条地铁路线,每条路线由不同颜色绘制,如果我们要想从一个站到另一个站(1)先要找到这个站所在的线路(2)找到终点站所在线路(3)找到通过哪些线路可以将两条线路连接起来,按照这三个步骤我们既可以找到从一个站到另一个站需要换乘的线路。从而构建出一个图的模型。

上面是一个深圳各个路线完整连接无向图,例如我们要从西丽站到科苑站,经过西丽站的路线有(5号线,7号线),经过可以站路线有(2号线),从上面图来找,

5号线到2号线:5->2,5->1->2,5->3->2,5->7->2,5->4->2。。。。等有很多的线路

7号线到2号线:7->2,7->5->2,7->4->2。。。。等有很多的线路

按照人的思维我们是想找到换乘最少的那就是5->2,7->2两条其它换乘更多的我们可以排除。

按照上面思路我们可以建模通过图的遍历来查询两个站要换乘的路线,最终我也是确定了这个思路,如果确定了这个思路那就很好办了,寻找最少换乘的问题就变成了一个无向图遍历最少连接先的问题了,网上也有很多的算法用来求图两个点的最短路径,实际上我基本搜遍了最终发现算法差不多都是遍历两个点所有路径,最终对比经过最少的路径即是最少换乘的。

当然找到最少的很有可能不知一条,要想最终确认那条路径经过的站最少还要进一个的计算。

就用刚才的例子从西丽站到科苑站就有两条最少换乘的方案5->2,7->2,要想知道哪一个经过的站最少就需要进一步确认,开始我想的很简单,就是找到5->2号线换乘站就是两条线经过的站,例如

5->2号线就有一个站黄贝岭站,一共经过35个站,

7->2号线就有两个站安托山站,和华强北站,分别是11站和32个站遇到这种情况我们也会很容易判断出当然选11站的在安托山换乘。

4.最少站台数算法

如果遇到更加复杂的情况就非常能判断了,遇到需要换乘三次,四次甚至更多的情况就是我们知道要乘坐那些路线也很难知道应该在哪一站换乘。面对这种情况我们需要列举出所有的站点并比较这些站台最少的一条从而得到最终的换乘路线。

同样我们需要先建模看看用什么算法。

这次举一个更复杂的例子从珠光站到西乡站,按照上面查询方案我们得到了一个换乘方案7->5->1

7->5号线有两个交点:西丽和太安

5->1号线有两个交点:宝安中心和前海湾

如上图所示最终我们得到一个有方向并带权重的图,要想计算这个最少换乘站有转换成了一个,有向带权图的遍历问题了,这个算法同样网上有很多。有时我们找到的可能不知一个换乘方案例如5->7-2,5->3->3,5->11->2等这种只要将每个方案带入有向带权图的遍历找到各自最少换乘站数目再最最后对比,如果最后发现还有相同站台数量的,没关系,我们可以带入换乘时间,价格等参数进行对比从而得到最有换乘路线。

4.总结

在开发地铁到站提醒这款app是遇到了很多问题,最费时间的有两地方(1)站台数据收集,数据库整理,因为全国有很多城市都有地铁不仅要收集每个城市每条地铁,站台,数据还要对这些数据整理加工成我的数据这个废了不少的时间数据校验也是一件非常头大的事件,网上有很多各个城市地铁相关数据,但有些数据他们竟然不一样让我郁闷了很久,另外还要对算法校验,需要确定一下复杂路线推荐的路线是不是最优,我这个结果是和百度推荐的路线进行对比的总而言之这个项目对技术来说用到了html5展示各个城市晚上路线图可放到缩小查看因为对js不熟悉很多更好功能没实现,路线推荐算法在进行上海地铁路线计算的时候也会越多需要计算很久才能出结果的问题,针对这个问题我才做了一个路线提前存储到数据库的方案,这也是实在没有太好方案优化推荐算法的无奈之举了。后面也想过对图的最小路径遍历算法进行优化有了想法但真要实现起来并不容易。

代码后续会贴上。

(一)最短换乘路径推荐算法相关推荐

  1. 【基础算法】Dijkstra算法,以上海地铁换乘为例,计算最短换乘路径和时间

    一.算法概述: 该算法是一个求最短路径的算法,具体算法的思想为: 找出离源点O最近的点,把该点设为S: 以S点为中转点,查看如果以S点为中转点,计算源点O中转S点到各点的距离transfer_dist ...

  2. 为什么a*算法采用哈密尔顿距离作为启发函数比不在位数为启发函数的性能要好?_KDD2019: 使用神经网络为A*搜索算法赋能 --以个性化路径推荐为例...

    本文系 KDD2019 论文的解读: Wang, Jingyuan, Ning Wu, Wayne Xin Zhao, Fanzhang Peng, and Xin Lin. "Empowe ...

  3. KDD 2019 | 使用神经网络为A*搜索算法赋能:以个性化路径推荐为例

    「论文访谈间」是由 PaperWeekly 和中国中文信息学会社会媒体处理专委会(SMP)联合发起的论文报道栏目,旨在让国内优质论文得到更多关注和认可. 研究动机 A* 算法因为它的高效和准确而被广泛 ...

  4. 求解广州到上海用时最短的路径,使用中国地图超详细剖析Dijkstra算法思想

    前言 当然,我们想知道广州到上海用时最短的路径,用导航软件一搜就知道答案了.但博文本意是想通过中国地图理解Dijkstra算法的主要思想,所以会设立一些特殊条件使得读者更好的能根据求解广州到上海用时最 ...

  5. ML之KG:基于MovieLens电影评分数据集利用基于知识图谱的推荐算法(networkx+基于路径相似度的方法)实现对用户进行Top电影推荐案例

    ML之KG:基于MovieLens电影评分数据集利用基于知识图谱的推荐算法(networkx+基于路径相似度的方法)实现对用户进行Top电影推荐案例 目录 基于MovieLens电影评分数据集利用基于 ...

  6. 《算法竞赛进阶指南》打卡-基本算法-AcWing 91. 最短Hamilton路径:位运算、状态压缩dp、dp

    文章目录 题目解答 题目链接 题目解答 分析: 状态压缩dp是用二进制数来表示状态. 数据范围n = 20, 那么状态总量就是2202^{20}220个状态. 可以按照以下思路去思考: 哪些点被用过 ...

  7. 从原理到实现,详解基于朴素ML思想的协同过滤推荐算法

    作者丨gongyouliu 编辑丨Zandy 来源 | 大数据与人工智能(ID: ai-big-data) 作者在<协同过滤推荐算法>.<矩阵分解推荐算法>这两篇文章中介绍了几 ...

  8. 地铁线路图中任意两点间所有路径高效算法

    在求图线任意两点间最短路径时,利用floyd.dijdstra等成熟的算法可以求得,效率还不错.但要求换乘最少.最舒适等路径时,需要求线网图中任意两个点的所有路径,然后根据条件筛选,以上算法无能为力. ...

  9. 基于强化学习的智能机器人路径规划算法研究(附代码)

    目录 一.摘要 二.路径规划技术的研究进展 1.研究现状 2.算法分类 2.1 全局路径规划算法 2.2 局部路径规划算法 三.本文采用的路径规划算法--强化学习 1. 概念 2. 与其他机器学习方式 ...

最新文章

  1. CLOCs:3D目标检测多模态融合之Late-Fusion
  2. js轮询导致服务器瘫痪_演进:Tengine 从 Web 代理服务器 到 分布式推送服务器
  3. 点云 DBSCAN 对点云障碍物聚类
  4. 使用 Newtonsoft.Json; 序列化正常,反序列化异常的一点思考
  5. 分布式文件系统研究-fastDSF文件上传和下载流程
  6. java多线程 生产者消费者_java多线程之生产者消费者经典问题 - 很不错的范例
  7. oracle自动内存管理要不要开,Oracle 11g的自动内存管理
  8. 使用Spring StateMachine框架实现状态机
  9. Android studio 配置使用maven
  10. async和await理解代码
  11. SpringBoot配置文件最全最详细中文说明
  12. HTML5新增的表单元素有哪些?
  13. 华为鸿蒙联合品牌,魅族官宣:接入华为鸿蒙!这是国产智能手机品牌的首个公开表态!...
  14. Raider:Web身份认证测试框架
  15. 传感器原理与应用复习—电阻式应变传感器部分
  16. attention权重解读
  17. 女生转行学习IT技术需要考虑什么
  18. 手机科学计算机xy怎么用,如何使用科学计算器
  19. 2018/10/25 模拟赛 纸牌
  20. 大专程序员待遇吊打清华毕业的深圳老师!深圳老师即将第二次降薪,每月再降4000元!...

热门文章

  1. 使用SkinMagic实现换肤
  2. nginx 一个站点支持多端口配置
  3. Paas概念和docker的关系
  4. 计算机网络第七版期末考试名词解释,计算机网络期末考试必背题
  5. 仿百度壁纸客户端(六)——完结篇之Gallery画廊实现壁纸预览已经项目细节优化
  6. CG100 田皇冠发生碰撞事故导致发动机盖弹起气囊ACU数据复原。
  7. 【调剂】中国地质大学(武汉)计算机学院2023年硕士研究生招生调剂复试录取工作方案...
  8. roadhog 官网介绍
  9. a 便签实现 下载
  10. 【1732. 找到最高海拔】