滴滴调度算法小结

什么是订单分配问题?

订单分配 即是在派单系统中将 乘客发出的订单 分配给 在线司机 的过程”。

就近原则

  实际上目前滴滴的派单算法最大的原则就是 “就近分配” (70%~80%的订单就是分配给了最近的司机),目前世界上其他的竞品公司(包括Uber),也均是基于这个原则分单的。 然而,在实际生活中仅仅考虑空间上的就近原则是不够的,会出现时序问题。时序问题可以用下面的例子说明:
  如果是有2个司机可以为1个订单提供服务,其如下图所示:
在这里插入图片描述
当订单发出时,B司机已经在线并空闲,但是A司机还没有出现(没有上线,或者还在送乘客),但再过1s,离得更近的A司机突然出现可被分单了,假设我们使用先到先得的贪心策略,那么B司机就会被分给这个订单,那就违背我们希望就近分单的目标了,所以看上去简单,但实际情况下,算法还需要变的更好一些,这个问题我们把它叫做派单中的时序问题,我们后面再来看怎么解决。

延迟集中分单

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

延迟集中分单的思想是:先让乘客和司机稍等一会,待收集了一段时间的订单和司机信息后,再集中分配。这样,有了相对较多、较密集的订单、司机后,派单策略即可找到更近更合理的派单方式了。

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

  由于用户的等待时间容忍度有限,往往短短的几秒钟即会使用户对平台丧失信心,从而取消订单。故实际上我们只累积了几秒钟的订单和司机信息进行集中分单,而这在大局上来说仍可近似看做时间维度上的贪婪策略。
  若想即时的获得最优派单结果,唯一的方法是利用对未来的预测,即进行基于供需预测的分单。这种想法说来玄妙,其实核心内容也很简单:如果我们预测出未来一个区域更有可能有更多的订单/司机,那么匹配的时候就让这个区域的司机/订单更多去等待匹配这同一个区域的订单/司机。

连环派单

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

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

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

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
最小权重调度算法(Minimum Weight Scheduling Algorithm)是一种用于作业调度的贪心算法,它的目的是尽可能地减少作业的平均等待时间。其基本思想是将作业按照它们的权重(也称作优先级)排序,然后依次将它们分配到可用的处理器上,直到所有作业都被处理完毕。 算法的具体步骤如下: 1. 对所有作业按照它们的权重进行排序,按照从小到大的顺序排列。 2. 初始化一个空的作业队列,并将第一个作业添加到队列中。 3. 依次将剩余的作业按照权重从小到大的顺序添加到作业队列中。 4. 对于每个处理器,从作业队列中选择一个作业,并将其分配给该处理器。 5. 计算每个作业的完成时间,并记录下每个作业的等待时间。 6. 计算所有作业的平均等待时间,并输出结果。 下面是一个简单的实现示例,使用 Python 语言实现: ```python def minimum_weight_scheduling(jobs, processors): jobs = sorted(jobs, key=lambda x: x.weight) queue = [] queue.append(jobs[0]) for job in jobs[1:]: queue.append(job) waiting_times = [] for processor in processors: job = queue.pop(0) completion_time = processor.process(job) waiting_times.append(completion_time - job.arrival_time - job.duration) average_waiting_time = sum(waiting_times) / len(jobs) return average_waiting_time ``` 其中,`jobs` 是一个作业列表,每个作业包含三个属性:到达时间 `arrival_time`、持续时间 `duration` 和权重 `weight`。`processors` 是一个处理器列表,每个处理器具有一个 `process` 方法,用于处理作业。 这个算法的时间复杂度是 $O(n\log n)$,其中 $n$ 是作业的数量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值