OUTLINE
- 前言
- 预备知识预警
- 什么是column generation
- 相关概念科普
- Cutting Stock Problem
- CG求解Cutting Stock Problem
- 列生成代码
-
reference
00 前言
这几天勤奋的小编一直在精确算法的快乐学习之中不能自拔。到列生成算法这一块,看了好几天总算把这块硬骨头给啃下来了。然后发现网上关于列生成的教学资料也不是很多,大部分讲的不是那么通俗易懂。所以今天就打算写一写这个算法,尽可能写得通俗易懂。
01 预备知识预警
由于列生成算法涉及的知识点非常多,所以在开始之前希望读者必须要具备以下的基础知识,不然就没法往下玩了:
- 线性规划以及线性规划对偶问题
- 单纯形法原理
- 原问题的影子价格(shadow price)以及对偶变量
- 单纯形法非基变量进基时非基变量检验数(reduce cost)的计算
以上内容我就不展开科普了。如果对这些概念还有不熟悉的小伙伴,一定要回去搞清楚再往下看哦。
02 什么是column generation?
2.1 相关背景
Column generation 是一种用于求解大规模线性优化问题的非常高效的算法。[3]其理论基础是由Danzig等于1960年提出。本质上而言,列生成算法就是单纯形法的一种形式,是用来求解线性规划问题的。列生成算法已被应用于求解如下著名的NP-hard优化问题:机组人员调度问题(Crew Assignment Problem)、切割问题(Cutting Stock Problem)、车辆路径问题(Vehicle Routing Problem)、单资源工厂选址问题(The single facility location problem )等。
2.2 larger linear programs
在某些线性优化问题的模型中,约束的数目有限,但是变量的数目随着问题规模的增长会爆炸式的增长,因此不能把所有的变量都显性的在模型中表达出来。比如下面一个线性规划问题:
\[ min (y_1 +...+y_n) \\ R1: a_{11}y_1+...+a_{1n}y_n \ge 10 \\ R2: a_{21}y_1+...+a_{2n}y_n \ge 40 \\ R3: a_{31}y_1+...+a_{3n}y_n \ge 80 \\ \]
从中可以看出,约束条件只有三个,但是当n=10000时,其变量数就达到了10000个。这类问题就是大规模的线性优化问题了。
2.3 column generation
单纯型法虽然能保证在数次迭代后找到最优解,但是其面对变量很多的线性规划问题就显得很弱了。因为它需要去在众多变量里进行基变换,就上面的问题而言,你想想你要在近10000个变量里面找个能进基的,活着不好吗?
再有,在用单纯形法求解这类线性规划问题时,基变量(basic variable)只与约束的个数相关,每次迭代只会有一个新的非基变量(non-basic variable)进基,因此,在整个求解过程中其实只有很少一部分变量会被涉及到。
因此,有人基于单纯型法提出了列生成算法。其思路大概如下:[1]
-
先把原问题(master problem)restrict到一个规模更小(即变量数比原问题少的)的restricted master problem,在restricted master problem上用单纯型法求最优解,但是此时求得的最优解只是restricted master problem上的,并不是master problem的最优解。
-
此时,就需要通过一个subproblem去check在那些未被考虑的变量中是否有使得reduced cost小于零的?如果有,那么就把这个变量的相关系数列加入到restricted master problem的系数矩阵中,回到第1步。
经过反复的迭代,直到subproblem中的reduced cost rate大于等于零,那么master problem就求到了最优解。
看算法流程图会更加直观哦:[2]