现在比较热搜的事情就是外卖小哥说送达时间越来越少,一旦超时就要赔很多钱,为此衍生出来很多交通事故,还说导航有时候会给出逆行路线等等。

在这里就单纯地从技术角度,谈谈个人对导航出现逆行、不是最短路径等不合理路线规划的推测。

一般来说,导航软件出现违反交通规则的导航路线是严重的错误,这是生命线,软件提供商会尽最大努力去避免,但是这个错误又很难避免,原因何在?这不是算法的问题,而是数据的问题。

我们的地图看着是这样:

但其内部其实是这样:

将整个地理环境分割成一个又一个的方块。假设有如下图:

A到B,可以通行的路径,就只有两点之间的那条横线所经过的方块,不管你用什么最短路径算法(贝尔曼-福特、Dijkstra、A*或者各大公司自己开发的算法),上面是山,下面是河,没法通过。

在程序中,以上数据的形式应该如下。

格式:起点,终点,权重。为了简单说明,权重统一为1


0,1,1
1,0,1
1,2,1
2,1,1
2,3,1
...

是不会出现


0,20,1
0,10,1

这些数据的。

但是我们知道,地图是二维的,而实际的交通网络是三维的,有正常的地面道路,还有地下通道、过街天桥等等,例如:

如下示意图:

虚线是过街天桥,实线是地面道路。体现到数据上就是:


0,1,1
0,6,1
......

那么导航软件是怎么实现AB间的路线规划呢?如果选择的是步行,则虚线的数据可用,最短路径算法会给出0-1-2-3-4-5的路线。如果是驾车,则虚线的数据不可用,走0-6-7-...-15-5路线。

逆行路线同理,如下图:

导航软件的目标,永远是在遵守法规的情况下,提供最优的路线规划,在算法一定的情况下,数据就是决定因素了。

但是在实际中,地图数据的更新是跟不上实际道路的变更的,以我经历的一件事来说明:

就是地图上这条路:

一直以来这条路是不通行的,所以在规划路线的时候是没有这条路的,当6月30通行的时候,我还特意使用几个导航软件测了一下,这条路依然无法通行,但是几天之后,应该是数据更新了,给出的路线规划中就可以走这条路了。

当然,有时候导航软件还要考虑路线的权重,比如拥堵程度、红绿灯的多少等等,都会影响到路线的规划。

有的明明是两点间直线距离最短(距离优先),但是这条路都是严重拥堵了,导航规划大概率会给出一条虽然绕远但是不拥堵的路线(时间优先)。

以上,数据的滞后会导致路线规划不能做到最优,但是导航软件可以通过采集用户的实际通行路线来及时更新数据。

例如:

在X路线:0-1-2-3-4-5这条路还没通行的时候,给出的最短路线是Y路线:0-6-7-8-...-13-5。

顺便多说一句,当我们要求导航软件给出A到B的路线时,大概率是不会用算法算一遍的,而是从缓存中直接取出Y路线,这样响应速度最快。

当断头路打通之后,虽然在导航软件里,X路线还是不存在,但是用户可不傻啊,肯定会走X,大量的用户走X路线并上报,导航软件的后台经过统计,原Y路线A到B耗时9,新X路线A到B耗时5,哪怕在数据中X路线是不存在的,但是有句老话说得好:世上本没有路,走的人多了便也成了路。导航软件就会将Y替换为X。

逆行的路线也同理。当然了,也不排除导航软件就是不给力,净给出逆行的规划也说不定。。。

本文在写的时候,有关配送时间过短的问题,饿了么、美团都给出了解决措施,希望我们大家都越来越好吧。

再强调一下,以上只是个人推测,限于能力,与现实情况必定不一致。