一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于运筹学理论的公路零担货运物流路径规划算法的制作方法

2022-05-26 20:32:14 来源:中国专利 TAG:


1.本发明涉及货运物流路径规划技术领域,具体为一种基于运筹学理论的公路零担货运物流路径规划算法。


背景技术:

2.货运物流路径规划,目的是在物流运输、货物配送行业中,提供最佳的通行路线,帮助企业能够灵活、轻松、高效的规划路线,为司机提供畅通无阻的最佳通行路线,并高效、节约地完成运输配送任务。近几年来,随着国家对于物流运输行业的重视和大力扶持,国内对于这方面的研究和应用已经有了很大进步,对于车辆配载和路径规划中的理论和系统应用都有不少落地案例。
3.但是目前的验证和应用中,对于日常高频率的零担物流配送、快消品配送,缺乏必要的现实场景支持。例如在连锁便利配送的场景中:
4.1.一个仓库每日最多可配送约2000至3000家门店,约3000-5000张订单需要约200车次左右,每车次的配送门店数量可能有20到30家门店,而这些运输需求要在30分钟内全部规划完毕,输出为配送任务给到仓库和司机。
5.2.门店有不同的可收货时间窗口,需要在规划中满足他们的时间窗口。
6.3.门店分布在城市不同区域,有些区域必须独立线路配送。
7.4.门店商品的需求是分常温、冷冻、冷藏等多温层的,对于车型有具体要求。
8.5.门店由于周边路况限制,对于可达到的车型有不同的限制。
9.6.多种不同车型对于装载商品件数、体积、重量等也有不同的限制。
10.7.司机的整体工作时间是有限制的,一般在城市配送中只能连续工作8-12小时。
11.8.每个门店要求的商品数量不同,周边环境也不同,导致司机与门店的交接时长是变化的,而交接时长也必须在规划中考虑到,影响整体的运输线路规划。
12.以上列举的实际问题,在现有的系统应用和规划方法中并没有能够很好的解决,导致在实际操作中,还是大量依赖传统的人工规划方式,效率低下,准确度不高,在运输资源的利用上存在很大的浪费。
13.综上所述,本发明通过设计一种基于运筹学理论的公路零担货运物流路径规划算法来解决存在的问题。


技术实现要素:

14.本发明的目的在于提供一种基于运筹学理论的公路零担货运物流路径规划算法,以解决上述背景技术中提出的问题。
15.为实现上述目的,本发明提供如下技术方案:
16.一种基于运筹学理论的公路零担货运物流路径规划算法,基于零担物流配送的实际业务场景,采用iterated local search(ils)算法的优化框架,并在此基础上根据业务场景和约束条件,采用运筹学理论中对于解决运输问题的数学模型,进行优化调整,同时在
数据量和时效性的要求下,算法在框架上,结合聚类算法进行了升级,使其更加符合运输实际场景需求,其具体步骤如下:
17.s1,区域划分:为了降低计算复杂度,首先基于配送点地址信息以及配送点的订货商品数量、配送点的收货时间窗口限制,对配送点进行区域划分,针对多区域规划场景,设置区域分配顺序;
18.s2,构造初始解:然后根据路径规划系统接收到的配送点信息、订单信息、可用车型信息,调取路网数据,在满足车型装载限制、配送点车型限制的基础上,构造较优的初始路径规划结果;
19.s3,聚类:然后采用凝聚层次聚类算法,即自底向上,对初始解进行聚类,从而提高局部搜索模块的运算效率;
20.s4,类内迭代局部搜索:对属于同一聚类内的路径,调用局部搜索函数,得到局部最优解,随后,对得到的局部最优解进行扰动,得到新的初始解,不断迭代直至达到停止条件,同时算法的停止条件是通过设置最大迭代次数或程序运行时间限制进行实现的;
21.s5,比较并记录最优结果:记录每轮优化得到的局部最优解并进行比较,得到每种分配顺序下的最优解;记录并比较多种分配顺序下的最优解,得到最优分配顺序下的全局最优解。
22.作为本发明优选的方案,所述iterated local search(ils)算法基本原理是从给定的初始解s0开始,应用局部搜索函数localsearch(s0)得到一个局部最优解,然后对当前最好的局部最优解进行扰动,得到一个新的初始解s0,继续优化和扰动,重复寻优过程直到满足迭代终止条件,其中算法程序代码如下:
[0023][0024][0025]
作为本发明优选的方案,所述s1中的“区域”并非严格意义上的地理区域,clustermethod()在具体实现中是将同一运输模式下属于同一省份的订单视作在同一个“区域”,并在实现初始化的getcluster()函数中,是先调用初始解模块得到每个区域的初
始路径,再对其进行聚类,初始解模块主要包含预处理pruning和构造初始解initialroute两个模块,其中,预处理模块中的simplified_graph()函数通过限制两个订单的配送点之间的车程预先筛选不可行路网线路,构造初始解模块主要通过基于节约启发式算法(saving heuristic)思想的constract_improve()函数构造初始路径,并在在迭代局部搜索模块,单次局部搜索优化通过converge_loaclsearch()函数实现,函数中按顺序依次应用reversevist、insert_best、exchange_best、reversevist2四种优化算子,从而整个算法的结构和各模块的运行逻辑如下:
[0026]
s11,读取数据:
[0027]
需要传入的数据有车型信息、配送点信息、订单信息、装车点信息、路网数据,其中数据传递格json,并且在io模块下readdata中包含读取订单、车辆、配送点、路网和配置参数信息的函数,通过函数读取数据文件(.json)后,利用readlocation()函数提取配送点对应的省份、城市信息,利用readin()函数生成距离邻接矩阵和添加订单的门店编号属性,并将读取和生成的数据存储到相应的数据项对象中;
[0028]
s12,参数配置:
[0029]
common模块下定义的parameter类主要定义了算法中需要配置的参数和对他们进行读取和检验配置情况的函数;
[0030]
算法中需要配置的参数及具体含义、取值方式如下:
[0031]
strategy:选择何种策略,三种可选(时间最快、距离最短、费用最省);
[0032]
minrun:车辆再次使用最小时间,小于此运行时间的车辆再次被使用,默认值为4;
[0033]
numofcluster:每个区域的内部聚类数,若为null则算法自动判断聚类数;
[0034]
enablevolumecapacity:是否启动体积容量限制,开启至少一种容量限制enableweightcapacity:是否启动重量容量限制,开启至少一种容量限制;
[0035]
enableqtycapacity:是否启用件数限制,开启至少一种容量限制;
[0036]
usestoretimewindow是否启用配送点的工作时间窗口;
[0037]
usestoreservicetime:是否启用配送点的交接时间;
[0038]
usestorerecommendvehicletypelimit:是否启动配送点的车辆类型限制;
[0039]
usestoreregionlimit:是否启用配送点区域限制;
[0040]
usevehicletimewindow:是否启用车辆时间窗口;
[0041]
usevehicletransporttypelimit:是否开启车辆运输类型限制;
[0042]
enablevehiclereuse:是否开启车辆重复使用;
[0043]
usevehiclemaxuse:是否启用车辆最大使用次数;
[0044]
allowwaittime:允许等待时间,单位:分钟;
[0045]
vehicleallowusetime:车辆允许被使用的最短剩余工作时长,单位:小时;
[0046]
timelimit:算法允许的最大运行时长,单位:秒,默认值为300;
[0047]
numofoperator:每个聚类内的算子操作次数默认值为100*订单数;
[0048]
numofiteration:迭代搜索次数默认值为20,建议设为20以内;
[0049]
numofsequence:尝试的分配顺序次数默认值为10;
[0050]
usestorepriority:是否启用配送点的优先级;
[0051]
s13:聚类算法:
[0052]
算法中的聚类部分是通过cluster模块下clustermethod类中的相关函数实现的,该模块包含按区域聚类函数getclusterbyprovince()和初始解聚类函数getcluster()两个主要函数,以及getcluster()的两个子函数kmedoids()和getsimilaritymatrix();
[0053]
getclusterbyprovince()函数:通过获取订单的运输模式和省份信息,将订单划分到不同的区域中,实现算法最初的按订单进行区域聚;getcluster()函数:首先调用了pretreatment模块下pruning类中的函数simplified_graph()对订单进行预处理,然后调用了strategy模块下initialroute类中的constract_improve()函数得到各个区域的初始路径,最后调用kmedoids()函数对初始路径进行聚类,为提高算法效率,算法采用先聚类再在类内迭代搜索的方式对目标函数进行优化,其中getcluster()函数是中聚类部分是基于凝聚层次聚类思想,通过kmedoids()算法对初始路径进行聚类;
[0054]
s14,关键实现:
[0055]
包括构造初始解、优化算子操作、迭代局部搜索和可行性检验。
[0056]
在每种分配顺序下,先调initialroute生成初始解,然后采用clustermethod中的聚类方法对初始路径进行聚类,类内采用iterlocalsearch中的迭代局部搜索方法进行多次迭代和局部搜索,每次进行局部搜索时调用operato中的算子操作方法对初始解进行优化;记录每种分配顺序下的最优解,遵循iterlocalsearch()函数中的比较思路,比较得到最优分配顺序下的全局最优解;最后使用checksolution中定义的函数检验解的可行性;
[0057]
s5:结果输出实现了订单分配路径规划结果的输出,包含以下内容:
[0058]
最优方案:未被分配路径的订单数、check是否通过、总路程、数据读取时间、路径构造和优化、总的过路费;
[0059]
最优方案中每条路径的具体信息:每条路径对应的车辆编号、装载体积、车辆最大装载体积、装载重量、车辆最大装载重量、装载率、出发时间、车辆用时、车辆最大服务时间、费用、车辆行驶距离、车辆最大行驶距离、路径中配送点数目、路径中订单数目,其中装载率包括体积、重量,费用包括总费用、车辆费用、燃耗费用、过路费用;
[0060]
每条路径的订单配送顺序;
[0061]
每条路径的配送点配送顺序,预计到达时间,预计交接时长;
[0062]
若由于运输产能的不足导致存在未被分配的订单,需要输出未被分配路径的订单编号。
[0063]
作为本发明优选的方案,所述车型信息包括:车型编号、最大体积、最大载重、最大服务配送点数目、最大装载商品件数、开始服务时间、最大运行时间、最大行驶里程、每公里收费、运输模式、是否返回装车点、车牌对应省份、车牌对应城市;
[0064]
配送点信息包括:配送点编号、名称、地址、所在省份、所在城市、经度、维度、车辆限制、时间窗口、交接时间;
[0065]
订单信息包括:订单编号、配送点编号、商品体积、商品重量、订单运输模式、商品件数;
[0066]
装车点信息包括:装车点编号、装车点地址、经度、纬度;
[0067]
路网数据包括:路径编号、起点名称、终点名称、起点代码、终点代码、距离最小_距离、距离最小_时间、距离最小_费用、时间最快_距离、时间最快_时间、时间最快_费用、起点坐标、终点坐标、起点地址、终点地址。
[0068]
作为本发明优选的方案,所述凝聚层次聚类的算法框架如下:
[0069]
input:n条初始路径
[0070]
output:k个初始路径的聚类
[0071]
step1:初始每条路径各自为一个簇,即初始有n个簇;
[0072]
step2:计算每个簇之间的距离,其中,使用平均距离average linkage计算,它将两个簇之间的距离定义为第一个簇中的数据点与第二个簇中的数据点之间的平均距离,得到簇与簇之间的相似度矩阵;
[0073]
step3:选择距离最短的两个簇,若将这两个簇合并后不违反约束条件,则将这两个簇合并;否则返回step2选择距离次短的两个簇;
[0074]
step4:重复step2,step3直到当前的簇数量等于k,算法终止。
[0075]
作为本发明优选的方案,所述kmedoids算法是一种基于“代表对象”的聚类方法,遵循凝聚层次聚类的基本思想;每次选簇中位置最中心的对象,即中心点(medoids)作为新的中心,迭代直到簇中对象分布不再变化;选取簇中心点的准则函数是:遍历簇中所有点,选取当前簇中所有其他点到该中心点的距离之和最小的点。
[0076]
7.根据权利要求6所述的一种基于运筹学理论的公路零担货运物流路径规划算法,其特征在于:所述kmedoids算法步骤如下:
[0077]
a)任意选取k个点作为medoids;
[0078]
b)按照与medoids最近的原则,将剩余点分配到当前最佳的medoids代表的类中;
[0079]
c)在每一类中,计算每个成员点对应的准则函数,选取准则函数最小时对应的点作为新的medoids;
[0080]
d)重复step2~step3的过程,直到所有的medoids点不再发生变化,或已达到设定的最大迭代次数。
[0081]
作为本发明优选的方案,所述构造初始解的步骤如下:
[0082]
i.初始选择车辆:检查所有可用车辆,原则上优先使用大车,同车型优先选择用剩余工作时长更长的车辆;
[0083]
ii.选择seed顾客(select_seed):优先考虑有车型约束的订单,然后在满足时间窗约束下找到最佳seed,这里优先选择最近的seed顾客。
[0084]
iii.判断剩余订单能否被装载,如果查询不到装载车辆,则将剩余订单记录到未分配订单中;
[0085]
iv.安排剩余顾客:判断当前路径上的配送点数目是否超过车辆最大配送点数量和,若仍满足车型和装载约束,则在满足时间窗口约束下搜索所有顾客,每次选择使其改变最小的最佳顾客插入路径,直至订单被分配完或不再满足容量约束;
[0086]
v.检查路径:检查初步路径构造结果,构造完当前聚类下所有路径后,再检查每条路径的装载情况,判断是否需要换车,如果需要进行换车,搜索所有可以再使用的车辆,若开启车辆多次使用参数,则包含可再次调用的车辆,计算更换车辆后的成本,如果换车后成本降低,则更换当前路径所用的车辆,否则不进行换车;
[0087]
vi.得到最终的初始解后,检验初始解分配的正确性和路径纪录的正确性,同时为了保证订单不遗漏和重复选择,检查剩余订单数。
[0088]
作为本发明优选的方案,所述优化算子操作共定义了6种算子操作,包括2种基本
算子insert和remove,4种优化算子reversevist、reversevist2、insert_best和exchange_best,其中局部搜索函数中共用到了4种优化算子,其中reversevist和reversevist2为路径内优化算子,insert_best和exchange_best为路径间优化算子,每类优化算子的目的都是构造给定解的领域;
[0089]
insert算子:将订单i插入到当前路径的第j个位置上;
[0090]
remove算子:将订单i从当前路径的第j个位置上移除;
[0091]
reversevist算子:交换一条路径上连续的两个订单的访问顺序,直到执行该算子后仍无法改善当前路径为止;
[0092]
reversevist2算子:对于每条路径中的订单,先从路径中移除掉该订单,然后在路径上选择最佳插入位置,执行最佳交换,直到执行该算子后仍无法改善当前路径为止;
[0093]
insert_best算子:移除一条路径上的某个订单,将其重新插入到另一条路径中,若路径结果有所改善,则执行该算子并选择最佳插入位置,否则不执行;
[0094]
exchange_best算子:通过交换两条不同路径上的订单,形成两条新的路径,将订单从路径中移除后,搜索聚类内的其他所有路径,寻找最佳交换订单并进行交换,并返回交换前后两条路径上目标函数的改变值,若目标函数改变值大于0,则执行交换操作,否则不执行。
[0095]
作为本发明优选的方案,所述迭代局部搜索迭代局部搜索模块实现了算法中对初始解的优化部分,主要分为迭代和局部搜索两块,包含的函数有m_converge_loaclsearch()、converge_loaclsearch()、shake()、object()、cost_split(),其具体步骤如下:
[0096]
i:m_converge_loaclsearch()迭代函数
[0097]
迭代的具体过程为:根据初始路径聚类结果,计算出当前初始解,然后对类内的所有路径进行类内局部搜索即可得到局部最优解。搜索结束后,利用扰动算子随机反转若干条路径上的订单访问顺序,得到新的初始解。重复“搜索-扰动”过程,并在最后一次不扰动,至满足迭代停止条件后,比较并输出全局最优解;
[0098]
在迭代过程中,应注意记录每轮局部搜索的最优结果,在迭代过程结束后,比较得出全局最优解,并注意将车辆使用情况定位回全局最优解。
[0099]
ii:converge_loaclsearch()局部搜索函数
[0100]
在局部搜索函数中,算子的具体使用顺序:先调用路径内优化算子reversevist,再在满足剩余可用时间约束,其中,算法剩余可用时间不是指总剩余时间,而是指满足所有聚类至少可进行一轮优化的剩余可分配时间和默认算子操作次数的约束下,依次使用路径间优化算insert_best和exchange_best,若使用insert_best算子后没有改善,则继续调用exchange_best算子,直到违反约束或达到收敛跳出,其中若对所有订单都实行insert_best和exchange_best算子操作后仍没有改善,则判断为达到收敛,跳出后,再次调用路径内优化算子reversevist2来对路径进行优化,进一步改善目标函数。
[0101]
iii:shake()扰动算子
[0102]
通过内置的shuffle()函数反转全部路径上的订单访问顺序实现扰动。也可设置为随机反转若干条路径;
[0103]
iv:object()目标函数
[0104]
根据不同的策略,设计和计算相应的目标函数;
[0105]
v:cost_split()成本拆分函数
[0106]
将路径成本拆分为车辆费用、燃油费用和过路费用;
[0107]
所述可行性检验checksolution类中定义了对算法正确性进行检验的函数,checksolution()函数:检验得到的最优解是否满足所有约束,其步骤如下:
[0108]
a)当前可分配所有订单都被分配,且不被重复分配;
[0109]
b)车辆不超重,不超时;
[0110]
c)门店满足车型要求;
[0111]
d)满足车辆使用限制,其中包括但不仅限于次数、时间。
[0112]
与现有技术相比,本发明的有益效果是:
[0113]
1、本发明中,通过一种针对于公路零担物流运输路径规划的算法,当接收到多个配送点需要配送的商品信息时,通过算法,考虑多温层运输模式、商品体积、重量、件数,配送点时间窗、配送点适应车型等约束条件,根据当前可用车型、车型数量、配送点地址,展开路径自动计算,得到具体的车辆配送的规划路径,并给出每条路径用到的建议车型、装货量、需要途经的配送点和建议配送点顺序以及相关的货品交接时间,减少人工操作,节约运输产能,节省整体运输成本,即针对多配送点的零担物流配送场景,可以自动计算货车装载量,并在配送线路中自动计算出多个配送点合理的顺序,起到降本增效的目的。
附图说明
[0114]
图1为本发明整体的算法框架结构示意图;
[0115]
图2为本发明聚类算法框架结构示意图;
[0116]
图3为本发明关键实现框架结构示意图;
[0117]
图4为本发明insert算子运行流程结构示意图;
[0118]
图5为本发明remove算子运行流程结构示意图;
[0119]
图6为本发明实施例1流程结构示意图;
[0120]
图7为本发明实施例2流程结构示意图。
具体实施方式
[0121]
下面将结合本发明实施例,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例,基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0122]
为了便于理解本发明,下面将参照相关附图对本发明进行更全面的描述,给出了本发明的若干实施例,但是,本发明可以以许多不同的形式来实现,并不限于本文所描述的实施例,相反地,提供这些实施例的目的是使对本发明的公开内容更加透彻全面。
[0123]
需要说明的是,当元件被称为“固设于”另一个元件,它可以直接在另一个元件上或者也可以存在居中的元件,当一个元件被认为是“连接”另一个元件,它可以是直接连接到另一个元件或者可能同时存在居中元件,本文所使用的术语“垂直的”、“水平的”、“左”、“右”以及类似的表述只是为了说明的目的。
[0124]
除非另有定义,本文所使用的所有的技术和科学术语与属于本发明的技术领域的
技术人员通常理解的含义相同,本文中在本发明的说明书中所使用的术语只是为了描述具体的实施例的目的,不是旨在于限制本发明,本文所使用的术语“及/或”包括一个或多个相关的所列项目的任意的和所有的组合。
[0125]
请参阅图1-7,本发明提供一种技术方案:
[0126]
基于零担物流配送的实际业务场景,本算法采用的是基于iterated local search(ils)算法的优化框架,在此基础上根据业务场景和约束条件,采用运筹学理论中对于解决运输问题的数学模型,进行优化调整。
[0127]
ils基本原理是从给定的初始解s0开始,应用局部搜索函数localsearch(s0)得到一个局部最优解,然后对当前最好的局部最优解进行扰动,得到一个新的初始解s0,继续优化和扰动,重复寻优过程直到满足迭代终止条件其中算法程序代码如下:
[0128][0129][0130]
考虑到数据量和时效性要求,算法还需要在框架上,结合聚类算法进行了升级,使其更加符合运输实际场景需求。
[0131]
算法具体方案如下:
[0132]
1)区域划分:为了降低计算复杂度,首先基于配送点地址信息以及配送点的订货商品数量、配送点的收货时间窗口限制,对配送点进行区域划分,针对多区域规划场景,设置区域分配顺序;
[0133]
2)构造初始解:然后根据路径规划系统接收到的配送点信息、订单信息、可用车型信息,调取路网数据,在满足车型装载限制、配送点车型限制的基础上,构造较优的初始路径规划结果;
[0134]
3)聚类:然后采用凝聚层次聚类算法(自底向上)对初始解进行聚类,从而提高局部搜索模块的运算效率;
[0135]
4)类内迭代局部搜索:对属于同一聚类内的路径,调用局部搜索函数,得到局部最优解,随后,对得到的局部最优解进行扰动,得到新的初始解,不断迭代直至达到停止条件。(注:算法的停止条件是通过设置最大迭代次数或程序运行时间限制进行实现的。)
[0136]
5)比较并记录最优结果:记录每轮优化得到的局部最优解并进行比较,得到每种
分配顺序下的最优解;记录并比较多种分配顺序下的最优解,得到最优分配顺序下的全局最优解。
[0137]
整体的算法框架设计如图1所示:
[0138]
注意,在算法框架中:
[0139]
1)“区域”并非严格意义上的地理区域clustermethod()在具体实现中是将同一运输模式下属于同一省份的订单视作在同一个“区域”;
[0140]
2)在实现初始化的getcluster()函数中,是先调用初始解模块得到每个区域的初始路径,再对其进行聚类,初始解模块主要包含预处理pruning和构造初始解initialroute两个模块。其中,预处理模块中的simplified_graph()函数通过限制两个订单的配送点之间的车程预先筛选不可行路网线路,构造初始解模块主要通过基于节约启发式算法(saving heuristic)思想的constract_improve()函数构造初始路径;
[0141]
3)在迭代局部搜索模块,单次局部搜索优化通过converge_loaclsearch()函数实现,函数中按顺序依次应用了reversevist、insert_best、exchange_best、reversevist2四种优化算子。
[0142]
整个算法的结构和各模块的运行逻辑如下
[0143]
s1:读取数据
[0144]
需要传入的数据有车型信息、配送点信息、订单信息、装车点信息、路网数据。数据传递格式为json。
[0145]
车型信息包括:车型编号、最大体积、最大载重、最大服务配送点数目、最大装载商品件数、开始服务时间、最大运行时间、最大行驶里程、每公里收费、运输模式、是否返回装车点、车牌对应省份、车牌对应城市。
[0146]
配送点信息包括:配送点编号、名称、地址、所在省份、所在城市、经度、维度、车辆限制、时间窗口、交接时间。
[0147]
订单信息包括:订单编号、配送点编号、商品体积、商品重量、订单运输模式、商品件数。
[0148]
装车点信息包括:装车点编号、装车点地址、经度、纬度。
[0149]
路网数据包括:路径编号、起点名称、终点名称、起点代码、终点代码、距离最小_距离、距离最小_时间、距离最小_费用、时间最快_距离、时间最快_时间、时间最快_费用、起点坐标、终点坐标、起点地址、终点地址;
[0150]
io模块下readdata中包含读取订单、车辆、配送点、路网和配置参数信息的函数,通过函数读取数据文件(.json)后,利用readlocation()函数提取配送点对应的省份、城市信息,利用readin()函数生成距离邻接矩阵和添加订单的门店编号属性,并将读取和生成的数据存储到相应的数据项对象中;
[0151]
s2:参数配置
[0152]
common模块下定义的parameter类主要定义了算法中需要配置的参数和对他们进行读取和检验配置情况的函数;
[0153]
算法中需要配置的参数及具体含义、取值方式如下:
[0154]
strategy:选择何种策略,三种可选(时间最快、距离最短、费用最省)
[0155]
minrun:车辆再次使用最小时间,小于此运行时间的车辆再次被使用,默认值为4;
[0156]
numofcluster:每个区域的内部聚类数,若为null则算法自动判断聚类数;
[0157]
enablevolumecapacity:是否启动体积容量限制,必须开启至少一种容量限制enableweightcapacity:是否启动重量容量限制,必须开启至少一种容量限制;
[0158]
enableqtycapacity:是否启用件数限制,必须开启至少一种容量限制;
[0159]
usestoretimewindow:是否启用配送点的工作时间窗口;
[0160]
usestoreservicetime:是否启用配送点的交接时间;
[0161]
usestorerecommendvehicletypelimit:是否启动配送点的车辆类型限制
[0162]
usestoreregionlimit:是否启用配送点区域限制;
[0163]
usevehicletimewindow:是否启用车辆时间窗口;
[0164]
usevehicletransporttypelimit:是否开启车辆运输类型限制;
[0165]
enablevehiclereuse:是否开启车辆重复使用;
[0166]
usevehiclemaxuse:是否启用车辆最大使用次数;
[0167]
allowwaittime:允许等待时间,单位:分钟;
[0168]
vehicleallowusetime:车辆允许被使用的最短剩余工作时长,单位:小时;
[0169]
timelimit:算法允许的最大运行时长,单位:秒,默认值为300;
[0170]
numofoperator:每个聚类内的算子操作次数默认值为100*订单数;
[0171]
numofiteration:迭代搜索次数默认值为20,建议设为20以内;
[0172]
numofsequence:尝试的分配顺序次数默认值为10;
[0173]
usestorepriority是否启用配送点的优先级;
[0174]
s3:聚类算法
[0175]
算法中的聚类部分是通过cluster模块下clustermethod类中的相关函数实现的,该模块包含按区域聚类函数getclusterbyprovince()和初始解聚类函数getcluster()两个主要函数,以及getcluster()的两个子函数kmedoids()和getsimilaritymatrix(),如图2;
[0176]
getclusterbyprovince()函数:通过获取订单的运输模式和省份信息,将订单划分到不同的区域中,实现算法最初的按订单进行区域聚类;
[0177]
getcluster()函数:首先调用了pretreatment模块下pruning类中的函数simplified_graph()对订单进行预处理,然后调用了strategy模块下initialroute类中的constract_improve()函数得到各个区域的初始路径,最后调用kmedoids()函数对初始路径进行聚类;
[0178]
为提高算法效率,算法采用先聚类再在类内迭代搜索的方式对目标函数进行优化,其中getcluster()函数是中聚类部分是基于凝聚层次聚类思想,通过kmedoids()算法对初始路径进行聚类。
[0179]
凝聚层次聚类的算法框架如下:
[0180]
input:n条初始路径
[0181]
output:k个初始路径的聚类
[0182]
step1:初始每条路径各自为一个簇,即初始有n个簇;
[0183]
step2:计算每个簇之间的距离(使用平均距离average linkage计算,它将两个簇之间的距离定义为第一个簇中的数据点与第二个簇中的数据点之间的平均距离),得到簇
与簇之间的相似度矩阵;
[0184]
step3:选择距离最短的两个簇,若将这两个簇合并后不违反约束条件,则将这两个簇合并;否则返回step2选择距离次短的两个簇;
[0185]
step4:重复step2,step3直到当前的簇数量等于k,算法终止。
[0186]
kmedoids算法是一种基于“代表对象”的聚类方法,遵循凝聚层次聚类的基本思想,每次选簇中位置最中心的对象,即中心点(medoids)作为新的中心,迭代直到簇中对象分布不再变化。选取簇中心点的准则函数是:遍历簇中所有点,选取当前簇中所有其他点到该中心点的距离之和最小的点。
[0187]
k-medoids算法步骤如下:
[0188]
a)任意选取k个点作为medoids;
[0189]
b)按照与medoids最近的原则,将剩余点分配到当前最佳的medoids代表的类中;
[0190]
c)在每一类中,计算每个成员点对应的准则函数,选取准则函数最小时对应的点作为新的medoids;
[0191]
d)重复step2~step3的过程,直到所有的medoids点不再发生变化,或已达到设定的最大迭代次数。
[0192]
s4:关键实现
[0193]
包括构造初始解、优化算子操作、迭代局部搜索和可行性检验,如图3。
[0194]
在每种分配顺序下,先调用initialroute生成初始解,然后采用clustermethod中的聚类方法对初始路径进行聚类,类内采用iterlocalsearch中的迭代局部搜索方法进行多次迭代和局部搜索,每次进行局部搜索时调用operator中的算子操作方法对初始解进行优化;记录每种分配顺序下的最优解,遵循iterlocalsearch()函数中的比较思路,比较得到最优分配顺序下的全局最优解;最后使用checksolution中定义的函数检验解的可行性。
[0195]
s4.1:构造初始解
[0196]
i.初始选择车辆:检查所有可用车辆,原则上优先使用大车,同车型优先选择用剩余工作时长更长的车辆;
[0197]
ii.选择seed顾客(select_seed):优先考虑有车型约束的订单,然后在满足时间窗约束下找到最佳seed,这里优先选择最近的seed顾客;
[0198]
iii.判断剩余订单能否被装载,如果查询不到装载车辆,则将剩余订单记录到未分配订单中;
[0199]
iv.安排剩余顾客:判断当前路径上的配送点数目是否超过车辆最大配送点数量和,若仍满足车型和装载约束,则在满足时间窗口约束下搜索所有顾客,每次选择使其改变最小的最佳顾客插入路径,直至订单被分配完或不再满足容量约束;
[0200]
v.检查路径:检查初步路径构造结果。构造完当前聚类下所有路径后,再检查每条路径的装载情况,判断是否需要换车。如果需要进行换车,搜索所有可以再使用的车辆(若开启车辆多次使用参数,则包含可再次调用的车辆),计算更换车辆后的成本,如果换车后成本降低,则更换当前路径所用的车辆,否则不进行换车;
[0201]
vi.得到最终的初始解后,检验初始解分配的正确性和路径纪录的正确性,同时为了保证订单不遗漏和重复选择,检查剩余订单数。
[0202]
s4.2:优化算子操作
[0203]
共定义了6种算子操作,包括2种基本算子insert和remove,4种优化算子reversevist、reversevist2、insert_best和exchange_best;
[0204]
局部搜索函数中共用到了4种优化算子,其中reversevist和reversevist2为路径内优化算子,insert_best和exchange_best为路径间优化算子,每类优化算子的目的都是构造给定解的领域;
[0205]
insert算子:将订单i插入到当前路径的第j个位置上,如图4;
[0206]
remove算子:将订单i从当前路径的第j个位置上移除,如图5;
[0207]
reversevist算子:交换一条路径上连续的两个订单的访问顺序,直到执行该算子后仍无法改善当前路径为止;
[0208]
reversevist2算子:对于每条路径中的订单,先从路径中移除掉该订单,然后在路径上选择最佳插入位置,执行最佳交换,直到执行该算子后仍无法改善当前路径为止;
[0209]
insert_best算子:移除一条路径上的某个订单,将其重新插入到另一条路径中。若路径结果有所改善,则执行该算子并选择最佳插入位置,否则不执行;
[0210]
exchange_best算子:通过交换两条不同路径上的订单,形成两条新的路径。将订单从路径中移除后,搜索聚类内的其他所有路径,寻找最佳交换订单并进行交换,并返回交换前后两条路径上目标函数的改变值。若目标函数改变值大于0,则执行交换操作,否则不执行;
[0211]
s4.3:迭代局部搜索
[0212]
迭代局部搜索模块实现了算法中对初始解的优化部分,主要分为迭代和局部搜索两块,包含的函数有m_converge_loaclsearch()、converge_loaclsearch()、shake()、object()、cost_split();
[0213]
i:m_converge_loaclsearch()迭代函数
[0214]
迭代的具体过程为:根据初始路径聚类结果,计算出当前初始解,然后对类内的所有路径进行类内局部搜索即可得到局部最优解。搜索结束后,利用扰动算子随机反转若干条路径上的订单访问顺序,得到新的初始解。重复“搜索-扰动”过程(最后一次不扰动)至满足迭代停止条件后,比较并输出全局最优解;
[0215]
在迭代过程中,应注意记录每轮局部搜索的最优结果,在迭代过程结束后,比较得出全局最优解,并注意将车辆使用情况定位回全局最优解;
[0216]
ii:converge_loaclsearch()局部搜索函数
[0217]
在局部搜索函数中,算子的具体使用顺序:先调用路径内优化算子reversevist,再在满足剩余可用时间约束(注:算法剩余可用时间不是指总剩余时间,而是指满足所有聚类至少可进行一轮优化的剩余可分配时间)和默认算子操作次数的约束下,依次使用路径间优化算子insert_best和exchange_best,若使用insert_best算子后没有改善,则继续调用exchange_best算子,直到违反约束或达到收敛跳出(若对所有订单都实行insert_best和exchange_best算子操作后仍没有改善,则判断为达到收敛),跳出后,再次调用路径内优化算子reversevist2来对路径进行优化,进一步改善目标函数;
[0218]
iii:shake()扰动算子
[0219]
通过内置的shuffle()函数反转全部路径上的订单访问顺序实现扰动。也可设置为随机反转若干条路径;
[0220]
iv:object()目标函数
[0221]
根据不同的策略,设计和计算相应的目标函数;
[0222]
v:cost_split()成本拆分函数
[0223]
将路径成本拆分为车辆费用、燃油费用和过路费用;
[0224]
s4.4:可行性检验
[0225]
checksolution类中定义了对算法正确性进行检验的函数,checksolution()函数:检验得到的最优解是否满足所有约束:
[0226]
a)当前可分配所有订单都被分配,且不被重复分配;
[0227]
b)车辆不超重,不超时;
[0228]
c)门店满足车型要求;
[0229]
d)满足车辆使用限制(次数、时间等)。
[0230]
s5:结果输出
[0231]
实现了订单分配路径规划结果的输出,包含以下内容:
[0232]
最优方案:未被分配路径的订单数、check是否通过、总路程、数据读取时间、路径构造和优化、总的过路费;
[0233]
最优方案中每条路径的具体信息:每条路径对应的车辆编号、装载体积、车辆最大装载体积、装载重量、车辆最大装载重量、装载率(体积、重量)、出发时间、车辆用时、车辆最大服务时间、费用(总费用、车辆费用、燃耗费用、过路费用)、车辆行驶距离、车辆最大行驶距离、路径中配送点数目、路径中订单数目;
[0234]
每条路径的订单配送顺序;
[0235]
每条路径的配送点配送顺序,预计到达时间,预计交接时长;
[0236]
若由于运输产能的不足导致存在未被分配的订单,需要输出未被分配路径的订单编号。
[0237]
具体实施例:
[0238]
实施例1
[0239]
应用系统调用算法提供的规划接口进行路径计算,如图6具体应用系统与算法是分离的,算法独立部署,具体实施和操作流程如下:
[0240]
1.应用系统独立进行路网、订单、车型数据的管理;
[0241]
2.在需要路径规划时,抽取数据,将算法所需要的路网、订单、车型数据形成一个整体数据包,作为输入参数调用算法;
[0242]
3.算法根据输入的数据内容计算出具体的规划结果信息,反馈到应用系统。
[0243]
4.应用系统获得规划数据后,进行后需要的使用;
[0244]
采用这种实施方法,对于应用系统的改造相对简单,只需要跟算法之间通过约定的接口就可以完成算法的调用,将应用系统从简单的信息化工具升级为智能算法工具,而且应用程序本身部署上,对于服务器的要求不变。缺点是系统与算法之间的交互存在通讯和数据传递上的消耗,同时也需要考虑通讯时的网络中断等异常情况,而且提供算法的服务器需要独立部署,并且配置需求比较高
[0245]
实施例2
[0246]
算法嵌入应用系统,实现整体路径规划以及相应功能,如图7;
[0247]
算法是应用系统的一部分,具体实施和操作流程如下:
[0248]
1.应用系统管理路网、订单、车型数据的管理;
[0249]
2.用户按照需要,进行智能规划;
[0250]
a.从应用的订单数据库中,确定订单范围;
[0251]
b.从应用的车型数据库中,确定车型范围和数量;
[0252]
c开始规划,调用算法;
[0253]
d.算法根据订单范围、车型范围和数量以及数据库中的路网信息,计算规划结果,存储到数据库的规划中;
[0254]
3.配送任务的管理中,根据数据库中的运输规划结果,发布具体的配送任务;
[0255]
从而采用这种实施方法,对于应用系统的进行了彻底改造,整体应用系统将功能、算法、数据结合成了一个整体,在用户体验上比较完美,同时数据管理、数据展示的实时性、完整性都比较完善;
[0256]
在针对500个有不同收货时间窗口要求的配送点,3000张不同温层要求的运输订单,每单平均10项货品并且体积和数量各不相同,5种不同限装体积、重量的货车类型,这种复杂的应用场景下,通过算法,5分钟内就可以得到自动规划结果,规划结果中,涵盖了上述运输要求,并给出每个线路中的配送点的运输顺序,预计到达时间和预计交接时长,并在运输成本上达到最优。;
[0257]
规划结果通过2个月与实际手工排车规划相比,每日可有效节省5%~10%运输车次,车辆里程节省10%~20%,平均运输时长节省10%~20%,运输成本减少5%~15%。
[0258]
尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献