01 粒子表达方式


PSO求解VRPTW最关键的一步就是如何用一个粒子对VRPTW的解进行表示,本文采用一种常见的表达方式,假设顾客数目为L,车辆最大使用数目为M,则所构造的一个粒子位置为一个2行L列的矩阵,第1行为Xv,表示各个顾客对应的车辆编号,第2行为Xr,表示各个顾客在对应的车辆路径中的执行次序
假设顾客数目为6,车辆最大使用数目为3,则一个可能的粒子[Xv;Xr]如下其中顾客编号是为了让各位更容易理解粒子的表达方式:顾客编号:1 2 3 4 5 6
Xv:2 2 1 3 1 2Xr:3 1 2 1 1 2
上述粒子表达的含义为:顾客1由第2辆车在第3个位置服务,顾客2由第2辆车在第1个位置服务,顾客3由第1辆车在第2个位置服务,顾客4由第3辆车在第1个位置服务,顾客5由第1辆车在第1个位置服务,顾客6由第2辆车在第2个位置服务。

因此,配送方案如下(0表示配送中心):
第1辆车:0->5->3->0
第2辆车:0->2->6->1->0
第3辆车:0->4->0


粒子群优化算法(PSO)求解带时间窗的车辆路径问题(VRPTW)_java

02 初始化粒子群


在了解用一个粒子对VRPTW解的表达方式后,接下来我们趁热打铁继续学习如何初始化粒子群。相信各位小伙伴已经知道初始化粒子群实际上就是初始化粒子的速度和位置


位置初始化

在01节中,我们已经学习到:Xv表示各个顾客对应的车辆编号,Xr表示各个顾客在对应的车辆路径中的执行次序。假设顾客数目为L,车辆最大使用数目为M,则Xv中每个位置上的元素都应该为1~M的随机数,Xr中每个位置上的元素都应该为1~L的随机数。


但是此时Xr会出现一个问题,假设顾客数目为6,车辆最大使用数目为3,一个可能的粒子如下:

Xv:2 2 1 3 1 2Xr:6 4 2 3 5 5这种情况下,不能直接判断出顾客被服务的次序,因此需要稍作调整。首先将第1辆车服务的顾客3和5放在一起,第2辆车服务的顾客1、2和6放在一起,第3辆车服务的顾客4放在一起。然后按照各个顾客的Xr从小到大的顺序将顾客排序进行服务。
第1辆车:顾客3对应的Xr为2,顾客5对应的Xr为5,因为2<5,所以第1辆车的路线为0->3->5->0第2辆车:顾客1对应的Xr为6,顾客2对应的Xr为4,顾客6对应的Xr为5,因为4<5<6,所以第2辆车的路线为0->2->6->1->0第1辆车:顾客4对应的Xr为3,因为只有顾客4一个人所以第3辆车的路线为0->4->0


除了上述问题外,在使用下述公式更新粒子位置的时候,一定会出现Xv和Xr不是整数的情况,此时我们该如何处理?

其中k为迭代次数;  为第  代粒子  的位置;  为第  代粒子  的位置;  为第  代粒子  的速度;  为第  代粒子  的速度;  为第  代个体最优粒子  的位置;  为第  代全局最优粒子的位置;  和  为  之间的随机数;  和  为常数。
如果在更新粒子位置过程中Xv不为整数,则对Xv向上取整然后,对Xv和Xr中超越边界值的元素赋值为边界值。

假设顾客数目为6,车辆最大使用数目为3,此时更新完位置后一个可能的粒子如下:Xv:2.5 2.1 -1.2 3.9 0.6 6.7Xr:6.6 4.3 2.8 3.9 5.3 -5.6则首先对Xv向上取整,Xv=[3 2 -1 4 1 7],对Xv中越界的元素进行处理,将Xv中的-1赋值为1,Xv中的4赋值为3,Xv中的7赋值为3,则Xv=[3 2 1 3 1 3]。对Xr中的元素进行越界处理,将Xr中的6.6赋值为6,-5.6赋值为1,则Xr=[6 4.3 2.8 3.9 5.3 1]。此时解码出的配送方案如下:第1辆车:0->3->5->0第2辆车:0->2->0

第3辆车:0->6->4->1->0


速度初始化

速度初始化和位置初始化基本相同,Xv对应速度Vv,Xr对应速度Vr。假设顾客数目为L,车辆最大使用数目为M,则Vv中每个位置上的元素都应该为-(M-1)~(M-1)的随机数,Vr中每个位置上的元素都应该为-(L-1)~(L-1)的随机数。Vv和Vr在更新的过程中,也需要进行越界处理,这里不再赘述。


粒子群优化算法(PSO)求解带时间窗的车辆路径问题(VRPTW)_java

03 relocate局部搜索操作


菜鸟VRP求解引擎为何如此强大?(一)这篇推文中我们讲解了关于VRP的多个局部搜索算子,本次推文主要讲解使用relocate局部搜索算子来提高解的质量。
实际上,在对粒子进行解码后,得到的配送方案大概率不会满足时间窗约束和装载量约束,因此relocate算子的目的是降低惩罚成本,提高解的质量,具体操作步骤如下:

STEP1:判断是否满足终止条件,不满足转至STEP2,满足转至STEP5。

STEP2:计算配送方案VC每条路线上各个顾客违反时间窗约束的值,即等于车辆开始对顾客服务的时间-该顾客的右时间窗,如果大于0,则说明此顾客已违反约束,该值越大,则说明违反时间窗约束越严重。从每条路线中挑选出违反时间窗约束最大的顾客,并储存到矩阵Record中,第1列记录违反约束的顾客,第2列记录违反时间窗约束的值,如果该条路线没有违反约束的顾客,则该条路线所对应的Record两列值记为0转至STEP3

STEP3:如果此时Record中存在大于0的数,则在Record第2列中找出最大违反时间窗约束值所对应的顾客removed,然后将removed从VC中移除,得到RVC,转至STEP4。如果此时Record中的数全部为0,则对VC进行GENE操作(详见菜鸟VRP求解引擎为何如此强大?(一)),降低行驶总距离,转至STEP1

STEP4:将顾客removed插回到RVC中满足约束且总距离增量最小的位置,得到新的VC。

STEP5:终止循环,得到局部搜索后的配送方案VC。

粒子群优化算法(PSO)求解带时间窗的车辆路径问题(VRPTW)_java

04 PSO求解VRPTW整体思路


STEP1:初始化参数
STEP2:初始化粒子群
STEP3:while gen<=MAXGEN
             遍历每一个粒子
                 更新粒子速度;
                 对速度进行越界处理;
                 更新粒子位置;
                 对位置进行越界处理;
                 对该粒子进行relocate局部搜索操作;
                 计算该粒子目标函数值;
             end
             更新个体最优;
             更新全局最优;
             gen=gen+1;
       end