论文作者:MARTIN DESROCHER
论文发表时间:1990
这个车辆路径问题包含最小分配路线成本的集合,起始和终点都在仓库,为每位客户组建车队进行服务。每个客户只能被服务一次,而且所有的客户必须分配一辆车,车辆要满足载重约束。虽然已经发现启发式算法在解决各种实际规模的VRPTW方面非常有效和高效,最佳方法落后很多。本文的贡献是为VRPTW开发了一种新的优化算法,该算法能够最佳地解决规模远大于文献中迄今为止任何尝试的问题。第1部分文献综述,第2部分VRPTW集合划分模型和列生成算法的提出。第3部分讨论了子问题的设计。第4部分介绍了集合覆盖模型。也讨论了线性集合覆盖模型的解和子问题的动态规划算法。分支定界方法获取整数解在第5部分。在第6部分我们展示了计算的结果。
1文献综述
略
2集合覆盖模型
详细的介绍看原论文。这个模型除了小规模问题,路径的数量会非常的大无法直接解决。用列生成来解决集合划分的LP松弛问题。
3子问题的设计
设计了3个模型和4个节点的例子来说明。
定义
这里稍微说明下,注意公式后面的min中的内容分为两个部分,以“|”符号为界限。通过i节点扩展到j节点,“|”前面的指明通过i节点扩展后,会获得一个包含j节点的集合S和到达j节点的时间t,如果之前的标签中有相同的S和t(注意两者要相同),然后删除大的边际成本
第一个模型具有一组所有可能的路径作为解决方案空间。在上图的例子仅仅有11条可行的路径
(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的最小边际成本
公式理解和
第二个模型的解的空间要比第一个模型大(路径集合中的路径多)。在我们的例子中,有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))。分别称为最好和次好的路径。
这两个公式很长,但道理很简单,首先注意所有的公式都包含在min中,也就是说
这里有点绕,理清一下。如果从节点i扩展到j,先求最小解,如果j不是节点i的前置节点,取最小的i节点计算,否则取次小的i节点计算。再求j的次小解,既然因为次小解是为了防止2-cycles路径所存在的。所以i节点不应为次小解的前置(
这第三个动态规划问题也是多重背包问题,但是有伪多项式去计算它。这个模型路径集合的数量也要比第一个模型要多,比第二个模型要少。在上面的4个节点的例子中只比第一个模型多了一条路径(d,1,2,3,1,d)。
4 集合覆盖模型
第2部分提到VRPTW的集合划分模型。然而基于实现的原因,我们无法继续直接使用这个模型。此外, 集合覆盖模型的线性松弛在数值上比集合划分模型的线性松弛要稳定得多(不得而知)。通过使用第5节中描述的分支定界方案,从集合覆盖模型导出的解决方案对于集合划分模型是可行的。
为了去介绍这个集合覆盖模型,让
(除了松弛掉原来的约束条件,没差别吧)
使用当前列优化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等等。时间复杂度
首先解决第二个模型使用这个方法,上下界通过
如果
step1 初始化
step2 创建一个新的状态(q,t)(满足约束,之前这里一直以为是搜索一个之前一直存在的状态(q,t)。)规则是在所有上下界不等的状态集合
step3(q,t)状态的最后一个节点为j,处理节点j计算新的下界和上界:
现在我们再描述使用2-cycles消除去解决第三个模型。让
step1 初始化
step2 创建一个(q,t)要求和上面的一样。
step3 处理节点j(懒得打了)
注意区分次好路径和上下界的区别。
5 分支定界方案
当子问题不会产生任何负的边际成本的列,这个单纯型法提供了处理这个松弛的集合覆盖模型最优解。如果解都是整数并且每个客户只被服务一次这个解决方案就是最终的解决方案。但事情往往不是那么顺利的,或者说不可能那么顺利的。解可能存在小数解或者每个客户不仅仅被访问过一次。在任何一种情况下,都必须探索分支绑定树,并且可能在每个分支处生成其他列。然而,在实践中,从未出现过度覆盖。此外,如果成本矩阵满足严格的三角不等式,则保证不会发生这种情况。分支定界策略的设计在列生成方案中极为重要,因为分支决策是参考生成列的分数解决方案进行的,并且这些分支决策必须与子问题结构兼容以生成新的列。为VRPTW设计的分支策略可以分为两类。在第一级,需要使用的车辆数量和行驶总距离的完整性。这个分支的层次包含集合覆盖模型所有的列。在下一个层,分支决策网路中的弧中进行。这第二个层次仅仅包含很少的列。
在第一阶段,如果车辆的使用的数量是分数
这个对偶变量
在第二级,分支决策是在子问题网络的弧上进行的。注意,可以将分数变量
介绍下弧的流量
首先选择包含循路的列。对于每个列,记录所给弧中节点访问次数大于1。弧的得分是该弧上总流量值的函数,即来自所有非零基本变量的流量的组合。这个弧的最好的得分被选择并且两个分支被创建0,1。如果不存在包含循环的列,则接下来检查小数变量。如果列的每个弧的总流量值为1,则丢弃其中一些(这里的丢弃是不参与分支)。对于其它的,计算得分(取决于变量值)。 接下来,对于具有良好分数的列集,每个弧由得分(其取决于弧上的组合流量值)来评估。选择得分最高的弧并且两个0-1分支被创造了。如果弧