浅谈滴滴派单算法

本文做者:王犇 滴滴 | 首席算法工程师算法

导读:说到滴滴的派单算法,你们可能感受到既神秘又好奇,从出租车扬召到司机在滴滴平台抢单最后到平台派单,你们今天的出行体验已经发生了翻天覆地的变化,面对着天天数千万的呼叫,滴滴的派单算法一直在持续努力让更多人打到车,本篇文章会着重介绍咱们是如何分析和建模这个问题,而且这其中面临了怎样的算法挑战,以及介绍一些咱们经常使用的派单算法,这些算法可以让咱们不断的提高用户的打车肯定性。segmentfault

1.为何咱们须要更好的派单算法

说到滴滴的派单算法,你们可能感受到既神秘又好奇,从扬召到抢单到派单,咱们又是如何演进到今天你们的打车体验的呢,咱们首先来看一看,好的派单算法为何是出行行业不可或缺的能力?网络

回想几年前,当咱们尚未滴滴的时候,只能在寒风或者酷暑中等待可能有、可能没有的扬招出租车,到后来能够从滴滴上呼叫一辆出租车,乘客能够在室内相对温馨的等待车辆的到达,从线上到线下,乘客的肯定性获得第一次的提高,然而这还不够,抢单的模式注定咱们的应答率天花板不会过高,在15年,滴滴上线快车业务,咱们从抢单演进到了派单模式,乘客的应答率有了20个点以上的提高,不少时候可以全天可以高达90+(高峰&局部供需紧张应答率会相对吃紧),乘客肯定性再一次获得大幅的提高,因而可知,派单模式为滴滴创造了巨大用户价值。学习

再看近年来不断兴起的O2O业务,从国内外的网约车公司,包括咱们的友商Uber、Lyft都基于派单的产品形态进行司机和乘客之间的交易撮合,Uber上市的时候把派单引擎也做为核心技术能力放在了招股书中;再看咱们的国内的外卖平台,核心派单系统的优劣也决定了整个平台的交易效率(单均配送成本)和用户体验(配送时长);最后,整个大物流行业近年来也不断在进行线上化的改造,如何撮合货物和司机,以及更好的拼单能力也是整个交易环节的关键和商业模式是否成立的前提。从运人到运物,派单引擎目前愈来愈多的被应用在现实的商业和生活中。优化

2.派单问题初探

言归正传,这里咱们也来看一下,滴滴网约车平台究竟是怎么派单的。首先,咱们来看下咱们面对的是什么样的问题?spa

“订单分配 便是在派单系统中将 乘客发出的订单 分配给 在线司机 的过程”3d

这是一个看似简单的,但实际上很是复杂的问题。说到这,可能有不少人就会问,可否就把 个人订单分配给离我最近的司机就行了?blog

的确啊,实际上目前滴滴的派单算法最大的原则就是 “就近分配” (70%~80%的订单就是分配给了最近的司机),据我所知,目前世界上其余的竞品公司(包括Uber),也均是基于这个原则分单的。 游戏

咱们进一步来看这个问题,若是咱们只按照就近分配,先到先得的贪心策略,是否是能最好的知足平台全部乘客和司机的诉求呢?答案是否认的,缘由就在于,若是咱们只基于当前时刻和当前局部的订单来进行决策,忽视了将来新的订单&司机的变化,还忽视了和你相邻的其余区域甚至整个城市的需求(注:在时序上来看,新的司机&订单的出现会致使,贪心策略反而违背了就近分配的目标)。这就是为何这个问题依然是很是复杂的缘由。ip

这里稍微有点抽象了,不过不要紧,咱们再来一步一步的拆解一下订单分配的问题,让你们有个更好的理解:

简单看,在咱们的平台上,每个时刻,都有N个订单在被乘客建立,同时有M个司机能够被咱们用来进行分配,咱们强大的平台可以为派单算法给出司机的实时的地理位置坐标,以及全部订单的起终点位置,而且告诉咱们每个司机接到订单的实时导航距离。

▍若是是1个订单、1个司机

file

看上去彷佛就很是简单了,咱们直接把这个订单指派给这个司机就行了嘛。

“那么为何有时候附近有辆空车却不能指派给你呢?”

实际线上的系统会比这里稍微复杂一点,缘由一方面有多是司机正好网络出现故障,或者正在和客服沟通等等致使司机没法听单,另外一方面的缘由是并非全部的车都可以符合服务你订单的要求,最基本的策略实际上是人工设定的规则过滤。举几个最基础的例子:

规则A:快车司机不能接专车订单
规则B:保证司机接单后不会经过限行限号区域
规则C:为设定实时目的地的司机过滤不顺路区域
规则D:为只听预定单司机过滤实时订单
规则E:同一个订单只会发给一个司机一次
......

必须澄清的一点是这里的规则并不会形成分单时不公平的效果,而彻底是为了业务能正常运行而设立的,这些策略承担着保证业务正确性的重要职责。

▍若是是1个订单和2个司机

假设这两个司机都可以分配给这个订单,那么咱们来看系统应该是如何分配的。

首先第一种状况是,同一时刻下,这两个司机和订单的距离都彻底同样的状况下,系统应该如何分配?

file

刚才也说到,咱们平台订单分配最大的原则是就近分配,当距离彻底同样的状况下,当前咱们系统上会主要考虑司机的服务分的优劣,服务分较高的司机会获取到这个订单(注:服务分对分单的影响,简单的理解能够换算为多少分能够换成多少米距离的优点,这块不是今天的重点就不展开介绍),再说明一下,系统用到的是地图的导航距离,而非人直观看到的直线距离,有时候差一个路口就会由于须要掉头致使距离差别很大;而且若是司机的定位出现问题,也会出现分单过远的状况。

那么咱们来看第二种状况,若是A司机离的近,B司机离的远,系统怎么派?

file

这就简单了,根据就近分配的原则,咱们会把A司机分配给这个订单。嘿嘿~~,假设咱们再把问题设置的更加实际一点,当订单发出时,B司机已经在线并空闲,可是A司机尚未出现(没有上线,或者还在送乘客),但再过1s,离得更近的A司机忽然出现可被分单了,假设咱们使用先到先得的贪心策略,那么B司机就会被分给这个订单,那就违背咱们但愿就近分单的目标了:(。因此看上去简单,但实际状况下,算法还须要变的更好一些,这个问题咱们把它叫作派单中的时序问题,咱们后面再来看怎么解决。

▍若是有N个乘客、M个司机

最后咱们来考虑最复杂的多对多的状况,这也是线上系统天天高峰期都须要面对的挑战,咱们通常把这种状况会形式化为一个二部图的匹配问题,在运筹领域也叫作matching的问题,如图所示:

file

咱们再把这个问题具象一点,假设这个时候咱们有20个乘客,有20个司机,这些乘客均可以被这20个司机中的一个接驾,咱们的系统须要把这20个乘客都分配出去,而且让你们的整体接驾的时长最短。听上去是否是有点复杂?咱们套用下组合数学的知识,这其中可能的解法存在20的阶乘那么多,20的阶乘是什么概念呢?2019181= 2432902008176640000,这个数巨大无比,想要彻底的暴力搜索是绝对不可能的。这里须要更聪明的办法。

▍若是有N个乘客、M个司机,一会再来几个乘客和司机?

这就是派单问题最大的挑战,咱们不只仅须要当前这个时刻的最优,咱们要考虑将来一段时间总体的最优,新来的司机和乘客会在整个分配的网络中实时插入新的节点,如何更好的进行分配也就发生了新的变化,因此如何考虑时序对咱们很是重要,这个问题在业内也被称为Dynamic VRP问题,这个Dynamic也就是随时间时序变化的意思,这也就是为何,滴滴的派单问题远复杂于物流行业的相对静态的货物和路线的规划问题。假设咱们知道了将来供需的彻底真实的变化,仿真告诉咱们,咱们的系统有可能能够利用一样的运力完成1.2~1.5倍的需求量,这也是派单算法的同窗持续为之努力的方向。

想起前段时间的吐槽大会,你们提到文嵩曾说咱们的派单问题比alpha go还要难,其实这两个问题还确实有点类似,都是在超大的搜索空间中找到一个近似最优的解,而alpha go则会在一个更加明确的游戏规则和环境中进行求解,它的难点在于博弈,而咱们的派单问题难点在于将来供需不肯定性&用户行为的不肯定性。近年来在学界,已经有很多尝试在利用相似alpha go的技术进行VRP&TSP等方向的探索,强化学习结合运筹理论是将来运筹界很是前沿的方向之一(非技术同窗能够跳过此处:))

3.派单算法简介

上面咱们已经描述了什么是订单分配问题,而且它所面临的各类挑战,那么在这里咱们来

聊一聊咱们线上的派单策略是如何解决其中一部分问题的。

在介绍具体策略以前,首先咱们来讲一下派单算法大的原则,目前派单策略主要的原则是:站在全局视角,尽可能去知足尽量多的出行需求,保证乘客的每个叫车需求均可以更快更肯定的被知足,并同时尽力去提高每个司机的接单效率,让总的接驾距离和时间最短。

如何理解这个原则呢?咱们说策略会站在全局的角度去达成全局最优,这样对于每个独立的需求来看,派单可能就不是“局部最优 ”,不过能够告诉你们的是,就算在这个策略下,仍然有70%~80%的需求也是符合当前距离最近的贪心派单结果的。

接下来,这里会拿两个重要的派单策略的来进行介绍。(这里的内容主要是讲清楚策略的motivation为主哈,细节再也不展开)

▍批量匹配(全局最优)

派单策略中最为基础的部分,就是为了解决上一节所提到的时序问题。这个算法几乎是全部相似派单系统为了解决这个问题的最基础模型,在Uber叫作Batching Matching,咱们内部也叫作“全局最优” 或者 “延迟集中分单”。

这个Idea其实也很是直观,因为用户订单的产生和司机的出现每每并不在同一时间点,在时间维度上贪婪的分单方式(即每一个订单出现时即选择附近最近的司机派单)并不能得到全局最优的效果。一个天然的想法就是先让乘客和司机稍等一会,待收集了一段时间的订单和司机信息后,再集中分配。这样,有了相对较多、较密集的订单、司机后,派单策略便可找到更近更合理的派单方式了。

找寻司机和订单分配的全局最优是一个 二分图匹配问题 (bipartite graph matching) ,一边是乘客、一边是司机,可用运筹优化中各类解决Matching问题的方法进行求解。

和再你们澄清一下,咱们所采用的批量匹配的模式和你们所但愿的,“把离我最近的司机派给我”的「就近派单模式」并不矛盾,咱们也是寻求“乘客接驾时长最短”的最优解,大多数状况下也是指派离你最近的司机,但充分知足每个乘客的“把离我最近的司机派给我”的个体需求, 有些时候反而会致使部分乘客的需求没法获得知足,好比说下面这种状况:

当编号1和2两个乘客同时叫车, 若是彻底按照“就近派单”的模式, 虽然可让1号乘客先被接单, 可是2号乘客会由于接驾距离较远, 致使等待时间变长, 甚至由于最近的司机超出平台派单距离, 致使2号乘客叫不到车。一、2号乘客总等待时长15分钟, 平均等待时长7.5分钟。

file

咱们采起的作法是, 把距离较远的2号车派给1号乘客。

把1号车派给2号乘客, 这样一来, 1号乘客和2号乘客, 平均等待时长缩短为5分钟, 比就近派单,缩短了2.5分钟, 总等待时长缩短为10分钟, 比就近派单, 缩短了足足5分钟。

file

经过提高全局的效率,才能转化为让更多乘客的需求获得知足。

▍基于供需预测的分单

“若是有先知告诉咱们将来每个订单的生成时间&地点,每个司机的上线时间&地点,派单就会变成很是轻松的一件事”

刚才所说的批量匹配的方法,理论上可以保证那一个批次的匹配是最优的。可是这样就够了吗?

很遗憾,以上所述的延迟集中分单的策略只能解决部分的问题,仍不是一个彻底的方案。其最大的问题,在于用户对系统派单的 响应时间 容忍度有限,不少状况下短短的几秒钟即会使用户对平台丧失信心,从而取消订单。故实际线上咱们只累积了几秒钟的订单和司机信息进行集中分单,而这在大局上来讲仍可近似看作时间维度上的贪婪策略。

若想即时的得到最优派单结果,惟一的方法是利用对将来的预测,即进行基于供需预测的分单。这种想法说来玄妙,其实核心内容也很简单:若是咱们预测出将来一个区域更有可能有更多的订单/司机,那么匹配的时候就让这个区域的司机/订单更多去等待匹配这同一个区域的订单/司机。

▍连环派单

基于供需预测的分单有很大意义,但因为预测的不肯定性,其实际效果很可贵到保证。为此,咱们使用了一种更有肯定性的预测方式来进行派单,即 连环派单。

“连环派单,即将订单指派给 即将结束服务 的司机,条件为若是司机的终点与订单位置很相近”

file

与预测订单的分布相反,连环派单预测的是下一时刻空闲司机的所在位置。因为高峰期空闲司机多为司机完成订单后转换而来,预测司机的位置就变成了一个相对肯定性的问题,即监测司机到目的地的距离和时间。当服务中的司机距终点很近,且终点离乘客新产生的订单也很近时,便会命中连环派单逻辑。司机在结束上一单服务后,会马上进入新订单的接单过程当中,有效地压缩了订单的应答时间、以及司机的接单距离。

▍如何作的更好

整个派单算法核心克服的是将来供需的不肯定性,动态的时空结构的建模,以及用户行为的不肯定性,对于这些不肯定性咱们如今更多采用深度学习方法对咱们的时空数据&用户行为进行建模预测。

另外,咱们的问题相对于传统推荐搜索领域,多了一层匹配决策,咱们到底积攒多久的订单进行分配,对于每个分配来讲咱们都面临着分或者不分,如今分仍是将来分配,而且分给谁的问题,这个问题天生就能够建模为强化学习问题,目前在咱们的系统中也引入了强化学习方法来优化更长期的收益。

除了不断去优化以前说到的派单问题,整个派单系统还面临着大量其余的挑战,包括如何利用快车优享等多个品类的运力进行跨层的最优分配,如何同时对用户&司机&平台短时间长期等多个目标进行优化,如何同时优化预定&实时订单,如何在具有网络效应的场景下对算法进行评估,若是创建一个较为精准的仿真系统等等,这里既是挑战,也是AI For Transportation中大量新的从新定义问题和创新算法的机会。

4.总结

天天, 咱们的派单系统要面对超过3000万用户的叫车需求, 高峰期每分钟接收超过6万乘车需求,平均每两秒就须要匹配几百到上千的乘客和司机 。咱们当前的派单策略相对于最初的派单策略版本,天天可以多知足百万以上乘客的出行需求。为了让更多人能更快、更肯定的打到车,咱们的交易策略团队将在更好的公平感知的前提下,不断地优化和打磨咱们的派单算法,为乘客&司机创造更多价值。

固然当前的派单策略还有不少不够完善和完备的地方,自己也是一个至关复杂的问题和系统,一方面借此机会让你们对派单有更好的理解和认识,另外一方面,也更欢迎你们对咱们提出更多的宝贵意见,帮助咱们进一步成长。

最后,滴滴技术祝你们中秋节快乐!

同时也欢迎你们关注滴滴技术公众号,咱们会及时发布最新的开源信息和技术资讯!

clipboard.png

相关文章
相关标签/搜索