列生成column generation算法,是求解大规模线性规划问题的一种常用算法,在运筹优化领域有着非常广泛的应用。
应用场景:因为整数规划更符合现实实际,因此它通常被应用于求解大规模整数规划问题的分支定价算法(branch-and-price algorithm)。当求解一个最小化问题时,列生成算法主要的作用是为每个搜索树节点找到一个较优的下界(lower bound)(默认为min问题,LP是IP的最好解,下界)。本质上而言,列生成算法就是单纯形法的一种形式,是用来求解线性规划问题的。
线性规划的单纯形法需要计算所有非基变量的检验数;而列生成算法通过巧妙构造子问题,让这一步不需要遍历所有变量,甚至都不需要知道一共有多少变量,只要能在每次迭代的时候生成一个或者多个变量,提升优化效果就可以了,通过不断加入新变量直到没有小于0的非基变量的检验数,至此求得最优解。链接: 求解实例及具体求解过程.
注:子问题是选择入基变量的,它的求解效率也挺重要。选择最大的检验数放入进来,就把这个变量的相关系数列加入到限制主问题(RMP)系数矩阵中进行求解。不断迭代反复。
本篇介绍它的最初形式,原理及应用。
即cutting-stock problem。有标准尺寸大卷20m,现顾客有3种需求,分别为3m、6m、9m的小卷,且分别需要25,60,90个。问怎么减少耗费的情况下满足顾客的需求?
这个问题在cplex和gurobi的代码例子中都有。
思路:
P1——>P2(set covering formulation)——>LMP(松弛掉整数约束)——>Sub-problem
得到线性规划问题的最优解后,向上取整,即得到整数规划的可行解。
注:
见下图1的LPM,xj向上取整,左边更大,约束仍然成立。
具体如下:
(1)常规建模P1,本质是指派问题
即min{消耗的大卷数}
但是:
当大卷数特别多时,比如几千几万几十万时求解不易。
第二,整数规划不易求解。
(2)转换角度,由切割方案出发,转化为P2(set covering formulation)
即min{切割各种方案消耗的大卷数}
这里的问题在于“需要提前列出所有的切割方案”,然而随着大卷宽度增加,顾客需求组合越来越多,列举所有的切割方案很不容易,并且处理起来也不容易。
第二,它也是个整数规划问题,所以求解也不易。
(3)所以我们松弛整数约束,将其转化为线性规划问题,这里叫做主问题(LPM)
即Linear programming master problem,此处解决了P2中的整数规划求解之难的问题,但是,P2里的第一个问题,也就是需要提前列出所有的切割方案集,还是比较困难的。
因此,列生成算法登场!也就是说列生成的精髓在于:不必求解大问题(线性规划原问题),而是一次次求解小问题(子问题)。
(4)不必在一开始就给出所有的切割方案集,只用给出部分方案就可以。求解只含有部分列的线性规划问题即限制主问题RLMP(Restricted master problem)。
(5)求解限制主问题,即线性规划问题,可以用单纯形法求解其对偶问题的最优解。
因为限制主问题是最小化问题,因此当所有的检验数全部非负时,才能达到最优;
只要有一个检验数为负,即表示目标函数还有进一步降低的可能,也就是问题还可以继续优化。
下料问题:因为一开始只有部分切割方案,我现在再找到一个切割方案加到原问题,进基出基后,判断检验数。
假如添加之后,使得检验数为负,即求解结果得到改进,那说明这个切割方案加进去之后更好。若检验数非负,那问题没有得到改进,那就不要这个切割方案,即不加入这个切割方案。
理论:
要么找到一个<0的检验数,使其出基,那么就把这一列j(新的切割方案)加进去。
如果找不到j使解得到改进,即证明不可能再有新一列了。那么就要证明不再有检验数<0,即证明所有的检验数>=0。
(6)我们可以这么理解,与其找一个<0的检验数使解改进,不如找最小的检验数予以改进(改进更快),那么就转化为下面这个优化问题,即子问题Subproblem。
只要最小的检验数为非负,那么所有的检验数一定都大于0了。此时,就能达到最优。
而如果最小的检验数为负数,那么将其添加到限制主问题中,继续求解。
注: 还是一开始的下料问题。现在有3种大卷,还是要切割成小卷。如:有标准尺寸大卷15m、20m、25m,现顾客有3种需求,分别为3m、6m、9m的小卷,且分别需要25,60,90个。问怎么减少耗费的情况下满足顾客的需求? 相当于3个标题一中的下料问题。此时为并行机问题,目前在调度、排班等领域经常用到。 应用列生成解决时,与一中的区别在于: 1.将整数规划问题松弛为:线性规划 主问题LPM linear programming master problem,用列生成求解线性规划主问题LPM。 D-W可以重写formulation,使其变为一个具有非常非常多变量和列的数学模型。那么就可以利用列生成了,这个放在篇2写。
1.参数定义
m:顾客需求的种类数;系数矩阵的行数,约束条件
n:所有的方案集。系数矩阵的列数,变量数
在实际问题中,我们在一开始通常给出的是m种方案,m列(m即客户的需求种类数m行),也就是给出m列m行,是满秩状态,因此保证一开始能求解。
否则:
m>n时,即约束条件>变量数,此时无解。
m二、延伸(并行机问题)
求解子问题的时候,每次要求解3类子问题;找到每类子问题的单纯形因子也就是检验数之后,再继续代入到原问题中,等等等等。三、总结