1.一种考虑二次配送和平衡用时的多车型车辆路径规划方法,其特征在于,所述方法包括以下步骤:
1)读取数据;
2)根据数据判断客户间距离与时间矩阵是否完整,若完整,直接跳转至步骤3);若不完整,则使用SPFA最短路径算法完善距离与时间矩阵;
3)利用维诺图的一阶邻近特性对客户点进行初始化集群;
4)分别按照用时限制、多车型、二次配送、用时平衡的顺序,利用“借进借出”思想针对配送限制条件对不同线路的客户点进行再分配,在此期间,使用3‑opt[]、or‑opt[]算子对路线内的配送顺序进行优化;
5)根据客户点分布与配送中心距离按照升序的顺序选择线路,并对其进行“瓜分”,将其包含客户点分配给其他线路作为二次配送的配送任务;
6)最后,针对平衡各货车的工作时间进行计算,最小化使用车辆的最大工时差;
所述步骤1)中,将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=min t1No+min t2No<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;
所述步骤4)中,使用节约算法、基于参考点的相邻插入法得到两个初始解,之后使用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,返回优化线路,优化过程结束;
所述步骤4)中,对两个初始解分别进行线路优化过程后,得到两个优化解与各自解的用时tsaving、tinsert,取用时更少的解作为之后的操作线路Line1No,另一解丢弃之;
对路线内配送顺序的优化结束后,创建堆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分钟,筛选Maybe中坐落在图形范围内的客户点,之后将Maybe根据其每个点与客户中点坐标C的欧式距离进行升序排序,遍历Maybe,对每次获得的客户点,使用插入法将其添加进本线路,之后求得用时t1Aftfar,当满足限制用时,即t1Aftfar≤Ts,表示“借进”成功,跳出遍历,循环“借进”操作,直至Maybe中没有能被成功“借进”的客户点;当添加点后的线路超时,即t1Aftfar≥Ts,表示“借进”失败,回滚插入点操作,继续遍历;
所述步骤5)中,考虑二次配送的计算,步骤如下:
5.1)获取Truck中最大的编号close,创建数组L,当该货车的二次配送路线Line2close不为空,将其复制到L;否则,将该货车的一次配送路线Line1close复制到L;
5.2)创建数组lineArr,存储Truck中除close外所有货车的编号,其中lineArr={1,
2,...,p},且 将lineArr根据其每辆货车的总配送时间TNo降序排序;
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。
2.如权利要求1所述的一种考虑二次配送和平衡用时的多车型车辆路径规划方法,其特征在于,所述步骤3)中,使用基于维诺邻近创建初始解的方案,将整体的车辆路径问题转化为小部分的旅行商问题,减小算法的复杂度,步骤如下:
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},此时并未确定货车车型。
3.如权利要求1所述的一种考虑二次配送和平衡用时的多车型车辆路径规划方法,其特征在于,所述步骤6)中,平衡各货车的工作时间,平衡货车用时的步骤如下:
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之后依旧分配不成功,则表示无法再进行平衡用时的计算,结束计算,返回结果。