1.概述
1.1.背景
随着公司车辆和订单的增长,对智能调度算法的需求越来越迫切
1.2.目的
该算法主要解决以下几个问题:
1、为了更好的服务乘客,订单被派单优先级的策略
2、模拟系统中司机空驶策略的生成
3、人流分布变化的机器学习方法
4、一个城市需要司机数目的计算方法
5、从统计数据中得到运营策略

2.地图乘客分布矩阵
拉取只读从库中的订单起点数据制作成热力图武汉附近的分布情况如下图:网约车智能派单方法

我们取 经纬度范围
113.991933,30.348468至114.668034,30.797204作为本文讨论的区间网约车智能派单方法

图中范围武汉南北距离为55公里网约车智能派单方法

东西为100公里
我们将其取geohash编码的第5级经纬度坐标间距为2.4公里
网约车智能派单方法
横纵距离除以间距2.4公里,可以将武汉划分为40(横格数)*20(纵格数)的方阵。
我们将某个时刻的乘客叫单人数依次填入到这个方阵中会得到一个矩阵,表示t1时刻乘客的分布情况:u(t1)

2.1.乘客分布矩阵的变化和派单策略
下图为订单上午九点时的分布情况:网约车智能派单方法

对比十点的情况
网约车智能派单方法

现设u(t)为t时刻乘客分布矩阵,A为t1时刻到t2时刻的变化矩阵,假设
t1时有甲乘客起始地点为B,目的地为C;乙乘客起始地点为D,目的地为E,他们均为t2时刻下车。我们比对甲乙两位乘客的方向向量 与 A向量的相似性:
网约车智能派单方法
将向量A以B点和 D点所在的单元格作为单位1做归一化,甲乙两个矩阵其他单元格补零。
以两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夹角余弦
       类似的,对于两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n),可以使用类似于夹角余弦的概念来衡量它们间的相似程度。
网约车智能派单方法
  即:
网约车智能派单方法
       夹角余弦取值范围为[-1,1]。夹角余弦越大表示两个向量的夹角越小,夹角余弦越小表示两向量的夹角越大。当两个向量的方向重合时夹角余弦取最大值1,当两个向量的方向完全相反夹角余弦取最小值-1。
计算夹角余弦之后进行排序,越相似的排前面。
该派单策略即运营策略
2.2.乘客分布矩阵状态转移计算方法
假设此时有订单,订单数据假设如下:
起点经度 114.31019358288886
起点纬度 30.52485032737620
终点经度 114.30009662895670
终点纬度 30.55324074168306
叫单时间 2018-05-02 14:20:22

我们是否该接这个单,或者说如何计算该单的价值期望:
1、计算终点所在geohash编码
2、计算到达终点所在时间
3、计算该终点所在区域(相同geohash编码)在该时间段转移到其他区域的概率
4、重复计算2、3步

该过程会形成一颗司机区域变化的树状结构:
网约车智能派单方法
树的深度还有宽度根据计算能力和实际精度要求来确定
其中树枝的形成原因是接单
如果树的深度很深结果会形成如下图:
网约车智能派单方法
图中每一个方块表示一个区域,连线表示订单。
然后计算每个订单的期望作为判据有以下几个考虑:
1、里程
2、金额
3、交通状况
平衡这几个考虑因素使得公司的利益最大化。
3.司机空驶策略
3.1.马尔可夫决策过程和Q-learning算法
一个马尔可夫决策过程由一个四元组构成M = (S, A, Psa, R) 
MDP 的动态过程如下:某个智能体(agent)的初始状态为s0,然后从 A 中挑选一个动作a0执行,执行后,agent 按Psa概率随机转移到了下一个s1状态,s1∈ Ps0a0。然后再执行一个动作a1,就转移到了s2,接下来再执行a2…,我们可以用下面的图表示状态转移的过程。
网约车智能派单方法
如果回报r是根据状态s和动作a得到的,则MDP还可以表示成下图:
网约车智能派单方法
作为司机就是要让自己的相同时间的收益最大
定义司机在每个格子的时候有几种移动方式对应几种action{东西南北}
定义一个表格Q-table纵坐标为时间、地点(所处哪个格子)即司机的状态 横坐标为动作
东 南 西 北
S1 奖励 奖励 奖励 奖励
S2 奖励 奖励 奖励 奖励
S3 奖励 奖励 奖励 奖励
中间的格子为附近格子某时刻的所有订单的平均每分钟能赚多少钱的期望
Q-learning的更新过程如下:

Initialize Q arbitrarily
Repeat (for each episode):
Initialize S
Repeat (for each step of episode):
根据当前Q和位置S,使用一种策略,得到动作A //这个策略可以是ε-greedy 等 做了动作A,司机到达新的位置S',并获得奖励R //奖励可以是1,50 或者-1000
Q(S,A) ← (1-α)Q(S,A) + α[R + γ*maxQ(S',a)] //在Q中更新S
S ← S' until S is terminal //直到一天的模拟结束
通过模拟迭代更新qtable,最终司机会向着能够接到优质订单的路径前进。

4.机器学习方法
4.1.乘客分布矩阵变化向量的求法

为了能够模拟乘客分布矩阵的变化情况,也就是知道从一个分布矩阵到另外一个分布矩阵的变化规律,现在采用机器学习方法求得矩阵变化向量。

假设图中有个九宫格对应一块地图,地图中的某个时刻的人实际上只和本单元格突然产生的订单需求和周围转移过来的人有关系。
如下图中光谷广场的人从周围向光谷中心流动:
网约车智能派单方法

网约车智能派单方法

建立一个前馈神经网络:

其中输入层有九个神经元,隐藏层九个神经元,输出层为中间层,通过反向传播算法就可以得到其中的权值向量,之后再次输入当前的乘客分布矩阵即可估算出未来的乘客分布矩阵。
4.2.用DQN解决Qtable太大难以索引的问题
因为之前在计算乘客分布矩阵状态转移的价值期望时使用的是历史订单数据,但是每天的情况不一样,所以此处采用一种方法来根据当前乘客分布和其他一些特征值计算未来的乘客分布。
4.3.如何估算当前的城市所需司机数量
当我们通过上述方法模拟城市运营情况之后可以不断增加系统内司机的数量,当司机的某种指标(一天的接单量)低于阈值的时候司机即饱和。