外卖配送是运筹优化算法重要应用领域,它的主要特色是并发高、延时低,为了解决这样的问题须要对业务进行深刻理解,设计定制化优化手段。原计划时机成熟的时候进行解读,因为属于以前团队的商业核心机密,计划暂时搁置。去年前同事发了一篇paper(A Two-Stage Fast Heuristic for Food Delivery Route Planning Problem),十分清晰明了。鉴于此本文再也不狗尾续貂,仅作翻译,一是方便后来者阅读,二也对以前的工做作一次回顾。算法
在外卖场景,用户在外卖平台点单以后,订单信息会推送至商家确认接单,以后进入履约环节。调度系统对订单进行指派和路径规划,外卖配送员根据订单指派完成取餐和送餐任务。编程
而在配送问题中,路径规划是基本且重要的一个环节,它直接决定骑手服务路线的长度和时间,从而对订单的准时率、客户满意度都产生影响。下图是配送中骑手服务的路径规划示意图,该骑手身上有5个订单,其路径规划结果为:取(4个)⟶
送(2个)⟶
取(1个)⟶
送(3个)。windows
目前,路径规划主要存在以下困难:并发
2.38×1015
种,想要在有限时间内求解是极困难的。学界与配送场景下的路径规划问题相关的研究主要集中于PDPTW问题(pickup and delivery problem with time-windows),它考虑多个骑手和多个客户,每一个客户的订单包含一个取点与一个送点,骑手按规定顺序访问各个节点完成订单的服务,从而达到某些目标函数(例如总行驶距离)的最优。求解PDPTW问题的算法包括:列生成算法(column generation)、分支切割(branch-and-cut)、分支切割订价(branch-and-cut-and-price)等精确计算算法,禁忌搜索(tabu search)、模拟退火(simulated annealing algorithm)、基于插入搜索的算法(insertion-based heuristic)、自适应大邻域搜索(adaptive large neighborhood search)、变深度搜索(variable-depth search algorithm)。因为在配送场景下,对算法时效性有极高的要求,上述算法均没法适用于配送场景的问题。在后文中,咱们将介绍路径规划的问题模型,以及提出的启发式算法(Two-Stage Fast Heuristic),同时给出了一些仿真结果。编程语言
背景中提到的配送场景下的路径规划问题能够被简化建模成单车辆PDPTW问题(single vehicle pickup and delivery problem with time-windows),即原PDPTW问题的单车辆简化(仅有一个骑手)。下图表示单车辆PDPTW问题研究中的一条典型路径。其中t_i
为每一个送点的预计送达时间(ETA,Estimated Time of Arrival),当订单产生时,t_i
即被告知给商家和客户。T_i
表示预估送达时间(ETR,Estimated Time of Route),由路径规划算法计算得出。d_i
为点i−1
到点i
的距离。函数
本文中咱们考虑最小化订单超时时间与路径长度,即目标函数为,该问题有两个约束:优化
TSFH(Two-Stage Fast Heuristic)主要包括两个阶段spa
⟶
采用贪婪插入策略与基于地理信息的加速策略⟶
两种邻域分别对“最超时”和“最不超时”订单进行调整贪婪插入初始化主要包括如下步骤:.net
下图为初始化中贪婪插入的一个例子,在插入第二个订单时,咱们有6种插入方案,根据目标函数最小原则,(A)为最优插入方案。翻译
当全部点都完成插入后,便获得一个可行解。
观察商家和客户的地理信息能够发现,商家之间可能距离很近(例如中心商业区域所含的商家可能服务半径5km之内的60%的客户),客户也是如此(多个客户可能位于同一个小区或楼宇)。所以咱们能够经过分层聚类的方法将取送点聚类为不一样的集群,经过对这些集群进行分析,咱们能够减小无效插入,提升贪婪插入初始化的速度。根据引理1,2能够获得加速策略以下:若节点j被分到组i,则最好的插入策略是将其插入组i,或是组i以后的组之间。
下面分别介绍聚类算法以及相关引理。
【聚类算法】 令D为聚类范围(例如D=100m),按照如下逻辑对各个节点进行聚类:
i
未被分类,则节点i
产生一个新组,并变成该组的中心点j
,若是节点j
没有被分类,且d_ij<D
,则j
被分到组i
j
被分到组k
,且j
不是中心点,若是d_ij<d_kj
,则将j
从新分至组i
【Lemma 1】将节点插入所在组以前的组: 若是节点j
被分至组i
,则将节点j
插入到组i
以前的任何组必定劣于将节点j
插入组i
Proof: 节点j
属于组i
,则将节点j
插入到组i
以前的任何组k
必定不如将节点j
直接插入组i
,由于路径长度变长了,但no delivery point benefits from shorter delays.
下图给出了一个例子,取点和送点被分红了三个组,假设蓝色组与橙色组的点已经完成插入,咱们考虑绿色组的节点的插入。从图中能够看到,将节点插入所在组以前的组(B)老是比插入本身所在的组(A)更差,由于骑手路径长度变长,客户处可能会出现更高的超时。
【Lemma 2】将节点插入所在组以后的组: 若是节点j
被分至组i
,则咱们总能够找到一个插入方案优于将节点j
插入到组i
以后的组k
Proof: 节点j
属于组i
,则将节点j
插入到组i
以后的组k
必定不如将节点j
插入组k
和组k+1
之间(若是k
是最后一个组,则插入到最后位置),由于路径长度变长了,但no delivery point benefits from shorter delays.
下图给出了一个例子,取点和送点被分红了三个组,假设橙色组与绿色组的点已经完成插入,咱们考虑蓝色组的节点的插入。从图中能够看到,将节点插入所在组以后的组之间(B)必定比插入到最后位置(A)更差,由于骑手路径长度变长,客户处可能会出现更高的超时。
在初始化结束后,局部搜索经过在初始解的邻域范围内进行搜索来提升解的质量。咱们的算法考虑两种类型的邻域:
注:每次局部搜索找到一个更好的解时,当前最优解即被替换。
本节给出一些仿真结果。首先咱们比较了带有加速策略初始化与不带加速策略初始化的结果,以验证初始化中加速策略的有效性。以后,咱们将TSFH产生的解与暴力算法获得的最优解进行比较,从而验证TSFH产生近似最优解的能力。最后,咱们将TSFH与目前最好的一些算法进行比较,验证TSFH求解该问题的有效性。
算例从实际路径规划问题中均匀采样获得,根据取送点的数量分为三类:“<10”, "10-20", ">20"。
算法的评价指标采用总分(Total Score)和平均时间(Average Time)。总分为超时时间与路径长度的和,平均时间为一个算例的平均运行时间。
运行环境为MacBook Pro with 2.2 GHz processors / 16 GB RAM in Mac-OS,编程语言为Java,IDE为Eclipse。
表一为带有加速策略初始化与不带加速策略初始化的比较结果。能够看出,加速策略有着明显的效果。例如"10-20"算例的平均运行时间从0.37降至0.21,减小了43.2%。同时,从总分能够看出,加速策略初始化的效果几乎没有受到影响,这证实加速策略不会以牺牲解的质量为代价,能够在短期内产生优良解。
问题规模较小时,该问题的最优解能够经过暴力搜索算法来获得。考虑n个取点和n个送点,不考虑容量约束的条件下,暴力搜索算法的复杂度为。这里咱们只提供“<10”算例的比较结果如表二。
能够看出,对于“<10”的算例,TSFH仅需暴力算法运行时间的0.21%,便可达到几乎同样的效果。另外,“10-20”与“>20”算例的运行时间也均在毫秒级。在现实中,大部分状况均可被“<10”和“10-20”的算例覆盖,所以这代表TSFH足以在毫秒数量级内解决配送中的路径规划问题。
TSFH与variable-depth search (VDS)、simulated annealing (SA)的比较结果如表三。能够看出TSFH在总分和平均时间两方面都优于VDS和SA。在“<10”算例中,TSFH达到了近似最优解,仅比最优解高0.7%,而VDS和SA分别高了29.4%和35.7%。另外,TSFH求解“<10”算例的平均时间为0.41ms,而VDS和SA分别为3.51ms和25.64ms。配送环境中的路径规划对于算法的运行速度有着极高的要求,TSFH能够在1ms内完成“<10”算例的求解,而VDS和SA的运行时间均没法接受。所以,TSFH是比VDS和SA更好更有效的算法,也更适用于配送环境下的路径规划问题求解。
本篇文章将外卖配送环境下的路径规划问题建模为单车辆PDPTW问题。与传统求解单车辆PDPTW问题的算法不一样,本篇提出了一种两阶段快速启发式算法(TSFH)。在第一阶段,经过贪婪初始化获得一个可行的优良解。根据顾客和商户的地理位置信息,设计了一种加速策略,在节点调整时避免了无效插入。在第二阶段,经过在当前解的两种邻域内进行搜索,解的质量获得了进一步提高。
仿真结果代表,TSFH与暴力搜索算法、VDS、SA相比,在解的质量和运行时间方面均有着极大的优点。同时,TSFH具有在毫秒数量级内产生近似最优解的能力,适用于配送场景下路径规划问题的求解。