获取相当路径_一种新的带时窗车辆路径问题的优化算法

论文作者:MARTIN DESROCHER

论文发表时间:1990

这个车辆路径问题包含最小分配路线成本的集合,起始和终点都在仓库,为每位客户组建车队进行服务。每个客户只能被服务一次,而且所有的客户必须分配一辆车,车辆要满足载重约束。虽然已经发现启发式算法在解决各种实际规模的VRPTW方面非常有效和高效,最佳方法落后很多。本文的贡献是为VRPTW开发了一种新的优化算法,该算法能够最佳地解决规模远大于文献中迄今为止任何尝试的问题。第1部分文献综述,第2部分VRPTW集合划分模型和列生成算法的提出。第3部分讨论了子问题的设计。第4部分介绍了集合覆盖模型。也讨论了线性集合覆盖模型的解和子问题的动态规划算法。分支定界方法获取整数解在第5部分。在第6部分我们展示了计算的结果。

1文献综述

2集合覆盖模型

详细的介绍看原论文。这个模型除了小规模问题,路径的数量会非常的大无法直接解决。用列生成来解决集合划分的LP松弛问题。

3子问题的设计

设计了3个模型和4个节点的例子来说明。

8535b88e56765517dce7295e0e9f9935.png

定义

作为最小的部分路径从仓库到节点i的边际成本,所有在S集合中的节点仅访问一次并且准备好离开节点i在时间t或者更晚。
能被计算通过递推方程:

这里稍微说明下,注意公式后面的min中的内容分为两个部分,以“|”符号为界限。通过i节点扩展到j节点,“|”前面的指明通过i节点扩展后,会获得一个包含j节点的集合S和到达j节点的时间t,如果之前的标签中有相同的S和t(注意两者要相同),然后删除大的边际成本

保留小的边际成本
。"|"后面的3个是需要满足的条件。这是一个NP-hard问题。因此,没有伪多项式算法。

第一个模型具有一组所有可能的路径作为解决方案空间。在上图的例子仅仅有11条可行的路径

e468a9ece89446d39a12d03359917891.png

(d,1,d),(d,2,d),(d,3,d),(d,1,2,d),(d,1,3,d),(d,2,1,d),(d,2,3,d),(d,3,1,d),(d,1,2,3,d),(d,2,1,3,d),(d,2,3,1,d)。这里可行路径是通过类似上图的列举得到。

松弛掉一条路径中一个节点只能出现一次的条件,并且S节点的集合我们替换为q载重的集合(这里可以减少集合的数量)。这就是第二个模型,我们重新定义载重为q,时间为t的最小边际成本

从仓库到节点i,有

公式理解和

相同,自己领会。新的动态规划算法可以最为多重背包问题,也是NP-hard难题。然而,有伪多项式算法去解决它,详情看4.2。

第二个模型的解的空间要比第一个模型大(路径集合中的路径多)。在我们的例子中,有22条路线,除了上面提到的11条路径还有: (d, 1, 2, 1, d),(d, 1, 3, 1, d), (d, 2, 1, 2, d), (d, 3, 1, 3, d), (d, 1, 2, 1,2, d), (d, 1, 2, 1, 3, d), (d, 1, 2, 3, 1, d), (d, 1, 3, 1, 3,d), (d, 2, 1, 2, d), (d, 2, 1, 3 1, d), (d, 3, 1, 3, 1,d)。引入了一个术语2-cycles,类似于(i,j,i)的形式。比说(d,1,2,1,d)路径中(1,2,1)就是一条2-cycles路径。第三个模型就是要消除这些2-cycles路径。为了保证没有2-cycles路径,论文中为从仓库到节点i保留了两个标签(相同的(q,t))。分别称为最好和次好的路径。

是从仓库到节点i部分路径(之所以称之为部分路径是因为没有回到d)的最小边际成本。定义
作为路径节点i的前置节点(没错只是代表节点,后面的(q,t)可能只是代表那一条路径)。让
是第二小的边际成本在从仓库到节点i路径。保证这个路径的前置节点不能和
相同。

这两个公式很长,但道理很简单,首先注意所有的公式都包含在min中,也就是说

两者选择一个,避免2-cycles路径产生的选择。

这里有点绕,理清一下。如果从节点i扩展到j,先求最小解,如果j不是节点i的前置节点,取最小的i节点计算,否则取次小的i节点计算。再求j的次小解,既然因为次小解是为了防止2-cycles路径所存在的。所以i节点不应为次小解的前置(

),初次之外与最小解的流程相同即可。

这第三个动态规划问题也是多重背包问题,但是有伪多项式去计算它。这个模型路径集合的数量也要比第一个模型要多,比第二个模型要少。在上面的4个节点的例子中只比第一个模型多了一条路径(d,1,2,3,1,d)。

4 集合覆盖模型

第2部分提到VRPTW的集合划分模型。然而基于实现的原因,我们无法继续直接使用这个模型。此外, 集合覆盖模型的线性松弛在数值上比集合划分模型的线性松弛要稳定得多(不得而知)。通过使用第5节中描述的分支定界方案,从集合覆盖模型导出的解决方案对于集合划分模型是可行的。

为了去介绍这个集合覆盖模型,让

是一个常量路线r访问i为1,否则为0(和
没有啥区别呀)。添加两个新的变量
分别代表车辆的数量和行驶的距离。注意集合覆盖模型如下:

(除了松弛掉原来的约束条件,没差别吧)

使用当前列优化LP构成了列生成过程的第一阶段(不懂的自己去找书看,推荐留德华叫兽:【学界/编码】从下料问题看整数规划中的列生成方法(附Gurobi求解器源代码))。

第二阶段,发现最小的边际成本路径(要是负的)。4.1第一阶段,4.2第二阶段。

4.1 线性的集合覆盖模型

单纯型法被使用去解决这个线性松弛的集合覆盖模型。初始化

列(也就是客户节点的数量,为每个客户单独的分配一辆车)。

我们会获得约束(2)(3)(4)对偶变量(dual variable)

获得路径

的边际成本

带入到
中得到
进一步化简为

上面这个式子推到下面的弧线的边际成本不难吧

至此第一阶段结束,论文中说同时产生多个列能加速LP松弛的求解。此外,由于车辆路径应用的集合覆盖特征表现出高退化性,我们通过约束(2)右侧的扰动策略进一步加速单纯形法的收敛(原文翻译,这里应该指的是

的情况)。

4.2 解决子问题

采用了Desrochers 1988年提出的为每个节点分配2组标签。第一组包括与可行路径相关联的标签,并定义最初的解决方案,其提供每个节点处的有效解决方案的成本的上限。第二组包括与具有给定状态值(q,t)的节点j处结束的路径的成本的下限相关联的标签。从仓库到节点j相关联的标签的获取是通过扩展所有从仓库到节点i的路径,要求弧(i,j)满足约束。可以看到,每次迭代都在单个节点上创建,意思就是说比如只有1,2,3,4个客户节点,初始化(d-1,d-2,d-3,d-4),从节点1开始创建,d-1-2,d-1-3,d-1-4,然后再节点2,d-2-1,d-2-3,d-2-4,d-1-2-3,d-1-2-4等等。时间复杂度

首先解决第二个模型使用这个方法,上下界通过

表示所有在j点状态(q,t)有相同的下界和上界的集合(注状态(q,t)的集合,也就是说有相同的上下界(q,t)状态的)。
的补集。

如果

字典序(啥意思自己查)小于
当且仅当
或者
(注意这不是优势规则,无法删除其中任何一个标签)

step1 初始化

step2 创建一个新的状态(q,t)(满足约束,之前这里一直以为是搜索一个之前一直存在的状态(q,t)。)规则是在所有上下界不等的状态集合

中挑选出最小的字典序状态值(q,t),如果
停止(停止这个算法)

step3(q,t)状态的最后一个节点为j,处理节点j计算新的下界和上界:

第二个模型应用这个方法很简单,取节点i的标签,j的上界就用节点i的上界计算,j节点的下界就用节点i的下界计算。更新
返回
step2。这里说下
的作用,
中保存的是节点j中上界和下界相同的(q,t)。初始化上界和下界是不相同的
,什么情况下会出现相同的情况,遇到的第一个(q,t)的情况肯定赋值给下界,第二个(q,t)才会赋值给上界。再考虑第一个(q,t)产生的
和第二个(q,t)产生的
相等的情况。首先保证两者不是同一条路径,载重相同我们姑且认为访问的客户节点相同,最后到j节点的时间t相同。那么再节点j这个(q,t)就不会再考虑了。

现在我们再描述使用2-cycles消除去解决第三个模型。让

分别是
的上下界。
是节点j在(q,t)的次好
也可以理解为
,它没有下界。因为它比较帅。

step1 初始化

的前置节点为
。初始化
最后初始化

step2 创建一个(q,t)要求和上面的一样。

step3 处理节点j(懒得打了)

e0f19cd0f9cad7f03eb82378e96330b4.png

f385a976064e7313b8ba75123a0d4cf7.png

注意区分次好路径和上下界的区别。

5 分支定界方案

当子问题不会产生任何负的边际成本的列,这个单纯型法提供了处理这个松弛的集合覆盖模型最优解。如果解都是整数并且每个客户只被服务一次这个解决方案就是最终的解决方案。但事情往往不是那么顺利的,或者说不可能那么顺利的。解可能存在小数解或者每个客户不仅仅被访问过一次。在任何一种情况下,都必须探索分支绑定树,并且可能在每个分支处生成其他列。然而,在实践中,从未出现过度覆盖。此外,如果成本矩阵满足严格的三角不等式,则保证不会发生这种情况。分支定界策略的设计在列生成方案中极为重要,因为分支决策是参考生成列的分数解决方案进行的,并且这些分支决策必须与子问题结构兼容以生成新的列。为VRPTW设计的分支策略可以分为两类。在第一级,需要使用的车辆数量和行驶总距离的完整性。这个分支的层次包含集合覆盖模型所有的列。在下一个层,分支决策网路中的弧中进行。这第二个层次仅仅包含很少的列。

在第一阶段,如果车辆的使用的数量是分数

,两个分支被创建,一个为
分别为向下取整和向上取整。在每种情况下,与约束(3)相关联的对偶变量被充分的转移到了子问题中。接下来每次分支,如果解还是小数,可以在行进的总距离上增加一个切口。事实上,如果
是分数,
,行程总距离的削减相当于将X
限制为大于或等于

这个对偶变量

也是简单的转化为子问题。在分支定界树中每个需要的位置重复该第一级过程。每次利用车辆数量的分支策略或总距离的切割时,当前的解决方案变得不可行。可以使用单纯形算法的阶段I和II或双单纯形算法来执行重新优化。

在第二级,分支决策是在子问题网络的弧上进行的。注意,可以将分数变量

固定为1。通过将路径上每条弧的值固定为1,即删除网络中其它的弧和路径中相关联的节点。对于
直接固定为零是相当重要的。相反,有必要探索路线弧的流量值的许多组合。

介绍下弧的流量

是在列生成中路径的集合。
是否在路径k上,如果在为1 。
路径k是否启动1

首先选择包含循路的列。对于每个列,记录所给弧中节点访问次数大于1。弧的得分是该弧上总流量值的函数,即来自所有非零基本变量的流量的组合。这个弧的最好的得分被选择并且两个分支被创建0,1。如果不存在包含循环的列,则接下来检查小数变量。如果列的每个弧的总流量值为1,则丢弃其中一些(这里的丢弃是不参与分支)。对于其它的,计算得分(取决于变量值)。 接下来,对于具有良好分数的列集,每个弧由得分(其取决于弧上的组合流量值)来评估。选择得分最高的弧并且两个0-1分支被创造了。如果弧

固定为0,它可以很简单的子网络中被删除。生成的所有使用该弧的列的成本都会受到惩罚。然而这个集合覆盖模型的解可行但成本非常的高。在对当前列进行优化之后,根据需要生成新列。如果弧
固定为1,弧
被移除从子问题网络。此外,使用弧
也被惩罚并且新列根据需要添加。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值