2. 中国科学院大学, 北京 100049
2. University of Chinese Academy of Sciences, Beijing 100049, China
车辆路径问题是指在一个存在供求关系的系统中, 在一定的约束条件下, 合理安排车辆的行车路线和出行时间, 把客户需求的货物从配送中心送达客户, 并使目标函数取得最优化[1]. 随着研究的深入和实际应用场景的需求, 增加了对客户偏好服务时间的约束, 即个性化地限定了客户被服务时间的范围, 延伸出了带时间窗的车辆路径问题(VRPTW), 在实际生产应用中有广泛应用, 比如O2O外卖配送、冷链物流、生产线上的工作调度、网络路由策略等.
VRPTW是NP-hard的组合优化问题[2], 计算复杂度高, 难以有效率地使用精确算法求得最优解, 目前的研究大多集中在如何设计高质量的启发式算法, 求取近似解以换取计算效率的提高, 如蚁群算法[3]、粒子群算法[4]、遗传算法[5]、模拟退火等群体智能算法. 目前算法研究主要集中于两方面, 一是提升VRPTW的求解精度, 二是提升计算速度.
现阶段VRPTW求解存在的问题是: (1)算法过早收敛, 易陷入局部最优解; (2)相较于集中式节点分布, 算法对随机分布的节点处理精度差; (3)算法能处理的节点数少, 一般为100节点之内; (4)面对大规模问题出现单机处理效率瓶颈, 忽视使用分布式平台进行并行计算[6]. 针对上述问题, 本文对蚁群算法进行改进, 基于Spark平台进行编程求解VRPTW, 在Solomon benchmark和Gehring & Homberger benchmark上进行实验, 为快速有效地求解大规模VRPTW提供了一种新思路.
1 传统蚁群算法求解VRPTW 1.1 VRPTW多目标0-1规划模型VRPTW可被定义为: 某物流配送网络中, 记
由上述定义可知, VRPTW是一个离散组合优化问题, 我们将其抽象为多目标0-1规划问题[6], 其数学模型具体如下:
决策变量:
${x_{ijk}} = \left\{ \begin{array}{l} 1,\;\;{\text{车辆}}{{k}}{\text{选择路径}}\;({{i}},{{j}})\\ 0,\;\;{\text{其它}} \end{array} \right.$ | (1) |
目标函数:
$Z = \min \left({\rho _1}\sum\limits_{k = 1}^m {\sum\limits_{j = 1}^n {\sum\limits_{i = 1}^n {{l_{ij}}{x_{ijk}} + {\rho _2}\sum\limits_{k = 1}^m {\sum\limits_{j = 1}^n {{x_{0jk}}} } } } } \right)$ | (2) |
约束条件:
$ \sum\limits_{j = 1}^n {{x_{0jk}} = 1}\;\;{\text{且}}\;\; \sum\limits_{i = 1}^n {{x_{i0k}} = 1} ,\forall k $ | (3) |
$ \sum\limits_{k = 1}^m {\sum\limits_{j = 0}^n {{x_{ijk}}} } = 1,\forall i $ | (4) |
$\sum\limits_{i = 0}^n {\sum\limits_{j = 0 \wedge j \ne i}^n {{D_i}{x_{ijk}}} } \leqslant Q,\forall k$ | (5) |
$S{T_i} < {t_i} < E{T_i},\forall i$ | (6) |
$ {x_{ijk}} \in \{ 0,1\} ,\;\forall i,j,k $ | (7) |
式(2)中
蚁群算法启发于真实蚂蚁自组织的觅食行为[3], 对VRPTW这种难解的离散优化问题有优秀的求解能力, 得益于正负反馈机制的协同作用和其并行性. 核心思想是: 单只蚂蚁在其走过的路径上释放信息素, 根据信息素浓度和启发式信息决策转移路径; 蚂蚁之间通过信息素进行通信, 单次迭代后信息素进行挥发且增加优秀路径上的信息素浓度, 使得大概率选择目前优秀解的同时扩展搜索范围, 通过多只蚂蚁间相互协作多次迭代寻优.
蚁群算法是构建解和更新信息素的相互作用[7], 具体如下:
(1)构建解: 通过计算状态转移概率逐步构建完整解后, 对解进行评估. 状态转移概率公式见式(8):
$ {p_{ij}} = \left\{ \begin{aligned} & \dfrac{{\tau _{ij}^\alpha \eta _{ij}^\beta }}{{\displaystyle\sum\limits_{j \in allowe{d_i}} {\tau _{ij}^\alpha \eta _{ij}^\beta } }},\;{\rm{if}}\;\;j \in allowe{d_i}\\ \;\; & \;\;\;\;\;\;\;\;\; 0,\;\;\;\;\;\;\;\;\;{\text{否则}} \end{aligned} \right. $ | (8) |
其中,
(2)更新信息素: 一次迭代后, 根据解评估结果更新信息素浓度, 之后继续迭代寻优. 信息素更新包括追溯增加和挥发减少两种, 具体见式(9):
$\left\{ \begin{gathered} {\tau _{ij}}(t + 1) = \rho {\tau _{ij}}(t) + \vartriangle {\tau _{ij}}(t,t + 1) \\ \vartriangle {\tau _{ij}}(t,t + 1) = \sum\limits_{k = 1}^m {\vartriangle \tau _{ij}^k(t,t + 1)} \\ \end{gathered} \right.$ | (9) |
其中, 蚂蚁
传统蚁群求解VRPTW仍存在引言中提到的4个共性问题, 为了避免陷入局部最优, 提升各类点分布和大数据下的求解精度和速度, 下面提出基于Spark平台的改进蚁群算法求解VRPTW.
2 基于Spark的改进蚁群算法求解VRPTW 2.1 算法思路本文采用基于Spark的改进蚁群算法求解带时间窗车辆路径问题, 该算法从算法层和实现层进行改进, 在算法层面, 通过改进状态转移规则[8]、加入轮盘赌选择机制、结合k-opt邻域搜索[9]进行路径构建优化, 改进最大最小蚁群中的信息素更新策略, 在实现层面, 用Spark计算平台对改进蚁群算法并行实现, 采用Spark提供的API对蚁群弹性分布式数据集(Resilient Distributed Dataset, RDD)进行操作, 实现蚁群并行构建解的过程.
2.2 路径构建优化蚁群算法是从最初的空解开始, 逐步添加解成分直到构建完整解, 只能生成数量有限的解, 邻域搜索最初依赖一个好的初始解, 不断通过局部调整尝试改进当前解. 本文采用蚁群算法和邻域搜索相结合的方式进行路径构建, 通过状态转移规则和轮盘赌选择机制构建初始解后, 使用邻域搜索进行局部优化获得高质量解.
针对VRPTW问题, 由于增加了时间窗约束, 因此状态转移规则除了以信息素浓度高、路径长度小为优先选择原则外, 还要在满足车载限制和时间窗的前提下, 以等候时间短、时间窗紧为优先选择原则, 则蚂蚁由节点
$ {p_{ij}} = \left\{ \begin{aligned} & \dfrac{{\tau _{ij}^\alpha \eta _{ij}^\beta }}{{\sum\limits_{j \in allowe{d_i}} {\tau _{ij}^\alpha \eta _{ij}^\beta } }}*\dfrac{{1/(|{t_{ij}} - S{T_j}| + |{t_{ij}} - E{T_j}|)}}{{\sum\limits_{j \in allowe{d_i}} {1/(|{t_{ij}} - S{T_j}| + |{t_{ij}} - E{T_j}|)} }},\\ & \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;{\rm{if}}\;j \in allowe{d_i}\\ & \;0,\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;{\text{其它}} \end{aligned} \right. $ | (10) |
记
在式(10)中参数
若每次迭代均按照状态转移规则
因此每只蚂蚁的搜索过程是从候选节点中依据改进的状态转移规则并采用轮盘赌选择机制选择下一个待服务的节点, 逐步添加解成分直至构成完整初始解, 相较于传统蚁群算法的初始解构建过程该方法可以得到更合理的初始解, 状态转移规则改进后使得减少配送过程中车辆的等待时间并能根据顾客的具体时间需求调配配送方案, 轮盘赌选择机制增强了初始解选择的随机性, 使得各节点均有概率被选中且被选择的可能性与其状态转移概率成正比, 能保持发现新路径的能力, 避免算法陷入局部最优.
获得完整初始解后, 通常用k-opt(k=2, 3)局部搜索策略对当前解邻域进行局部调整优化, 核心思想是任意选取
2.3 信息素更新优化
通过上述路径构建方法, 每只蚂蚁已经可以得到VRPTW问题的一个较优可行解, 但是要想获得精度高的解, 还需要群体进行分布式学习的过程, 蚂蚁之间通过每轮迭代后的信息素更新来交互协作, 其中信息素初始化、蒸发策略、更新策略都会影响算法寻优能力[12].
本文选择最大最小蚁群算法(MMAS)中的信息素更新策略, 强调对最优路径区域的搜索, 每轮迭代后只选择一只构建出最优路径的蚂蚁释放信息素, 最优路径分为迭代最优
信息素蒸发策略使得所有路径上的信息素均随时间而衰减,避免信息素在某些边上无限积累或者快速减少[14]. 传统蚁群算法中的信息素蒸发因子
$ \rho = \left\{ {\begin{array}{*{20}{l}} {0.9,} & {{\rho _{\max }}}\\ {0.95 * \rho ,} & {{\text{停滞}}}\\ {0.5,} & {{\rho _{\min }}} \end{array}} \right. $ | (11) |
通过信息素择优和衰减策略可以确定一轮迭代后每条路径上的信息素浓度
$ \left\{ \begin{aligned} &{\tau _{\max }} = 1/(1 - \rho ){C^{\rm{best}}} \\ &{\tau _{\min }} = {\tau _{\max }}(1 - \sqrt[n]{{0.05}})/(n/2 - 1) \\ \end{aligned} \right. $ | (12) |
信息素初值
目前VRPTW问题的许多实际应用面对爆炸式的数据增长和实时性求解的要求, 出现单机求解的效率瓶颈, 而蚁群算法是一个分布式学习的过程[15], 有内在的并行性, 每次迭代中多只蚂蚁独立的根据规则同时同地的构建可行解, 因此本文将基于Spark分布式平台来实现该算法.
Spark是一个快速且通用的集群计算平台, 扩充了Map-Reduce计算模型, 与Hadoop不同的是多个任务之间数据通信不需要借助硬盘而是通过内存, 减少了IO时间, 提高了程序的执行效率[16]. Spark的核心概念是RDD, RDD的一大特性是分布式存储, 每个RDD可以在不同工作节点存储并计算,另一大特性是延迟计算, 一个完整的RDD运行任务被分为Transformation和Action两部分[17], Transformation创建RDD, 同时提供map、filter、join等大量操作方法生成新的RDD, Action通过执行count、reduce、collect等方法真正执行数据的计算部分.
本文将蚂蚁封装为Ant类, 可行路线的搜索过程实现在Ant类的search()方法中, 实例化
2.5 算法描述
基于Spark的改进蚁群算法对VRPTW的求解流程如图3所示.
具体算法步骤如算法1.
算法1. 基于Spark的改进蚁群算法
(1) 读入算例文件, 初始化车辆数m、车辆容量load, 构造地图(横坐标x、纵坐标y、需求demand、最早开始时间ready、最晚结束时间due、服务时间service_time), 并计算地图上各节点间距离;
(2) 采用最近邻贪心算法获得初始可行解和初始路径长度
(3) 实例化参数类, 设置α, β, ρ, τ0等参数, 基于初始路径长度设置信息素初值τ0τmax=1/C0, 生成全局参数;
(4) 将蚂蚁封装为Ant类, 根据蚂蚁数目实例化数个Ant对象生成蚁群ants, 通过ant.set_parameter方法设置每只蚂蚁的参数, 利用Spark的parallelize(ants)方法将蚁群转换为分布式的RDD;
(5) 在每轮迭代中通过Spark中的map()方法实现n只蚂蚁的并行search()过程, 每只蚂蚁search()方法如下:
① 初始化当前路径road, 加入原点, 设置当前时间current_time=0, 车辆剩余负载remaind_load=load;
② 构造候选节点集, 满足负载、时间窗要求;
③ 从候选节点中依据状态转移规则(10)并采用轮盘赌选择下一个需要服务的节点next并加入当前路径中;
④ 若next节点为空, 将路径加入路径集中, 新派遣一辆车, 置current_time=0, remaind_load=load;
⑤ 判断是否还有未服务的点, 若存在则返回步骤(1), 否则结束
搜索.
(6) 每轮迭代结束后通过Spark中的collect()方法收集蚁群计算结果, 对每只蚂蚁搜索得到的可行解进行排序, 根据图1对迭代最优解进行k-opt局部调整优化;
(7) 得到迭代最优解后通过ant.set_parameter方法统一更新参数, 各路径信息素浓度更新公式参考式(9)、(11)、(12), 采用TIbest和TGbest轮流进行更新、自适应信息素蒸发策略且限制信息素范围为[τmin, τmax];
(8) 判断迭代是否终止, 迭代终止输出全局最优解, 否则返回步骤(4)继续并行化求解.
3 实验设计及结果分析为测试基于Spark的改进蚁群算法对VRPTW的求解效果, 本文在物理机上利用Virtual Box构建3台虚拟机搭建Spark集群, 并分别在单台虚拟机和Spark集群上进行实验.
3.1 实验环境及算例说明实验环境如下:
(1) 单机运行环境
操作系统: Ubuntu 16.04.
硬件环境: Virtual Box虚拟机.
Intel Core i7.
2 GB内存.
(2) Spark集群运行环境
操作系统: Ubuntu 16.04.
硬件环境: Virtual Box虚拟机.
Intel Core i7.
2 GB内存.
部署方式: Standalone模式.
集群规模: 1台Master, 2台Slave.
实验采用Solomon benchmark和Gehring & Homberger benchmark两个国际通用基准算例库中的数据, 数据集按照影响VRPTW求解的地理数据分布、客户节点数、时间窗松紧程度、车辆载重上限4个因素进行分类, Solomon数据集规模包括25、50、100节点数, 标号为
为直观表达蚁群算法求解VRPTW的行为, 选取Solomon-r101的前25节点进行求解并给出信息素矩阵的可视化表达, 信息素含量被转化成灰度值, 颜色越暗的方格所对应的信息素值越高, 在第0、10、100次迭代之后的实验效果如图4.
由图4可以看出, 主对角线的单元格始终为白色, 表示这些单元格的信息素被初始化为0并且永不更新, 其余单元格初始为黑色表示
为验证本算法的改进效果, 分别将不同信息素更新策略、不同邻域搜索方法作为控制变量进行实验. 选取Solomon-c101和Gehring & Homberger-c121作为实验数据, 分别采用信息素全局更新和交替更新的求解收敛过程如 图5, 选取Gehring & Homberger-rc121作为实验数据, 分别采用2-opt、3-opt、k-opt这3种邻域搜索的求解收敛过程如图6.
由图5可以看出, 对100节点数据, 信息素更新方式对求解过程无明显影响, 而对200节点数据, 采用全局信息素更新方式使得求解陷入局部最优解而过早收敛, 采用信息素交替更新方式能在执行结束后得到更高质量的解. 由图6可以看出, 使用k-opt进行局部搜索优化比2-opt和3-opt得到的解的精度高. 综上, 改进蚁群算法求解较大规模VRPTW时在迭代初期收敛速度较快, 在迭代中后期能保持全局搜索能力使求解持续收敛, 最终在期望的时间内收敛于一个精度较好的近似解.
3.2.3 求解精度比较实验
为验证本算法的求解精度, 选取Solomon节点数为100的各类数据和Gehring & Homberger benchmark节点数为200及400的大规模各类数据进行测试, 参数设置为:
由表1可以看出, 对100以内小规模问题求解的精度基本可达最优解; 对混合分布的RC类问题求解精度有明显提升; 对随机分布的R类问题误差率仍较高, 尤其是对车辆载重小且最大可服务时间短的R1类问题精度更差, 原因是该类问题节点的随机分布增大了路径构造的难度, 各子路线可能包含的节点数差异大; 对200、400节点的大规模问题在计算速度提升的前提下精确度在可接受的误差范围内.
3.2.4 求解速度比较实验
为比较单机求解和基于Spark平台并行求解的求解效率, 选取客户数为25、50、100、200以及400的Solomon-r101、Gehring & Homberge-R1_2_1、Gehring & Homberge-R1_4_1作为实验数据, 基于相同参数和迭代轮数进行实验, 实验结果如 图7.
从图7可以看出, 当问题规模较小时, 由于Spark内部的通信消耗, 基于Spark的并行蚁群算法的求解效率较单机蚁群算法没有显著的提升, 而当问题规模逐步增大时, 基于Spark的并行蚁群算法的求解时间要显著少于单机算法的求解时间, 并行算法的加速比逐步增加, 当客户数为400时, 并行算法的加速比为1.95.
4 总结与展望本文设计了一种基于Spark的改进蚁群算法求解带时间窗的车辆路径问题, 根据改进的状态转移规则和轮盘赌选择机制构建初始解, 结合k-opt邻域搜索进行局部搜索优化, 采用全局最优解和局部最优解交替更新策略、自适应信息素蒸发策略改进最大最小蚁群算法中的信息素更新策略, 借助Spark计算平台, 将蚁群封装为弹性分布式数据集, 实现蚂蚁的并行搜索.
实验结果表明本算法对100以内小规模问题求解的精度基本可达最优解, 对混合分布的RC类问题求解精度有提升, 对200、400节点的大规模问题求解效率有明显提升. 因此把蚁群算法这样的启发式算法和邻域搜索相结合是解决优化问题的有效途径, 另外利用Spark分布式平台处理蚁群算法中耗时的迭代过程可以有效降低计算时间.
本文试图对C、R、RC类VRPTW问题同时取得较好的优化效果, 但对R类分布的节点求解精度还不理想, 今后可结合其它群体智能算法或者根据随机分布类问题的特点进行合适的参数调整对R类VRPTW问题进行进一步优化求解. 另外本文尚未对600、800、1000等更大规模节点进行实验, 今后可以通过改进算法、充分利用分布式平台、提升硬件环境来解决更复杂的大规模求解问题.
[1] |
郎茂祥. 配送车辆优化调度模型与算法. 北京: 电子工业出版社, 2009.
|
[2] |
Solomon MM. Algorithms for the vehicle routing and scheduling problems with time window constraints. Operations Research, 1987, 35(2): 254-265. DOI:10.1287/opre.35.2.254 |
[3] |
Dorigo M, Maniezzo V, Colorni A. Ant system: Optimization by a colony of cooperating agents. IEEE Transactions on Systems, Man, and Cybernetics, Part B, 1996, 26(1): 29-41. |
[4] |
Jin NB, Rahmat-Samii Y. Particle swarm optimization for antenna designs in engineering electromagnetics. Journal of Artificial Evolution and Applications, 2008, 9. |
[5] |
Goldberg DE. Genetic algorithms in search, optimization, and machine learning. Upper Saddle River, New Jersey: Addison-Wesley, 1989.
|
[6] |
陈迎欣. 基于改进蚁群算法的车辆路径优化问题研究. 计算机应用研究, 2012, 29(6): 2031-2034. DOI:10.3969/j.issn.1001-3695.2012.06.007 |
[7] |
李琳, 刘士新, 唐加福. 改进的蚁群算法求解带时间窗的车辆路径问题. 控制与决策, 2010, 25(9): 1379-1383. |
[8] |
董攀. 带时间窗车辆路径问题的蚁群算法改进[硕士学位论文]. 长沙: 长沙理工大学, 2014.
|
[9] |
Helsgaun K. An effective implementation of the Lin–Kernighan traveling salesman heuristic. European Journal of Operational Research, 2000, 126(1): 106-130. DOI:10.1016/S0377-2217(99)00284-2 |
[10] |
崔文. 大规模多配送中心车辆路径问题研究[硕士学位论文]. 济南: 山东大学, 2012.
|
[11] |
吴越钟. 改进的Lin-Kernighan局部搜索算法和杂交算法在旅行商问题中的应用[硕士学位论文]. 合肥: 中国科学技术大学, 2016.
|
[12] |
葛斌. 求解车辆路径问题的蚁群优化算法研究及应用[博士学位论文]. 合肥: 合肥工业大学, 2016.
|
[13] |
丁秋雷. 带有时间窗的车辆路径问题的混合蚁群算法研究[硕士学位论文]. 大连: 大连理工大学, 2006.
|
[14] |
王颖, 谢剑英. 一种自适应蚁群算法及其仿真研究. 系统仿真学报, 2002, 14(1): 31-33. DOI:10.3969/j.issn.1004-731X.2002.01.010 |
[15] |
Nalepa J, Czech ZJ. A parallel memetic algorithm to solve the vehicle routing problem with time windows. arXiv: 1402.6942, 2014.
|
[16] |
郭宝恩. 基于Spark的蚁群算法在物流配送路径优化问题中的应用研究. 信息与电脑(理论版), 2018(3): 50-52. |
[17] |
王诏远, 王宏杰, 邢焕来, 等. 基于Spark的蚁群优化算法. 计算机应用, 2015, 35(10): 2777-2780, 2797. |
[18] |
金淳, 张雨, 王聪. 带时间窗车辆路径问题的分布式多agent蚁群算法. 计算机应用研究, 2018, 35(3): 666-670. |