什么是订单分配问题?
订单分配 即是在派单系统中将 乘客发出的订单 分配给 在线司机 的过程”。
就近原则
实际上目前滴滴的派单算法最大的原则就是 “就近分配” (70%~80%的订单就是分配给了最近的司机),目前世界上其他的竞品公司(包括Uber),也均是基于这个原则分单的。 然而,在实际生活中仅仅考虑空间上的就近原则是不够的,会出现时序问题。时序问题可以用下面的例子说明:
如果是有2个司机可以为1个订单提供服务,其如下图所示:
当订单发出时,B司机已经在线并空闲,但是A司机还没有出现(没有上线,或者还在送乘客),但再过1s,离得更近的A司机突然出现可被分单了,假设我们使用先到先得的贪心策略,那么B司机就会被分给这个订单,那就违背我们希望就近分单的目标了,所以看上去简单,但实际情况下,算法还需要变的更好一些,这个问题我们把它叫做派单中的时序问题,我们后面再来看怎么解决。
延迟集中分单
派单策略中最为基础的部分,就是为了解决上一节所提到的时序问题。这个算法几乎是所有类似派单系统为了解决这个问题的最基础模型,在Uber叫做Batching Matching,滴滴内部也叫做“全局最优” 或者 “延迟集中分单”。
延迟集中分单的思想是:先让乘客和司机稍等一会,待收集了一段时间的订单和司机信息后,再集中分配。这样,有了相对较多、较密集的订单、司机后,派单策略即可找到更近更合理的派单方式了。
找寻司机和订单分配的全局最优是一个 二分图匹配问题 (bipartite graph matching) ,一边是乘客、一边是司机,可用运筹优化中各种解决Matching问题的方法进行求解。
由于用户的等待时间容忍度有限,往往短短的几秒钟即会使用户对平台丧失信心,从而取消订单。故实际上我们只累积了几秒钟的订单和司机信息进行集中分单,而这在大局上来说仍可近似看做时间维度上的贪婪策略。
若想即时的获得最优派单结果,唯一的方法是利用对未来的预测,即进行基于供需预测的分单。这种想法说来玄妙,其实核心内容也很简单:如果我们预测出未来一个区域更有可能有更多的订单/司机,那么匹配的时候就让这个区域的司机/订单更多去等待匹配这同一个区域的订单/司机。
连环派单
基于供需预测的分单有很大意义,但由于预测的不确定性,其实际效果很难得到保证。为此,我们使用了一种更有确定性的预测方式来进行派单,即 连环派单。
“连环派单,即将订单指派给 即将结束服务 的司机,条件为如果司机的终点与订单位置很相近”
与预测订单的分布相反,连环派单预测的是下一时刻空闲司机的所在位置。由于高峰期空闲司机多为司机完成订单后转换而来,预测司机的位置就变成了一个相对确定性的问题,即:监测司机到目的地的距离和时间。当服务中的司机距终点很近,且终点离乘客新产生的订单也很近时,便会命中连环派单逻辑。司机在结束上一单服务后,会立刻进入新订单的接单过程中,有效地压缩了订单的应答时间、以及司机的接单距离。