车辆路径问题的基本操作

  • 0.引言
  • 1.解的表示方法
  • 1.1 基于分解的解表示
  • 1.2基于序列的解表示
  • 2.构造方法
  • 3.优化算子
  • 3.1基于分解的解表示的优化算子
  • 3.2基于序列的解表示的优化算子
  • 3.2.1 交叉算子
  • 3.2.2 变异算子


0.引言

  车辆路径问题一般被描述为:对一系列客户点,组织适当的行车路线,使车辆有序地通过它们,在满足一定的约束条件(如车辆容量限制等)下,达到一定的目标(如路程最短等)。由于车辆路径问题是NP难问题,很难在有限的时间内获得满意的解。(元)启发式方法能够在合理的计算时间内针对大规模问题得到高质量的解。
  启发式算法的基本思想:首先根据具体的问题构造初始解,然后不断得对存在的解采用优化操作进行优化,直到满足终止条件时,返回最终获得的解。在启发式算法中,如何生成初始解和如何对解进行优化直接影响启发式算法的性能。本博客首先介绍了车辆路径问题解的表示方法,然后给出了两种生成解的构造方法,最后给出了针对不同解形式的优化算子,其细节如下所示。

1.解的表示方法

  车辆路径问题一般被描述为:对一系列客户点,组织适当的行车路线,使车辆有序地通过它们,在满足一定的约束条件(如车辆容量限制等)下,达到一定的目标(如路程最短等)。车辆路径问题的解由不同的表示方式,分别为: 基于分解的解表示和基于序列的解表示。

1.1 基于分解的解表示

java 车辆路径预判 车辆路径问题的算法_java 车辆路径预判,其中java 车辆路径预判 车辆路径问题的算法_自动驾驶_02 是路集R中的第k条路径。每条路径由其服务的客户点表示,形如java 车辆路径预判 车辆路径问题的算法_构造方法_03 ,其中java 车辆路径预判 车辆路径问题的算法_交叉算子_04表示第k条路径中第i个客户点,java 车辆路径预判 车辆路径问题的算法_java 车辆路径预判_05 表示车场。基于分解的解表示方法如图1所示:

java 车辆路径预判 车辆路径问题的算法_交叉算子_06

1.2基于序列的解表示

  基于序列的解表示,又称先路径,后聚类的方法。可以用图来表示,如图2:

java 车辆路径预判 车辆路径问题的算法_交叉算子_07


上图中存在一个中心车场和围绕它的一组客户点。首先,我们形成了一个从车场到周围所有客户点,并最后返回车场的“大路线”(即,一辆车访问所有客户包括仓库);然后,将这个“大路线”最优地划分为一组可行的车辆路线;最后,将车辆路线安排给车辆。这就是先路径,后聚类的方法的主要内容。

2.构造方法

  在这一节中介绍两个构造方法,分别为基于插入的构造方法和基于成本的构造方法,如算法1和算法2所示。

java 车辆路径预判 车辆路径问题的算法_交叉算子_08


java 车辆路径预判 车辆路径问题的算法_自动驾驶_09

3.优化算子

  本节将针对不同的解表示方法,介绍其采用的优化算子。

3.1基于分解的解表示的优化算子

  这种解的表示方法以路径为优化单位,其邻域操作分为路径间操作和路径内操作,如图3所示:

java 车辆路径预判 车辆路径问题的算法_交叉算子_10


  java 车辆路径预判 车辆路径问题的算法_交叉算子_11从选定的路径中随机地选择一个客户,然后将该客户从现有路径中删除,最后重新将其插入到所有合法位置中的最好位置。如图 3-4 所示,客户 2 从路径1 中被选择出来,插入到路径 2 中。

java 车辆路径预判 车辆路径问题的算法_交叉算子_12


  java 车辆路径预判 车辆路径问题的算法_java 车辆路径预判_13从选定的路径中随机地选择任意多个客户(不多于该路径中所有客户的个数),然后将这些客户依次重新插入到其对应的最好位置。如图 3-5 所示,客户 2 和客户 3 从路径 1 中被选择出来,然后客户 2 被插入到路径 2 中,客户 3 被插入到路径 3 中,一条新的路径。

java 车辆路径预判 车辆路径问题的算法_自动驾驶_14


  java 车辆路径预判 车辆路径问题的算法_构造方法_15交换两条路径中的客户序列。具体操作如下:首先,随机选择两条路径。接着,在其中一条路劲中随机选择一个位置,而另一条路径中则尝试所有可能的位置。然后,在两条路径中,分别将选择出来的位置以后的所有客户看作一个客户序列。最后,交换这两个客户序列,并从中选择出提升最大的解。如图 3-6 所示,在路径 1 中,客户 3 对应的位置被选择出来,该位置以后所有的客户(客户2 和客户 8 )看作客户序列 I 。在路径 2 中,则尝试所有的可能,包括三种可能,分别为车场 0 、客户 1 和客户 7 对应的位置。最终,最好的解保留下来。客户 1对应的位置被作为选择出来,该位置之后的客户 7 被看作客户序列 II ,交换客户序列 I 和客户序列 II。

java 车辆路径预判 车辆路径问题的算法_启发式算法_16


  java 车辆路径预判 车辆路径问题的算法_构造方法_17从一条路径中选择一个客户片段,并将其移动到另一条路径中。如图 3-7所示,路径 1 中的片段 ⟨2,8⟩ 被移动到路径 2 中。

java 车辆路径预判 车辆路径问题的算法_java 车辆路径预判_18

java 车辆路径预判 车辆路径问题的算法_自动驾驶_19交换两个路径中的客户片段。如图 3-8 所示,路径 1 中的片段 ⟨2,8⟩ 和路径 2 中的客户片段⟨1⟩进行交换。

java 车辆路径预判 车辆路径问题的算法_java 车辆路径预判_20

java 车辆路径预判 车辆路径问题的算法_交叉算子_21 在选定的路径中选择一个客户片段,然后将其重新插入到该路径中的最优位置。如图 3-9 所示,路径 1 中的片段 ⟨4,5⟩ 被选择出来,重新插入到路径 1中客户 1 之后的最优位置。

java 车辆路径预判 车辆路径问题的算法_启发式算法_22


  java 车辆路径预判 车辆路径问题的算法_启发式算法_23 在选定的路径中交换两个客户的位置。如图 3-10 所示,路径 1 中的客户1 和客户 5 相互交换位置。

java 车辆路径预判 车辆路径问题的算法_自动驾驶_24

java 车辆路径预判 车辆路径问题的算法_启发式算法_25 在选定的路径中选择一个客户片段,然后将其进行倒置。如图 3-11 所示,将路径 1 中的片段 ⟨4,5,1⟩ 进行了倒置,形成了片段 ⟨1,5,4⟩

java 车辆路径预判 车辆路径问题的算法_构造方法_26

3.2基于序列的解表示的优化算子

  基于序列的解表示方法其优化算子分为交叉算子和变异算子,下面将详细介绍。

3.2.1 交叉算子

  交叉算子重新组合两个父代解(解决方案),创建一个或两个子代解(即:新解决方案)。

  在通用交叉(图1)中,将整个路径从一个路径计划复制到另一个路径计划,消除重复。

java 车辆路径预判 车辆路径问题的算法_构造方法_27

  在两点交叉(图2)中,将随机数量的连续客户从一个父节点复制到另一个父节点,去除重复。

java 车辆路径预判 车辆路径问题的算法_java 车辆路径预判_28

  边缘交叉(图3)包括(1)通过连接来自两个路径计划(父代)的边来构建新的中间解,(2)合并子路径创建可行解。

java 车辆路径预判 车辆路径问题的算法_交叉算子_29

3.2.2 变异算子

  变异机制用来增加解的多样性,下面介绍几种常用的变异算子。

  Swap 变异是交换一个路径计划中两个客户的位置。

java 车辆路径预判 车辆路径问题的算法_构造方法_30

  Insert变异包括将一个随机客户移动到路线计划中的新位置。

java 车辆路径预判 车辆路径问题的算法_交叉算子_31

  在Inversion变异中,路径计划中的的一部分客户被反转。

java 车辆路径预判 车辆路径问题的算法_启发式算法_32


  Displacement 变异是插入突变的一般化,插入突变移动的不是一个而是多个连续客户。

java 车辆路径预判 车辆路径问题的算法_java 车辆路径预判_33