列生成算法column generation求解思路总结篇2——CW分解

目录

1.CW的思路

2.CW重写模型

3.DW分解算法步骤


列生成是通过重写模型为P2,然后松弛主问题(只考虑m个变量),再通过对偶理论的思路构造子问题,即寻找最大改进主问题的非基变量进入松弛主问题,直到不能改进为止。也就是说,子问题不断生成新列(P2中新的可行解)添加到松弛主问题中,改进松弛主问题的解,直到不能改进位置,则找到了最优解。

所以列生成算法中,重写模型,即reformulation为集合覆盖模型是关键,而后构造的子问题也容易求解,那么列生成就能够实现,效果也比较好。

CW分解是类似的思路,也是让子问题不断生成新列添加到松弛主问题中,让松弛的主问题不断逼近一开始的原问题,直到不能改进时,可以认为松弛的主问题等价于原始问题了

也就是说,CW分解,先重写模型,而后利用列生成的思路求解,即原问题——主问题LPM——松弛主问题RLPM——子问题——对偶子问题Dual subproblem,就可以了。

1.CW的思路

CW算法的本质是每一次子问题反馈回来的信息都会产生一个新的顶点,也就是说从多面体的角度思考,每次产生一个新的顶点。

我们知道,原始的IP问题只要找到它的凸包,那么就可以用LP直接进行求解。因为LP的最优点一定在顶点取到,凸包的顶点就是整数点。

但是凸包不容易获取,不过我们知道凸包可以认为是最外围整数点的所构成的多面体,那么只要找到最外围整数点,即顶点不就可以找到凸包了吗?CW就是建立在这个思路基础上的,不断去寻找多面体的顶点(所有的顶点要么很多,一下子找不出来;要么找到了,也不容易写),进而去近似找到它的凸包。而不断寻找多面体顶点,1个个加入多面体顶点的过程,用得就是列生成的思路。

2.CW重写模型

CW对模型结构是有要求的,只有是块状结构的模型,才能使用。块状模型如图中右下角所示,即有连接约束(耦合约束)所组成的复杂约束,也有分块的简单约束。

这里复杂和简单的区分可以理解为维度,简单约束只有很少的变量组成,彼此是独立的,那么每个子问题都很容易求解,继而加和就可以得到总目标。但因为复杂约束的存在,这些块约束并不是独立的,而是彼此相关的,因此问题就复杂了。

2.CW分解

我们可以把连接/耦合/复杂约束,通过构造拉格朗日乘子,把它移到目标函数中去,再通过合并同类项,也就是拉格朗日松弛的思路。再拉近gap的距离,通过分析,就可以写出新的模型了。

在这个新的模型中,简单约束所形成的的子问题是完全独立的,目标函数中各个子问题也是互相独立的,那么原问题就转化为几个子问题的叠加了。求解的维度就降低了(这其实是拉格朗日分解的思路)。这里的关键在于,目标函数中子问题是完全独立的,也就是不包含原来的变量(此时只包含拉格朗日乘子。)

 

但是,在实际中往往是包含原来变量x^k的(即closed-form),也就是说,以上通过拉格朗日直接分解的思路是走不通的。因此我们想其它办法,通过对原问题进行处理,通过其它办法进行解决。

以下才真正进入正题,开始CW方法。

原始的问题,我们称为P问题,其中左边最长的那条约束就是我们说的复杂约束,其它简单约束我们用第二条集合约束的形式来表示。第二个框中表述形式(矩阵表示)和第一框(展开表示)是一样的。关键在于左2到左3的变形。 

这里要用到,Minkowski-Weyl's Theorem定理(它在benders分解时也会用到)。这一定理其实我之前在线性规划和对偶规划学习总结中提到过。这里再做一下说明。如果以下说明看不懂,可以看我之前线性规划和对偶规划的文章第3.4-3.5部分。

定理主要说明了这么几点:

 (1)多面体中的点(包含顶点),可以用极点和极方向的锥组合线性表示。其中,极点和极方向的权重必须都>=0,且极点的权重之和为1。更具体的说,若多面体有界,可以用极点的线性组合表示(可以认为极方向的权重为0);若多面体无界,可以用极点和极方向的线性组合表示。

(2)整数规划中的可行解为多面体内的整数点,同样可以用极点和极方向的锥组合线性表示。只不过此时,极点的权重只能取到0或1。

(3)极点、顶点,是等价的,一个意思。

1.所以我们根据上述的Minkowski-Weyl's Theorem,可以把x^{k}写成\sum_{t=1}^{T_{k}}\lambda _{kt}x^{kt},也就是极点的凸组合。注意这里还是IP问题,因为极点的权重取值是0/1。合并同类项后可以变为框中的第4个模型。注意,这4个模型是等价的,仍然是IP问题;框中的第4个模型需要把所有的极点都写出来,这个工作量太大了,就像列生成中需要把所有pattern都列出来一样,不现实,因此我们只列举部分。也就是利用列生成的思路。

 之后的思路和列生成基本一样了。

首先我们对左1(IPM)进行线性松弛得到2(LPM),权重lamda取值从0/1变成了>=0。这里需要注意一点,正常线性松弛0/1应该变为[0,1],但是这里只写了>=0,原因是上面有sum(lamda)=1的约束,所以相当于肯定不会超过1,所以只写了>=0即可。

通过对LPM进行拉格朗日松弛,得到其对偶模型,如图中3(Dual of LPM)所示。其中pai指的是LPM第一族约束的拉格朗日乘子,miu指的是LPM第二族约束的拉格朗日乘子。

2.现在问题已经转变为怎么找到LPM问题的所有顶点,注意这里的顶点其实就是x^{kt},对应的就是LPM中的一列。所以我们通过列生成的思路,先构造限制主问题(RLPM),再不断通过子问题添加新列,就可以更新并改进RLPM,直到最后检验数为非负,即不能继续改进,那么就逼近了原始问题,求解结束。

注意,构造的限制主问题首先选取的是每个分块结构(子系统)中的一个元素,也就是说从初始的所有极点的集合Tk已经变为Pk,这也是我们称之为RLPM的原因,因为只是其中一部分。对偶问题也随之变化。同时我们注意到,原来的DLPM问题中约束很多,而DRLPM中约束只是其中的一部分,即进行了松弛,因此后者,即DRLPM的解更好。也就是说,DRLPM的解要好于DLPM,根据强对偶理论,原始问题和对偶问题的解相等,因此也可以得到,RLPM是LPM的一个上界。相当于往上拉近gap了(这个和最小化问题中,拉格朗日函数再取max类似。)

3.接下来就是RLPM的求解过程以及添加新列到限制主问题LPM的过程了。

求解RLPM,可以得到它的解,以及它所对应的对偶问题的解。想要RLPM得到改进,就需要找到非基变量检验数非负的变量然后添加到RLPM就可以得到改进(这就是列生成的思路)。 我们知道非基变量的检验数其实等同于对偶问题变量的相反数,因此当非基变量检验数为正,意味着对偶变量为负,即对偶问题不可行;反之,当非基变量检验数为非正,意味着对偶问题可行。

因此我们可以直接令非基变量检验数为正,对应着对偶问题的约束条件,此时是对偶问题不可行。换言之,我们不断求解子问题,找到对应的x^k,让对偶问题从不可行到可行。

当子问题求解最优解为有界时,将对应的最优的极点添加进限制主问题中;当最优解无界时,将极方向添加进限制主问题中。

当找不到可以改进原问题的列时,算法停止。

3.DW分解算法步骤

1.Column generation & BP

2.《Optimizations in Operations Research》second edition——Ronald L.Rardin

3.运筹优化原理与实践—第14次课—Dantzig-Wolfe decomposition

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值