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

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不熟悉很多更好功能没实现,路线推荐算法在进行上海地铁路线计算的时候也会越多需要计算很久才能出结果的问题,针对这个问题我才做了一个路线提前存储到数据库的方案,这也是实在没有太好方案优化推荐算法的无奈之举了。后面也想过对图的最小路径遍历算法进行优化有了想法但真要实现起来并不容易。

代码后续会贴上。

发布了92 篇原创文章 · 获赞 27 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/zhuxingchong/article/details/87900548