- 有效不等式 由分割过程(separation procedures )动态产生
- 并且通过不断添加有效不等式来提高当前的界(bound)
- 预处理(preprocessing)
- 生成割平面(Cut generation)
- 管理 线性松弛(LP relation)
- 搜索策略(Search strategy)
- 分支策略(Branching strategy)
- 启发式(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: