运筹学教学|列生成(Column Generation)算法(附代码及详细注释)

核心提示本文发布于公众号【数据魔术师】同名文章,欢迎给我们私信,留言一起交流秦虎教授的联系方式为微信号:43340630,更多新文章请关注微信公众号:数据魔术师01 列生成算法的背景多年来,寻找大规模的、复杂的优化问题的最优解一直是决策优化领域重要

本文发布于公众号【数据魔术师】同名文章,欢迎给我们私信,留言一起交流秦虎教授的联系方式为微信号:43340630,更多新文章请关注微信公众号:数据魔术师
01 列生成算法的背景多年来,寻找大规模的、复杂的优化问题的最优解一直是决策优化领域重要的研究方向之一。列生成算法通常被应用于求解大规模整数规划问题的分支定价算法中,其理论基础是由Danzig等于1960年提出。

当求解一个最小化问题时,列生成算法主要的作用是为每个搜索树节点找到一个较优的下界。

本质上而言,列生成算法就是单纯形法的一种形式,是用来求解线性规划问题的。列生成算法已被应用于求解如下著名的NP-hard优化问题:机组人员调度问题、切割问题、车辆路径问题、单资源工厂选址问题等。02 列生成算法的基本思想在某些线性优化问题的模型中,约束的数目有限,但是变量的数目随着问题规模的增长会爆炸式的增长,因此不能把所有的变量都显性的在模型中表达出来。

在用单纯形法求解这类线性规划问题时,基变量只与约束的个数相关,每次迭代只会有一个新的非基变量进基,因此,在整个求解过程中其实只有很少一部分变量会被涉及到。

简单来说,列生成算法通过求解子问题,来找到可以进基的非基变量,该非基变量在模型中并没有显性的写出来(可以看成是生成了一个变量,每个变量其实等价于一列,所以该方法被称为列生成算法)。如果找不到一个可以进基的非基变量,那么就意味着所有的非基变量的检验数(reduced cost)都满足最优解的条件,也就是说,该线性规划的最优解已被找到,即使很多变量没有在模型中写出来。03 列生成算法实例——板材切割问题(Cutting Stock Problem)3.1问题描述 木材厂卖木材,某顾客需要25根3英尺的木材、20根5英尺的木材和15根9英尺的木材,木材厂通过切17英尺的木材来满足顾客的需求。

为了尽量减少木材的浪费,可以用线性规划方法来实现这个目标,同时用列生成来解这个线性规划问题。3.2切割方案 切割过程中,木材厂要确定木材的切割方案(cutting combination)。

举例说明,一根17英尺的木材可以切成3根5英尺的,这种切割方案将造成2英尺木材的浪费,实际过程中有很多种可能的切割方案,但是不合理的切割方案不需要被考虑。

例如,只把17英尺木材切成一根9英尺,然后扔掉8英尺的方案明显不合理,因为我们可以把它切成一根9英尺、5英尺和3英尺的木材。总的来说,任何一种切割方案浪费木材量超过3英尺,我们都认为是不合理的,因为可以用浪费的木材去获得一根或多根3英尺的木材。不合理的切割方案不会在最优解中出现,因此不需要考虑。

根据以上规则,我们可以枚举出以下六种切割方案。

 
友情链接
鄂ICP备19019357号-22