Branch-and-Cut(CVRP问题)

Branch and cut 是一个基于线性规划的 branch and bound 方法,通过 有效不等式来加强 线性松弛
  • 有效不等式 由分割过程(separation procedures )动态产生
  • 并且通过不断添加有效不等式来提高当前的界(bound)
branch and cut:过程:
 
  1. 预处理(preprocessing)
  2. 生成割平面(Cut generation)
  3. 管理 线性松弛(LP relation)
  4. 搜索策略(Search strategy)
  5. 分支策略(Branching strategy)
  6. 启发式(Primal heuristics

1、Preprocessing

为一个有效不等式,并且 的上下界分别为,
  •  隐含界(Implied bounds):

如果: 那么 会有 

(至少让能取到的最小值,满足条件? 至少存在一个?)

  • 预处理:

如果存在 ,那么约束是冗余条件(redundant) (利用x的取值范围,可以得到 π x 在松弛下最小值,如果这个值依旧小于π0,那么约束没意义

  •  0-1 integer program:

    • 如果(系数过正,且系数过大,需要取0,才有可能满足范围)
    • 如果(系数为负,必须选中第K项,才有可能满足范围)

2、Managing the LP Relaxations

实际中,生成的不等式数量过大,必须保证LP松弛规模尽量小或者牺牲效率(sacrififice effiffifficiency

两种方式:

  • 限制在每次迭代时增加的cuts数量:
    • 新生成的cuts装进缓存(buffer)中,每次迭代添加buffer中少量的违反规则的cuts
  • 删除逐渐无效的cuts:
    • 对偶值为0(接近“0”)
    • 松弛变量为基变量(basic)
    • 松弛变量为正值(positive)

 3、Cut Generation and Management

  •  branch and cut 的关键问题是:什么时候生成并且生成哪种有效不等式
  • Structural cuts 由 problem-specifific separation生成
  • 对于一个给定点生成的 有效cut ,将被储存在cut pools中用于后用
  • cut pool 还可以被用作进行分割(separation)的辅助工具
  • 生成的cuts数量很多,需要谨慎保存

Two-commodity Flow Formulation of the CVRP

  •  模型使用两个流变量 ,来表示一个车辆最大负载容量为Q的VRP问题解

  •  如果车辆从 i j 那么表示车辆当前的负载(load)情况,相对的 则表示剩余空间empty space
  • 为 G添加点n+1(即出发点depot 0的复制点)生成的图
  • 于是有

       ; 

  •  表示集合补集complementary set
  • 其中为0-1变量,当边存在结果中时,为“1”
  • 则是与边相关的两条流

Two-commodity formulation  模型如下:

 目标:

             所选边的代价最小

   对于同一点,在两个不同方向流上经过了两次消                                                                                 耗,每次消耗 qi

      从初始点“0”到每个顾客点“i”的流量和,就是每个顾客点的容量之和

                                                (从空载出发,只经过一个点

      相反,每个顾客点“i”到的初始点“0”的流量和,为M辆汽车                                 减掉每个顾客点的容量(满载汽车容量为“Q”最后访问的顾客点容量为qi

          任何一条边会包含来回两个方向

    两个不同方向的流量(负载)和 为车的最大负载容量“Q”

经过LP松弛,可以用变量进行改写

目标:

        相当于最小化 cij之和?

         从第“n+1”个点(反向第一个点)出发时,此时每个流容量是“Q”

   对于顾客节点“i”,只与两个其他节点相连,因此即便                                                               访问所有节点V,也只有两组(4条流,且两两相加为“Q”)

 

  • 给定一个可行解  ,令为其对应图
  • 其中,

 例子:

初始化线性松弛实例 E- n22 - k4    (n=21, M =4, Q=60):

  •  由图可知,边degree超过“1”,因为(超出了最大容量),因此加入约束:

                              

  •  同样,从解可以看出,两边中 流都为“0”,于是加入下面几个流约束:

    • 如果{i,j}在结果中,那么  从  i->j  的流最少要等于:           (流的载量一定 不低于 下一个节点需求量
    • 或者,同样地:

         经过变换,将其中一个yij换成                                                                           Q- yji,化简可得,上式两边均乘Q,意义不变

加入上述约束后 ,结果变为

 考虑集合 ,其中 与外界相连的部分的总和

并且,

于是,下面的约束成立:

 

(i , j 分别属于集合S及其补集) 

左式表示,S与S补集之间的连接流数; 右式表示, 至少需要几辆车

 要想覆盖S区域,一定要足够的车(容量)来满足流量要求,车进入S后,再离开,往返至少需要两条通路

设计启发式算法来求得初解:

Greedy Randomized Algorithm

  •  这个过程需要对一部分顾客的子集进行迭代操作
  • 给定一个
  • 对于两个不相连顶点集表示的是从的所有边集合
  • 每次迭代时, 对于每个都重复进行如下操作
    • 为顾客点,从而:                                  选尽可能多S 与 外界相连的情况
    •  如果当前结果违背了与子集之间的不等式关系,那么这个不等式将加到LP程序中,然后更新是不是反了?)这个过程不断反复,知道S包含了所有的顾客点
  •  第一个将由顾客点的子集随机产生

在加入142个 容量约束后,下界等于3750.00,并且此时的结果是整数解

 如果结果是非整数,那么分支(branching)将用来解决最优性

 分支规则如下:

选择一个集合,产生两个子问题:

  • 子问题 :确保个车辆访问集合S:

  • 子问题:确保至少有个车辆访问集合S:

     

  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值