高德地图红绿灯读秒是如何实现的?

关于这个读秒实现功能众说风云,目前有两种说法,一种说是靠大数据分析,一种说是靠交管部门数据。

有人说是接入了地方交管数据,其实政策难度很大且没必要。

高德等软件的一个能力是读取正在导航的手机的加速度计信息,因此当在此路口很多本来停止的车逐渐起步时,高德事实上可以推断出此处的红绿灯由红转绿了。更重要的是,高德还可以获得正在导航手机的routing信息,因此它甚至很容易的,知道是哪几个车道由红红转绿。于是很容易地可以推算出这个路口的周期T于当前状态S。

之后的任务就更简单了,一方面将推断出信息通过网络分发给用户,一方面根据用户的行为实时微调当前状态于周期T,从而实现长期循环。

但可以想到的一个问题是,如果一个十字路口很长时间没有车通过(例如一夜没过车),那么误差累积下,高德的读秒推算系统就需要在第二天早上逐渐有车的时候进行重新初始化了,有兴趣的同学可以尝试下凌晨四五点开车通过一些十字路口,看看高德的读秒是不是准确。

为什么有些路口有显示有些路口没有?

答:学过状态估计的都知道,我们在估计出状态后还会得到一个方差,描述了算法对估计的不确定度。当算法由干数据不足、红绿灯周期时变、当前路线(例如左转)数据匹配不确定等原因时,会出现算法估计方差过大的问题,这时候就不在前端显示了。

为什么有些路口极其精准,有些路口不准,有些路口没车也很准?

答:准不准固然与经过的车辆开导航的比例有关,同时也与红绿灯策略的变化频率有关。

例如一个郊区的红绿灯,交警部门不会给其很复杂的变化策略,那么一日估计出周期,一个月周期都不变,那么算法会逐渐增强对自己估计的肯定,因此会很准确。

又例如一个繁忙的十字路口,因为刚刚结束早高峰,红绿灯周期发生了切换。那么算法需要根据观测逐步调整估计。但因为历史数据累积的足够多,算法依然很确定自己的估计,所以会导致前端显示出误差较大的结果。

为什么有些地方交警官方宣传与高德合作?

答:早期或部分地级市可能存在接入。但是观察新闻可以发现,新闻几乎都是地级市级别的交警部门在宣传,这其实说明地级市之间的数据大概率难以打通,各位想一想中国有多少地级市?高德的产品经理一个一个去谈合作? 这些地级市的交通系统api又有多大差别?后台的程序员们一个城市一个城市写if else? 但凡和政府打过交道,或者开发过大型系统就知道这不靠谱。

算法估计难以给出这么精确的值?手机级别的传感器难以给出精确启停时间?

这个估计的难度真的不高,说难估计的大概率《概率论》没怎么学。说大数据不靠谱,过于复杂的大概率没接触过大数据。目前自动驾驶领域,车辆摄像头被遮挡的情况下,仅凭自车感知,都可以比较精确的根据周车状态,估计出红绿灯信息,更别说高德地图这种多源数据了。

至于说大家一起摇手机干扰估计,其实是可以做到的。前几年就一直有闲的没事的人,拿好多个手机开导航在路上慢慢走,给导航软件,虚假拥堵。

至一说高德算力不够更扯淡,这算法义不过网络,cpu算算快的一批,搞不好直接用里户手机做一些初步计算,直接上传一个中间结果,云端再做汇总,根本但不了多少算力。

其实高德,百度估计这个,志不在小。如果是接入交管系统,那么只是把app当一个显示器。但如果是自己估算,那么未来是不是可以将自己估算的结果直接上传到交警系统,然后告诉红绿灯系统,如果这时候变灯,能节省大家多长时间,最终反而去控制红绿灯? 这才是这些智慧城市的低成本,高智慧,高收益形态。虽然现在误差还有,但相信随着算法优化,这一天不会太远。

全部评论

相关推荐

本人2硕,双非本,秋招。直接上手做题了。1.实现一个函数getRandomFloat(min,max),要求返回[min,max)的随机浮点数;升级,返回[min,max]的随机整数;(并解释思路)2.将嵌套数组"扁平化"到指定的深度。function flat(array,depth =1 );要求:(并解释思路)1). 不能使用原生的`Array.prototype.flat`方法2). 必须正确处理各种数据类型(数字、字符串、对象、null、undefined等)3). 必须正确处理稀疏数组 [,,,,]  //这个不怎么会,没考虑出来4). 必须支持Infinity作为深度参数5). 必须正确处理循环引用(加分项)3.说出打印结果,并说明为什么;var p1 = new Promise((resolve, reject) => {reject(new Error('The Fails!'))}).catch(error => console.log(error.message)) // The Fails.catch(error => console.log(error.message))  //不会打印var p2 = new Promise((resolve, reject) => {reject(new Error('The Fails!'))})p2.catch(error => console.log(error.message))  // The Failsp2.catch(error => console.log(error.message))  // The Fails4. 问项目中遇到的难点(顺便问了点八股),自己擅长处理什么,项目后有没有去继续深究为什么(是否了解相关技术);5. 栈 和 队列,有什么区别,应用场景有哪些?面向对象的一些基础知识。对于前端是从什么时候开始接触的,是怎么安排规划学习的?(还有一些相关的问题)6.反问。整体感觉不难,面试官非常和善,做题的时候适当的提醒了(给了点提醒才做出,本人太菜)。大概就是这些。
点赞 评论 收藏
分享
投递阿里巴巴集团等公司10个岗位
点赞 评论 收藏
分享
评论
4
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务