本发明涉及spfa算法、维诺图、节约路径算法、基于参考点的相邻插入路径算法等相关领域,是一种考虑二次配送和平衡用时的多车型车辆路径规划方法。
背景技术:
现代物流作为“第三个利润源泉”,逐渐成为国民经济实现稳定高起点发展的“源头活水”。原有的物流背景下,配送员大多依靠自身经验对客户点的配送顺序进行分配。如今,在物流配送中心信息化的加持下,算法的配送路线优化大大提高了物流配送效率。然而,理论算法对物流配送的优化仍然潜力巨大。在实际情况下,当路线包含的客户点均离配送中心较近,可能会造成“配送员完成配送任务并回到配送中心后,其实际工作时间偏少”的情况,若配送员就此下班,会造成时间利用不充分,对物流公司是一种损失,对此可安排配送员再次出发进行当日的二次配送任务。不同配送员间工作时长的均衡性,代表了工作量分配的合理性、公平性,也是重要的考虑要素。
国内外针对车辆路径问题,最早是由dantzig等于1959年提出概念并用于解决从大型码头向各服务站运输汽油的路径规划问题。之后vrp问题的深度愈发被挖掘,以vrp为基础的衍生问题及其解决方案逐渐被提出。azinabila等针对多次使用车辆(multipleuseofvehicles)的vrp问题,通过收入、需求和时间窗口为客户定义路线,并引入了一种分支定价方法来解决这个问题。zhangzizhen等为了解决带有路径平衡的vrp问题(vrprb),开发了一种多目标模因算法(mma),它将特定于问题的局部搜索过程集成到了一个多目标进化算法中。葛显龙等采用量子比特位设计染色体结构,设计了量子遗传算法用于解决多车型vrp问题。
vrp是np-hard问题,意味着当问题达到一定规模时很难精确求解。精确算法在配送规模稍大时便无法在现有处理器的计算速度下遍历所有路线的组合。简单启发式方法如里程节约法和最近插入法计算速度快,但同样只适合小型的vrp问题,当计算规模较大时结果较差。两阶段方法针对客户点进行“先分组后定路线”的思路,适用于大型vrp问题。例如王文蕊等利用k均值聚类算法对线路进行分配,将问题逐步转化为小规模的旅行商问题。但k均值聚类算法的k值不便于人工把握,这对车辆的用时与载货量限制不利,且该算法对噪音和异常点比较敏感,若存在相对离群的客户点,聚类结果往往较差。
技术实现要素:
为了克服已有技术的不足,本发明提供了一种考虑二次配送和平衡用时的多车型车辆路径规划方法,能够对大数据量的订单信息进行计算,得到较为合理的路径分配结果;能够考虑二次配送的情况,能够对每条路线的工作时间进行均衡分配,能够在多种车型中选择较为合适的车型进行配送任务,能够在结果符合配送限制条件的前提下使总配送成本偏小。
针对物流配送问题进行数学建模,将其视为单运输中心,包含二次配送的衍生vrp问题,并称之为“有能力约束和用时平衡约束的多车型车辆路径问题”(capacitatedandmulti-modelvehicleroutingproblemwithroutebalancing,cmmvrprb),以车辆所花成本最小和均衡车辆工作时长为优化目标,利用维诺图的特点对客户点进行初始化集群,设计“借进借出”思想进行路线间客户点的再分配,同时利用启发式算法增强路线内最优配送顺序的搜索能力。最后通过算例进行验证,并能通过调节给定参数,得到不同的路径结果,以供管理者作出决策。
本发明解决其技术问题所采用的技术方案是:
一种考虑二次配送和平衡用时的多车型车辆路径规划方法,包括以下步骤:
1)读取数据;
2)根据数据判断客户间距离与时间矩阵是否完整,若完整,直接跳转至步骤3);若不完整,则使用spfa最短路径算法完善距离与时间矩阵;
3)借鉴了两阶段方法,利用维诺(voronoi)图的一阶邻近特性对客户点进行初始化集群;
4)分别按照用时限制、多车型、二次配送、用时平衡的顺序,利用“借进借出”思想针对配送限制条件对不同线路的客户点进行再分配,在此期间,使用3-opt[]、or-opt[]算子对路线内的配送顺序进行优化;
5)根据客户点分布与配送中心距离按照升序的顺序选择线路,并对其进行“瓜分”,将其包含客户点分配给其他线路作为二次配送的配送任务;
6)最后,针对平衡用时的进行计算,尽量最小化使用车辆的最大工时差。
本发明参照的物流配送问题描述如下:已知物流配送中心拥有不同类型的货车,其为分布在当地的商户运送货物。不同类型的货车,其额定最大载货量与出行成本各不相同,每辆车的出行成本与其最大载货量呈一定正相关。运载着一定单位数量货物的货车从物流中心出发,途中经过多家商户,以满足商户的需求,配送完毕后返回物流中心;若剩余工作时间充裕,则货车进行二次装货后再次从物流中心出发,完成配送任务后返回物流中心。其中要求每辆货车的工作时间均不超过规定值,且确保多条路线之间的平衡;每次运输,货车的实际运货量均不超过其额定最大载货量;运输所需车辆的成本之和最小化;每条路线对客户的配送顺序尽量最优。
本发明在原vrp问题的基础上,考虑二次运输、各路线间用时平衡和多车型,并称之为“有能力约束和负载平衡约束的多车型车辆路径问题”。针对此类问题,设计了一种考虑“二次配送”和“平衡用时”的多车型车辆路径规划方法。首先,该方法利用spfa算法对订单数据和不完整的距离矩阵进行预处理,计算出包含所有节点的完整的行驶距离矩阵和行驶时间矩阵;算法基于维诺图的一阶邻近对客户进行初始化集群,使计算复杂度大幅降低,且避免了离群点引发的问题;本发明提出的“借进借出”思想能够对路线间的客户点进行合理再分配;在考虑二次配送的计算时,将距离配送中心较近的客户点作为二次配送的尾单;在平衡用时的过程中,利用ban表防止客户点被重复分配。在计算过程中,利用2-opt算法、or-opt算法对单条线路内的客户配送顺序进行优化。
本发明的有益效果主要表现在:1、能够针对大数据量的订单信息相对较快地得到合理的路径分配结果。2、能在同时考虑二次配送、用时均衡、多车型的前提下,使总配送成本最小化。3、能在只增加较少用时的前提下,使货车的工作时间分配得更均衡,这保证了公平。
附图说明
图1为算法过程的流程图,表示算法每个步骤的大体说明。
图2为数据仓库表间关系图,主要展示了数据仓库不同数据表的结构与根据外键引用进行关联的关联关系。
图3为“借进借出”思想示意图,用于展示“借进借出”操作在实际用例中的思想含义。其中,(a)表示了“借出”操作的示例,即在对客户点进行分配时,当路线用时超出了规定时限,需将本路线内的客户点适当地分配至其他路线,如此一来,本路线内的客户点数量因此减少,其用时才能逐渐减小,直至满足规定时限。(b)表示了“借进”操作的示例,即当用时未达到规定时限,则可试着将其他路线中的客户点插入至本线路,若用时满足规定时限,则正式转移客户点。
图4为“借进”操作-搜索区域划分示意图,用于展示在“借进”操作中,如何筛选可能被“借进”的客户点。
图5为车型选择过程示意图,展示如何为配送线路选择合适的车型。
图6为计算结果展示示意图,通过使用高德地图对不同路线的路径进行展示,其中不同的路径由不同颜色的客户点和顺序线路表示。
具体实施方式
下面结合附图对本发明作进一步描述。
参照图1~图6,一种考虑二次配送和平衡用时的多车型车辆路径规划方法,包括以下步骤:
1)读取数据;
2)根据数据判断客户间距离与时间矩阵是否完整,若完整,直接跳转至步骤3);若不完整,则使用spfa最短路径算法完善距离与时间矩阵;
3)借鉴了两阶段方法,利用维诺(voronoi)图的一阶邻近特性对客户点进行初始化集群;
4)分别按照用时限制、多车型、二次配送、用时平衡的顺序,利用“借进借出”思想针对配送限制条件对不同线路的客户点进行再分配,在此期间,使用3-opt[]、or-opt[]算子对路线内的配送顺序进行优化;
5)根据客户点分布与配送中心距离按照升序的顺序选择线路,并对其进行“瓜分”,将其包含客户点分配给其他线路作为二次配送的配送任务;
6)最后,针对平衡用时的进行计算,尽量最小化使用车辆的最大工时差。
本发明借鉴了两阶段方法,首先基于维诺图的一阶邻近对客户点进行初始化集群,随后分别按照用时限制、多车型、二次配送、用时平衡的顺序,利用笔者提出的“借进借出”思想针对配送限制条件对不同线路的客户点进行再分配,在此期间,使用3-opt、or-opt算子对路线内的配送顺序进行优化,在分别考虑二次配送与平衡用时的计算完成后,算法结束。
数据仓库设计
根据车辆路径算法需求以及业务相关数据,建立数据仓库的数据表包括客户基本信息表、配送中心表、货物订单表、客户点对点距离表、客户点对点时间表、道路信息表。
以上五张表的基本信息介绍如下:
客户基本信息表(customer_info)
客户基本信息表包含客户基本信息,有7个字段,包括客户id、客户名称、所在道路id(外键)、客户点与所在道路起点的距离、客户点经度和纬度、客户点相对道路的所在方向。
配送中心基本信息表(department_info)
配送中心基本信息表包含配送中心基本信息,有7个字段,包括配送中心id、配送中心名称、所在道路id(外键)、配送中心点与所在道路起点的距离、配送中心点经度和纬度、配送中心点相对道路的所在方向。
货物订单表(order_info)
订单表包含订单的相关信息,即使是统一配送中心,不同日期的订单也会有所不同。表内共6个字段,包括订单id、客户id(外键)、货物需求量、卸货所需时间、订单日期、配送中心id(外键)。
客户点对点距离表(distance_info)
客户点对点距离表用于存储对订单信息进行预处理后的客户点间距离信息。表内共4个字段,包括唯一标识id、起始客户id(外键)、终点客户id(外键)、距离。
客户点对点时间表(time_info)
客户点对点时间表用于存储对订单信息进行预处理后的客户点间时间信息。表内共4个字段,包括唯一标识id、起始客户id(外键)、终点客户id(外键)、时间。
其中各表根据外键引用进行关联,表关系及结构如图2所示。
本实施例的模型建立过程为:
将g=(v,e)作为配送网络,其中v为节点集,v={0,1,2,3,…,n},0表示配送中心,其余表示客户点;e为配送中心与客户点间距离时间矩阵的合集,e={(i,j)|i,j∈v,i≠j};ti,j为货车从点i到点j所需的时间;qi为客户点i的需求量;xi、yi分别表示客户点i的经纬度;k为不同车型的集合,k={1,2,...,m},lwk、ck、pk、uk分别表示编号为k的货车车型的最大载货量、出行成本、提供车辆数、当前已使用车辆数,其中k∈k;truck为实际使用货车的集合,truck={1,2,...,p},cartypeno表示编号为no的货车在k中的车型编号,line1no、line2no为有序数组,分别表示编号为no的货车一次配送和二次配送的途经点顺序,若数组不为空,其长度不小于2,且起始点与末尾点均为配送中心0,t1no、.w1no.分别表示编号为no的货车一次配送路线的用时与载货量,t2no、w2no类同,其中no∈truck;ts为每辆货车每日限定的工作时间;b为可以接受的货车间最大工作时间差。
至此,考虑物流配送问题的数学模型如下。
tno=mint1no+mint2no<ts,no∈truck(2)
max(ti)-min(tj)≤b,i,j∈line(3)
w1no,w2no<lwk,no∈truck,k=cartypeno(4)
式(1)至式(4)为基于限制条件的目标函数。式(1)中c表示运输所需车辆的成本之和最小;式(2)表示每辆货车在一次、二次配送对客户的配送顺序最优,从而使每条路线的用时最短,tno为一次、二次配送的路线用时之和,其小于规定工作时间;式(3)体现用时平衡,表示货车工作用时最长与最短之差满足规定可接受的最大用时平衡差;式(4)表示货车在进行每次配送任务时均不超载。
式(5)和式(6)分别表示货车每次执行配送任务时,首先从配送中心出发,途经客户点,完成配送后回到配送中心的所需时间,当货车无需二次配送,用时为0。式(7)和式(8)分别表示货车每次配送任务的载货量为路线途经客户的需求量之和,当货车无需二次配送,载货量为0。
基于维诺图的初始化集群:在大规模客户量的前提下,车辆路径算法是np-hard问题,意味着穷举法是不可行的,而启发式算法只能尽量使结果趋向最优,且计算规模越大,在一定时间内越难保证最优。本方法使用基于维诺(voronoi)邻近创建初始解的方案,将整体的车辆路径问题转化为小部分的旅行商问题,减小算法的复杂度。配送问题包含了“多车型”的条件,车辆的最大载货量不唯一,这使得初始解各个集群的需求量之和在与参照容量进行比对时产生了歧义。对该方法针对多车型的需求做出了改进,步骤如下:
3.1)创建节点集v的维诺图,填充客户点的一阶维诺图邻近列表,其中配送中心不包括在内;
3.2)创建队列r,将所有的维诺图一阶邻近节点对压入r中,这时每个客户点单独算作一个类;
3.3)将r中的客户点对i~j按照时间矩阵中的ti,j进行升序排序;
3.4)根据车型数据集k提供不同车型的最大载货量、提供车辆数,算得提供车辆的平均最大载货量wavg,其满足等式
3.5)取出r中位于队列头部的客户点对i-j,若i,j已在同一类中,不进行操作;否则,判断i,j所在类是否进行合并:将客户i所在类视为vi,同理,得到vj,将类vi的货物总需求量视为qi,同理,得到qj,若qi+qj≤wavg,合并类vi,vj;否则,不进行聚类操作;
3.6)反复执行步骤3.5),直到列表r为空;得到初始集群划分line1={line11,line12,…,line1p}和货车集合truck={1,2,...,p},此时并未确定货车车型;
相对于k均值聚类算法,基于维诺图的集群算法只使用了一阶邻近客户点对,使操作数据的时间复杂度大幅降低,这提高了聚类性能。该集群算法能够根据参照容量动态的控制集群数量,无需提前设定。由于维诺图的绘制原理,基于维诺图的集群算法天生更适宜具有离群点的数据集。上述优点使基于维诺图的集群算法更适宜在车辆路径问题中进行点聚类并获得初始解。
路线内配送顺序的优化:得到初始集群后,均视其为一次配送的配送点集,此时需要算出每条路线在最优配送顺序下的所需时间。本算法分别使用节约算法、基于参考点的相邻插入法得到两个初始解,之后使用3-opt和or-opt局部搜索算子分别对两个初始解进行单条路径的配送顺序优化,优化过程如下:
4.1)创建优化失败次数f,并将其初始化为0。
4.2)得到该路线的客户数量n,根据不同的数量n得到适合的优化失败限制次数fl。
4.3)f=f+1,根据式(5)算得优化前的用时tpre。利用random函数得到值为0或1的随机数,当值为0,对线路进行3-opt算法优化;当值为1,对线路进行or-opt算法优化。根据式(5)求得优化后的用时tafter,当tafter<tpre,则视为优化成功,f重置为0,更新路线;否则,不更新路线。
4.4)反复执行步骤4.3),直至f>fl。返回优化线路,优化过程结束。
对两个初始解分别进行线路优化过程后,得到两个优化解与各自解的用时tsaving、tinsert,取用时更少的解作为之后的操作线路line1no,另一解丢弃之。
“借进借出”思想:图3对“借进借出”思想进行了展示。其中(a)部分展示了“借出”操作。在对客户点进行分配时,当优化后的路线用时超出了规定时限,即t1no>ts,需将本路线内的客户点适当地分配至其他路线,本路线内的客户点数量因此减少,其用时才能逐渐减小,直至满足规定时限,此为“借出”。
(b)部分展示了“借进”操作。当用时相对于规定时限仍有富余,即t1no<ts,则可试着将别的路线中距离本路线较近的客户点分配至本线路,若用时满足规定时限,则正式转移客户点,此为“借进”。
对路线内配送顺序的优化结束后,创建堆a,在a中添加每个优化后的路线,用以表示“未定型”的线路。之后进入循环操作,直至a为空时跳出。在循环体中,先对a进行遍历,求得a中每条线路的用时t1no、路线中客户中点坐标(cen1xno,cen1yno)、路线包含的客户点与配送中心的平均距离disavgno,其中
取disavg最大,即客户点分布最远的路线line1far,并针对此路线,使用“借进借出”思想对客户点进行再分配,分配完成后,去除a中本条线路的编号far。
以下具体介绍各路线对客户点的“借进”与“借出”操作。
借出:当线路用时大于限制用时,即.t1far>ts.,需要将该路线内距离配送中心较近的客户点cust“借出”分配给较近的其他线路。当a中只剩下line1far,即没有其他线路可以“借出”,则a新增一条线路,并将客户点cust分配给此新建的线路;当a中不止有line1far,根据客户点cust的坐标(xcust,ycust)与a中其他线路的客户中点坐标(cen1xno,cen1yno)求得它们的欧氏距离disfar,no,即
,取disfar,no最小的线路line1no,并将客户点cust分配给该线路。循环“借出”操作,直至t1far≤ts,跳出“借出”循环后对线路line1far执行“借进”操作。
借进:当线路用时小于限制用时,即t1far<ts,且a中不止有line1far,执行此操作。创建节点集maybe,用于存储可能被“借进”的客户点,获取、合并a中其余线路的客户点,并将其存入maybe。获取line1far中距离配送中心最远的客户点furthest与配送中心的时间距离d0,furthest,即
d0,furthest=max(d0,i),i∈line1far(13)
。根据d0,furthest、客户中点坐标c(cen1xfar,cen1yfar)和配送中心坐标p(x0,y0),在地图上以一定比例画出一个形状范围,图形满足式
或式
其中b表示图形的边界点;t表示自定义的时间范围;a,b,c表示相应的比例,不同的取值将得到不同形状。取a=1.5,b=0.5,c=2,t取15分钟,使其成为“覆盖配送中心点p,且纵向方向上越靠近客户中点坐标c,横向半径越大的类葫芦状”与“以配送中心p为起点,15分钟内所能到达的任何区域”的并集范围,如图4所示。筛选maybe中坐落在图形范围内的客户点,之后将maybe根据其每个点与客户中点坐标c的欧式距离进行升序排序。遍历maybe,对每次获得的客户点,使用插入法将其添加进本线路,之后求得用时t1aftfar。当满足限制用时,即t1aftfar≤ts,表示“借进”成功,跳出遍历,循环“借进”操作,直至maybe中没有能被成功“借进”的客户点;当添加点后的线路超时,即t1aftfar≥ts,表示“借进”失败,回滚插入点操作,继续遍历。
每一条线路都需要经历“借进借出”的过程,其中“借出”可能发生,“借进”必定发生。经过本节操作得到的线路,说明其用时符合要求,即无需“借出”,且无法再接收任何其他客户点,即无法“借进”,将此线路标记为“已定型”,在进行车型的选择等操作后,从堆a中去除该线路,之后根据a中是否仍有线路判断是否继续循环操作。循环结束后更新line1与truck。
车型的选择:在对客户点进行初始点划分时,与载重量有关的数据为提供车辆的平均最大载货量,这仅仅用于载货量参照,并没有选择具体车型。在上述操作完成后,对不同路线的货车进行车型的选择。
在操作中,每“定型”一条路线line1no,对其货车进行车型的选择。获取此线路的需求量w1no,遍历车型集k,计算在不同车型载重量wlk和出行成本ck下的平均单位货物配送成本cavgk,其满足式
取cavgk结果最小的车型k作为本路线的当前备选车型。如图5所示,将k中各车型按照最大载货量排序(一般情况下,货车的最大载货量越大,出行成本越大),从车型k开始进行第一轮升序查找,对当前搜索的车型curr,若该车型有剩余车辆,即pcurr>ucurr,正式选择该车型进行当前路线的配送任务;若仍无剩余车辆,从车型k开始进行第二轮降序查找,若仍无剩余车辆,说明用户提供车辆过少。
在提供车辆充足的前提下得到该路线的最终选择车型final,对ufinal作自增操作。此时,该车型若是在第二轮查找中选择到的,则说明该车辆超载,需再次对路线进行“借进借出”的操作,并且需要同时考虑用时与超载的条件限制。
至此,算法求得的结果已适用于标准的多车型vrp问题。
考虑二次配送的计算:一般情况下,在执行二次配送任务前,车辆的剩余工作时间并不充裕,故靠近配送中心的客户点更适宜以尾单作为二次配送任务。算法的“借进借出”操作是根据各路线的客户中点与配送中心的欧式距离按照降序依次执行的,由此可知对于每辆货车的配送线路line1no,no越大,其客户点分布越靠近配送中心。在考虑二次配送进行客户点分配时,取no最大的线路line1close作为被“瓜分”的线路,其相关客户点被分配给其他货车的二次配送线路;步骤如下:
5.1)获取truck中最大的编号close。创建数组l,当该货车的二次配送路线line2close不为空,将其复制到l;否则,将该货车的一次配送路线line1close复制到l。
5.2)创建数组linearr,存储truck中除close外所有货车的编号,其中linearr={1,2,...,p},且
5.3)遍历linearr,对每个货车编号curr,获得其最大载货量wlk,其中k=cartypecurr。
5.4)当l为空,代表路线.l.已被“瓜分完”,跳转至步骤1)。l不为空时,若line2curr为空,将l中距离配送中心最近的客户点分配给line2curr;若line2curr不为空,将l中与line2curr客户中点的欧氏距离最小的客户点分配给line2curr。插入客户点后算得其二次配送的用时t2curr和货物量w2curr,若货车curr的工作时间与载重均符合约束条件,循环执行步骤5.4);若不符合约束条件,则继续遍历linearr。
5.5)循环跳转至步骤5.1),直至当前线路l无法再被“瓜分”。
5.6)更新truck、line1、line2以及相关数据t1、t2、w1、w2。
平衡各货车的工作时间:在进行平衡用时的过程中,一定是用时较多的货车more将其配送的部分客户点分配给用时较少的货车less,分配的客户点对于货车less必须较为合理。在平衡结果仍未满足平衡要求的前提下,可能会发生“两辆货车不停地向对方分配同一个客户点”的情况,这会造成死循环,本实施例提出使用一个ban堆用以存储货车less的编号,一旦货车被分配了其他货车的配送客户点,其编号被存入ban,则该货车的配送客户点在之后的客户分配中“只进不出”,这有效地杜绝了上述问题的发生,平衡货车用时的步骤如下:
6.1)创建堆ban,初始为空。获取可以接受的最大工作时间差b;
6.2)求得当前结果中各货车的最大工作时间差balance,若balance≤b,结束计算,返回结果。否则,找到工作时间最短的货车less,获取其配送路线line1less、line2less以及相关数据t1less、t2less、w1less、w2less;
6.3)创建数组availarr,在其存入除货车less和ban堆存储以外的货车编号。当line2less为空,将availarr根据其所含货车的工作时间降序排序;当line2less不为空,获取该线路的客户中点cen2less,遍历availarr,求得所含每辆货车的一次配送或者二次配送线路的客户中点cen1or2,其中二次配送线路的优先级更高,求得cen2less与每个cen1or2的欧氏距离,将availarr根据此欧式距离对货车进行升序排序;
6.4)遍历availarr,在遍历过程中,对每辆货车,若其有二次配送路线,取之,否则取其一次配送路线,将选择的路线均视为currl,并将currl根据其所含客户点与配送中心的距离升序排序。在遍历availarr的过程中嵌套遍历currl,在遍历currl的过程中,试着将当前经历的客户点分配至线路line2less,在line2less优化配送顺序后,若货车的工作时间不超时,且货物不超载,代表分配成功,跳转至步骤6.2);
6.5)在步骤6.4)中,若在遍历availarr之后依旧分配不成功,则表示无法再进行平衡用时的计算,结束计算,返回结果。
实现车辆路径算法:根据上述阶段描述的相关概念和步骤,实现考虑二次配送和平衡用时的多车型车辆路径规划方法。本实施例模拟了物流配送中心一天的配送需求订货单(共730个客户),在执行算法前面加载客户信息、配送中心信息、订单信息、客户与配送中心的时间、距离矩阵,之后运行算法求得配送路径结果,结果在地图上的展示如图6所示。
本实施例提出的车辆路径规划方法,能够对大数据量的订单信息进行计算,得到较为合理的路径分配结果,能够考虑二次配送的情况,并对每条路线的工作时间进行均衡分配,能够在多种车型中选择较为合适的车型进行配送任务,能够在结果符合配送限制条件的前提下使总配送成本偏小。