本文介绍了滴滴派单算法的发展与面临的挑战,详细描述了派单问题的复杂性,以及滴滴如何分析和建模这个问题。文章还介绍了派单算法中的一些重要策略,包括批量匹配、基于供需预测的分单和连环派单等。最后总结了派单系统的挑战和未来的发展方向。
批量匹配策略是解决派单问题中时序问题的基础方法,通过收集一段时间的订单和司机信息,进行集中分配,寻找全局最优解。
连环派单策略通过预测司机的位置,将订单指派给即将结束服务的司机,有效压缩订单的应答时间和司机的接单距离。
派单系统面临多方面的挑战,包括优化目标、跨品类运力分配、长期短期目标平衡等。未来发展方向包括利用深度学习和强化学习等方法进一步提高算法性能,以及探索新的应用场景和重新定义问题。
来源: 滴滴技术(didi_tech)丨文:王犇 刘春阳 徐哲
今日头条丨一点资讯丨腾讯丨搜狐丨网易丨凤凰丨阿里UC大鱼丨新浪微博丨新浪看点丨百度百家丨博客中国丨趣头条丨腾讯云·云+社区
导读:说到滴滴的派单算法,大家可能感觉到既神秘又好奇,从出租车扬召到司机在滴滴平台抢单最后到平台派单,大家今天的出行体验已经发生了翻天覆地的变化,面对着每天数千万的呼叫,滴滴的派单算法一直在持续努力让更多人打到车,本篇文章会着重介绍我们是如何分析和建模这个问题,并且这其中面临了怎样的算法挑战,以及介绍一些我们常用的派单算法,这些算法能够让我们不断的提升用户的打车确定性。
1.
为什么我们需要更好的派单算法
![](http://mmbiz.qpic.cn/mmbiz_png/jE5bOw22iaBsljlfO1AYh3BHWjNlasjdtJWAdwFxudUqO5vxokeLbS4mV9meEho837iaiaQWSUBGfI79ts16BO7ag/640?wx_fmt=png)
说到滴滴的派单算法,大家可能感觉到既神秘又好奇,从扬召到抢单到派单,我们又是如何演进到今天大家的打车体验的呢,我们首先来看一看,好的派单算法为什么是出行行业不可或缺的能力?
回想几年前,当我们还没有滴滴的时候,只能在寒风或者酷暑中等待可能有、可能没有的扬招出租车,到后来可以从滴滴上呼叫一辆出租车,乘客可以在室内相对舒适的等待车辆的到达,从线上到线下,乘客的确定性得到第一次的提升,然而这还不够,抢单的模式注定我们的应答率天花板不会太高,在15年,滴滴上线快车业务,我们从抢单演进到了派单模式,乘客的应答率有了20个点以上的提升,很多时候能够全天能够高达90+(高峰&局部供需紧张应答率会相对吃紧),乘客确定性再一次得到大幅的提升,由此可见,派单模式为滴滴创造了巨大用户价值。
再看近年来不断兴起的O2O业务,从国内外的网约车公司,包括我们的友商Uber、Lyft都基于派单的产品形态进行司机和乘客之间的交易撮合,Uber上市的时候把派单引擎也作为核心技术能力放在了招股书中;再看我们的国内的外卖平台,核心派单系统的优劣也决定了整个平台的交易效率(单均配送成本)和用户体验(配送时长);最后,整个大物流行业近年来也不断在进行线上化的改造,如何撮合货物和司机,以及更好的拼单能力也是整个交易环节的关键和商业模式是否成立的前提。从运人到运物,派单引擎目前越来越多的被应用在现实的商业和生活中。
2.
派单问题初探
![](http://mmbiz.qpic.cn/mmbiz_png/jE5bOw22iaBsljlfO1AYh3BHWjNlasjdtJWAdwFxudUqO5vxokeLbS4mV9meEho837iaiaQWSUBGfI79ts16BO7ag/640?wx_fmt=png)
言归正传,这里我们也来看一下,滴滴网约车平台到底是怎么派单的。首先,我们来看下我们面对的是什么样的问题?
“订单分配 即是在派单系统中将 乘客发出的订单 分配给 在线司机 的过程”
这是一个看似简单的,但实际上非常复杂的问题。说到这,可能有很多人就会问,能否就把 我的订单分配给离我最近的司机就好了?
的确啊,实际上目前滴滴的派单算法最大的原则就是 “就近分配” (70%~80%的订单就是分配给了最近的司机),据我所知,目前世界上其他的竞品公司(包括Uber),也均是基于这个原则分单的。
我们进一步来看这个问题,如果我们只按照就近分配,先到先得的贪心策略,是不是能最好的满足平台所有乘客和司机的诉求呢?答案是否定的,原因就在于,如果我们只基于当前时刻和当前局部的订单来进行决策,忽视了未来新的订单&司机的变化,还忽视了和你相邻的其他区域甚至整个城市的需求(注:在时序上来看,新的司机&订单的出现会导致,贪心策略反而违背了就近分配的目标)。这就是为什么这个问题依然是非常复杂的原因。
这里稍微有点抽象了,不过没关系,我们再来一步一步的拆解一下订单分配的问题,让大家有个更好的理解:
简单看,在我们的平台上,每一个时刻,都有N个订单在被乘客创建,同时有M个司机可以被我们用来进行分配,我们强大的平台能够为派单算法给出司机的实时的地理位置坐标,以及所有订单的起终点位置,并且告诉我们每一个司机接到订单的实时导航距离。
▍如果是1个订单、1个司机
看上去似乎就非常简单了,我们直接把这个订单指派给这个司机就好了嘛。
“那么为什么有时候附近有辆空车却不能指派给你呢?”
实际线上的系统会比这里稍微复杂一点,原因一方面有可能是司机正好网络出现故障,或者正在和客服沟通等等导致司机无法听单,另一方面的原因是并不是所有的车都能够符合服务你订单的要求,最基本的策略其实是人工设定的规则过滤。举几个最基础的例子:
必须澄清的一点是这里的规则并不会造成分单时不公平的效果,而完全是为了业务能正常运行而设立的,这些策略承担着保证业务正确性的重要职责。
▍如果是1个订单和2个司机
假设这两个司机都能够分配给这个订单,那么我们来看系统应该是如何分配的。
首先第一种情况是,同一时刻下,这两个司机和订单的距离都完全一样的情况下,系统应该如何分配?
刚才也说到,我们平台订单分配最大的原则是就近分配,当距离完全一样的情况下,当前我们系统上会主要考虑司机的服务分的优劣,服务分较高的司机会获取到这个订单(注:服务分对分单的影响,简单的理解可以换算为多少分可以换成多少米距离的优势,这块不是今天的重点就不展开介绍),再说明一下,系统用到的是地图的导航距离,而非人直观看到的直线距离,有时候差一个路口就会因为需要掉头导致距离差异很大;并且如果司机的定位出现问题,也会出现分单过远的情况。
那么我们来看第二种情况,如果A司机离的近,B司机离的远,系统怎么派?
这就简单了,根据就近分配的原则,我们会把A司机分配给这个订单。嘿嘿~~,假设我们再把问题设置的更加实际一点,当订单发出时,B司机已经在线并空闲,但是A司机还没有出现(没有上线,或者还在送乘客),但再过1s,离得更近的A司机突然出现可被分单了,假设我们使用先到先得的贪心策略,那么B司机就会被分给这个订单,那就违背我们希望就近分单的目标了:(。所以看上去简单,但实际情况下,算法还需要变的更好一些,这个问题我们把它叫做派单中的时序问题,我们后面再来看怎么解决。
▍如果有N个乘客、M个司机
最后我们来考虑最复杂的多对多的情况,这也是线上系统每天高峰期都需要面对的挑战,我们一般把这种情况会形式化为一个二部图的匹配问题,在运筹领域也叫做matching的问题,如图所示:
我们再把这个问题具象一点,假设这个时候我们有20个乘客,有20个司机,这些乘客都可以被这20个司机中的一个接驾,我们的系统需要把这20个乘客都分配出去,并且让大家的总体接驾的时长最短。听上去是不是有点复杂?我们套用下组合数学的知识,这其中可能的解法存在20的阶乘那么多,20的阶乘是什么概念呢?20*19*18*…*1= 2432902008176640000,这个数巨大无比,想要完全的暴力搜索是绝对不可能的。这里需要更聪明的办法。
▍如果有N个乘客、M个司机,一会再来几个乘客和司机?
这就是派单问题最大的挑战,我们不仅仅需要当前这个时刻的最优,我们要考虑未来一段时间整体的最优,新来的司机和乘客会在整个分配的网络中实时插入新的节点,如何更好的进行分配也就发生了新的变化,所以如何考虑时序对我们非常重要,这个问题在业内也被称为Dynamic VRP问题,这个Dynamic也就是随时间时序变化的意思,这也就是为什么,滴滴的派单问题远复杂于物流行业的相对静态的货物和路线的规划问题。假设我们知道了未来供需的完全真实的变化,仿真告诉我们,我们的系统有可能可以利用同样的运力完成1.2~1.5倍的需求量,这也是派单算法的同学持续为之努力的方向。
想起前段时间的吐槽大会,大家提到文嵩曾说我们的派单问题比alpha go还要难,其实这两个问题还确实有点相似,都是在超大的搜索空间中找到一个近似最优的解,而alpha go则会在一个更加明确的游戏规则和环境中进行求解,它的难点在于博弈,而我们的派单问题难点在于未来供需不确定性&用户行为的不确定性。近年来在学界,已经有不少尝试在利用类似alpha go的技术进行VRP&TSP等方向的探索,强化学习结合运筹理论是未来运筹界非常前沿的方向之一(非技术同学可以跳过此处:))
3.
派单算法简介
![](http://mmbiz.qpic.cn/mmbiz_png/jE5bOw22iaBsljlfO1AYh3BHWjNlasjdtJWAdwFxudUqO5vxokeLbS4mV9meEho837iaiaQWSUBGfI79ts16BO7ag/640?wx_fmt=png)
上