目录

  • 相关教程
  • 相关文献
  • 前言
  • 从一个例子出发:Cutting Stock Problem
    • 问题描述
    • 分析
    • 建模
      • Master Problem(MP)
      • Restricted Master Problem(RMP)
      • Restricted Linear Master Problem(RLMP)
      • Dual of Restricted Linear Master Problem
      • Subproblem
    • 迭代
  • 列生成:Cutting Stock Problem
    • 问题描述
    • 建模
      • Master Problem(MP)
      • Restricted Master Problem(RMP)
      • Dual of Restricted Master Problem
      • Subproblem
    • 迭代
    • 流程图
  • 总结

列生成(Column generation)是一种解决大型线性程序的有效算法。

相关教程

  • 【从零开始】coin-or/CoinUtils Osi Clp Cgl Cbc源码构建debug(CLion/CMake)

相关文献

  • Column generation(wikipedia)
  • 干货 | 10分钟带你彻底了解column generation(列生成)算法的原理附java代码
  • 列生成和分支定价
  • 线性规划技巧: 列生成(Column Generation)
  • 列生成算法原理(单纯形基础)
  • 列生成(Column Generation)算法
  • 【Column Generation思考-02】|从对偶的角度理解Cutting Stock Problem【更新版本】
  • Gilmore P C, Gomory R E. A linear programming approach to the cutting-stock problem[J]. Operations research, 1961, 9(6): 849-859.
  • 运筹说 第21期 | 算法介绍之列生成算法

前言

之前一直想跟大家分享一下列生成(Column generation),也全网搜了许多文档、视频、论文等。大部分教程抽象程度较高,需要具备大量的基础知识才能看明白,于是写一篇尽可能0基础上手的分享,希望能帮到也在从事相关行业的你。

一定有人会问,有没有行生成算法?当然有啦!!!有机会之后给大家分享!!!——@小猪快跑

从一个例子出发:Cutting Stock Problem

问题描述

卖家有3种长度的木材:9cm(5元),14cm(9元),16cm(10元)。
买家需要木材:4cm(30根),5cm(20根),7cm(40根)。
于是卖家需要通过切割木材满足买家的需求,而且卖家希望成本最低从而达到受益最大。

分析

首先我们来简单思考下,一根9cm的木材能有多少种切法满足买家需要的4cm,5cm,7cm

cost(元) 切前木材长度(cm) 4cm木材数量 5cm木材数量 7cm木材数量
5 9 1 0 0
5 9 2 0 0
5 9 0 1 0
5 9 1 1 0
5 9 0 0 1

本着不浪费的中华传统美德,显然第二行的切法比第一行更好一些哟(^U^)ノ~YO
我们一般习惯称一种切割方法为cutting pattern
好啦,之后就非常easy的搞定之后的(只保留比较好的pattern)。

All Cutting Pattern:

cost(元) 切前木材长度(cm) 4cm木材数量 5cm木材数量 7cm木材数量 符号
5 9 2 0 0 x1x_1x1​
5 9 1 1 0 x2x_2x2​
5 9 0 0 1 x3x_3x3​
9 14 3 0 0 x4x_4x4​
9 14 2 1 0 x5x_5x5​
9 14 1 2 0 x6x_6x6​
9 14 1 0 1 x7x_7x7​
9 14 0 1 1 x8x_8x8​
9 14 0 0 2 x9x_9x9​
10 16 4 0 0 x10x_{10}x10​
10 16 2 0 1 x11x_{11}x11​
10 16 1 1 1 x12x_{12}x12​
10 16 0 3 0 x13x_{13}x13​

于是我们只需要从All Cutting Pattern里面确定每个Pattern需要几次就行了。(举个例子:比如x1=30\bm{x_1=30}x1​=30代表我们使用第1种切法切了30根9cm长度的木材)。

我们目标是用最少的钱完成买家的需求,也就是每个Pattern的cost×数量\bm{cost\times }\textbf{数量}cost×数量的总和。

5x1+5x2+5x3+9x4+9x5+9x6+9x7+9x8+9x9+10x10+10x11+10x12+10x135x_1+5x_2+5x_3+9x_4+9x_5+9x_6+9x_7+9x_8+9x_9+10x_{10}+10x_{11}+10x_{12}+10x_{13}5x1​+5x2​+5x3​+9x4​+9x5​+9x6​+9x7​+9x8​+9x9​+10x10​+10x11​+10x12​+10x13​

另外呢我们需要满足买家数量上的要求
4cm要超过30根:

2x1+x2+0x3+3x4+2x5+x6+x7+0x8+0x9+4x10+2x11+x12+0x13≥302x_1+x_2+0x_3+3x_4+2x_5+x_6+x_7+0x_8+0x_9+4x_{10}+2x_{11}+x_{12}+0x_{13}\geq 302x1​+x2​+0x3​+3x4​+2x5​+x6​+x7​+0x8​+0x9​+4x10​+2x11​+x12​+0x13​≥30

5cm要超过20根:

0x1+x2+0x3+0x4+x5+2x6+0x7+x8+0x9+0x10+0x11+x12+3x13≥200x_1+x_2+0x_3+0x_4+x_5+2x_6+0x_7+x_8+0x_9+0x_{10}+0x_{11}+x_{12}+3x_{13}\geq 200x1​+x2​+0x3​+0x4​+x5​+2x6​+0x7​+x8​+0x9​+0x10​+0x11​+x12​+3x13​≥20

7cm要超过70根:

0x1+0x2+x3+0x4+0x5+0x6+x7+x8+2x9+0x10+x11+x12+0x13≥400x_1+0x_2+x_3+0x_4+0x_5+0x_6+x_7+x_8+2x_9+0x_{10}+x_{11}+x_{12}+0x_{13}\geq 400x1​+0x2​+x3​+0x4​+0x5​+0x6​+x7​+x8​+2x9​+0x10​+x11​+x12​+0x13​≥40

建模

Master Problem(MP)

根据上面的分析,我们已经有了决策变量xix_ixi​,我们有了目标函数最少的钱,我们也有了相应的约束满足买家数量上的要求,于是乎我们可以来建模啦!!!

定义决策变量xi\bm{x_i}xi​为使用第iii种Pattern的根数。
min⁡5x1+5x2+5x3+9x4+9x5+9x6+9x7+9x8+9x9+10x10+10x11+10x12+10x13\min{5x_1+5x_2+5x_3+9x_4+9x_5+9x_6+9x_7+9x_8+9x_9+10x_{10}+10x_{11}+10x_{12}+10x_{13}}min5x1​+5x2​+5x3​+9x4​+9x5​+9x6​+9x7​+9x8​+9x9​+10x10​+10x11​+10x12​+10x13​
s.t.s.t.s.t.
2x1+x2+0x3+3x4+2x5+x6+x7+0x8+0x9+4x10+2x11+x12+0x13≥302x_1+x_2+0x_3+3x_4+2x_5+x_6+x_7+0x_8+0x_9+4x_{10}+2x_{11}+x_{12}+0x_{13}\geq 302x1​+x2​+0x3​+3x4​+2x5​+x6​+x7​+0x8​+0x9​+4x10​+2x11​+x12​+0x13​≥30
0x1+x2+0x3+0x4+x5+2x6+0x7+x8+0x9+0x10+0x11+x12+3x13≥200x_1+x_2+0x_3+0x_4+x_5+2x_6+0x_7+x_8+0x_9+0x_{10}+0x_{11}+x_{12}+3x_{13}\geq 200x1​+x2​+0x3​+0x4​+x5​+2x6​+0x7​+x8​+0x9​+0x10​+0x11​+x12​+3x13​≥20
0x1+0x2+x3+0x4+0x5+0x6+x7+x8+2x9+0x10+x11+x12+0x13≥400x_1+0x_2+x_3+0x_4+0x_5+0x_6+x_7+x_8+2x_9+0x_{10}+x_{11}+x_{12}+0x_{13}\geq 400x1​+0x2​+x3​+0x4​+0x5​+0x6​+x7​+x8​+2x9​+0x10​+x11​+x12​+0x13​≥40
xi∈Nx_i\in\mathbb{N}xi​∈N
每一列: 一种可行的切割方案需要被执行的次数,或者多少根棒材使用这种切割方案
每一行:一种棒材的需求必须要被满足

Restricted Master Problem(RMP)

有时候MP的规模会非常大,于是我们考虑如果先用几种Pattern得到一个可行的方案(可能不是最优解),然后我们有了这个可行解后再去依次看如果增加其他Pattern会不会有更好的解,而直接求解MP可能在给定时间内无法得到可行解。

于是顺着这个思路我们构建RMP(要注意我们选择的Pattern至少能得到一个可行解):

定义决策变量xi\bm{x_i}xi​为使用第iii种Pattern的根数。
min⁡5x1+5x2+5x3\min{5x_1+5x_2+5x_3}min5x1​+5x2​+5x3​
s.t.s.t.s.t.
2x1+x2+0x3≥302x_1+x_2+0x_3\geq 302x1​+x2​+0x3​≥30
0x1+x2+0x3≥200x_1+x_2+0x_3\geq 200x1​+x2​+0x3​≥20
0x1+0x2+x3≥400x_1+0x_2+x_3\geq 400x1​+0x2​+x3​≥40
xi∈Nx_i\in\mathbb{N}xi​∈N

Restricted Linear Master Problem(RLMP)

常规的列生成方法都是解决LP问题的,这时候我们做一些适当的松弛(也就是xi∈Nx_i\in\mathbb{N}xi​∈N变成xi≥0x_i\geq 0xi​≥0)。

于是顺着这个思路我们构建RLMP(要注意RLMP的可行解并不一定是RMP的可行解,但我们只需要把解上取整即可):

定义决策变量xi\bm{x_i}xi​为使用第iii种Pattern的根数。
min⁡5x1+5x2+5x3\min{5x_1+5x_2+5x_3}min5x1​+5x2​+5x3​
s.t.s.t.s.t.
2x1+x2+0x3≥302x_1+x_2+0x_3\geq 302x1​+x2​+0x3​≥30
0x1+x2+0x3≥200x_1+x_2+0x_3\geq 200x1​+x2​+0x3​≥20
0x1+0x2+x3≥400x_1+0x_2+x_3\geq 400x1​+0x2​+x3​≥40
xi≥0x_i\geq 0xi​≥0

然后我们可以用LP求解器直接求解上述模型(这里我用Clp来举例,当然你可以使用你喜欢的求解器)

(为了排版整洁方便阅读,我会把代码放在文末)

直接运行得到

理论上来说我们应该对结果上取整,但我们将在得到松弛后的MP解之后再上取整会更方便高效,所以这里我们不进行上取整不过好像刚好解是整数Σ(⊙▽⊙"a——@小猪快跑):
Objectivevalue=325Objective \: value = 325Objectivevalue=325
x1=5x_1 = 5x1​=5
x2=20x_2 = 20x2​=20
x3=40x_3 = 40x3​=40
我们试图来解释一下solution的含义:用5个Pattern 1(也就是说选了5根9cm的木材,每根都切成2个4cm),类似的又用了20个Pattern 2和40个Pattern 3,这样的选择能使我们总花费最少——325元。

Dual of Restricted Linear Master Problem

现在我们从另一个角度来考虑RMP
【卖家】直接购买成品(切割后的木材),转手卖给客户,类似中间商。
【卖家】目标:最多花多少钱购买成品挣得要比自己生产多。
【卖家】约束:需要给成品定一个心理价位。这些心理价位必须满足:对于任意切割方案,购买成品的钱 <= 自己生产的钱。(比如说,卖家花5元买到1根9cm的木材可以切割成2个4cm成品,也就是说卖家如果直接购买2个4cm的成品价格超过5元那不如自己生产了。写成公式:2y1≤52y_1\leq 52y1​≤5,其中y1\bm{y_1}y1​为4cm木材的心理价格)
————————————————————————————————————————————————————————
定义决策变量yi\bm{y_i}yi​分别为4cm(30根),5cm(20根),7cm(40根)木材的心理价格。
max⁡30y1+20y2+40y3\max{30y_1+20y_2+40y_3}max30y1​+20y2​+40y3​
s.t.s.t.s.t.
2y1+0y2+0y3≤52y_1+0y_2+0y_3\leq 52y1​+0y2​+0y3​≤5
y1+y2+0y3≤5y_1+y_2+0y_3\leq 5y1​+y2​+0y3​≤5
0y1+0y2+y3≤50y_1+0y_2+y_3\leq 50y1​+0y2​+y3​≤5
yi≥0y_i\geq 0yi​≥0

直接求解:

Objectivevalue=325Objective \: value = 325Objectivevalue=325
y1=2.5y_1 = 2.5y1​=2.5
y2=2.5y_2 = 2.5y2​=2.5
y3=5.0y_3 = 5.0y3​=5.0
我们试图来解释一下solution的含义:4cm、5cm、7cm成品木材的心理价格分别是2.5元、2.5元、5元,最多花325元购买成品挣得要比自己生产多。也就是说只要价格比2.5元、2.5元、5元低,卖家就赚了

Subproblem

  • 单纯形法检验数的含义:该产品(变量)的市场价格与该产品的隐含成本之差。市场价格高于隐含成本,即检验数大于零时,则可将该产品投入生产。
  • 原问题检验数对应其对偶问题的一个基解

如果你知道检验数的概念,会很快理解subproblem,不过在这里我会假设你不知道,试图用最简单的方法让你理解——@小猪快跑

dual问题中我们计算出成品的心理价格。接下来我们想知道是不是存在更省钱的Pattern。
首先我们来思考一下如何判定一个Pattern是不是更省钱。
例子1:9cm的木材完全浪费掉也是一种Pattern,但一根9cm的木材要5元,也就是说卖家损失了5元。
例子2:Pattern 9:14cm木材(9元)切割成2根7cm成品(使用Pattern 1、2、3的7cm心理价格是5元)。也就是卖家只用Pattern 1、2、3这三种切割方法的时候,只要用低于5元的价格购买7cm再卖掉就比自己切割赚钱了,而如果加上了Pattern 9,卖家如果用5元的价格就不如自己直接用Pattern 9来的赚钱,而是必须低于4.5元(9元/2)的价格购买7cm再卖掉才比自己切割赚钱。
有了上面两个例子我们已经逐渐清晰如何去判定一个Pattern是不是更省钱。
也就是说我们的目标是去寻找一个新Pattern:新Pattern切割后的成品在老Pattern下的心理价格 > 新Pattern的价格
定义决策变量aj\bm{a_{j}}aj​是新Pattern切割后4cm,5cm,7cm木材的数量。
新Pattern切割后的成品在老Pattern下的心理价格【2.5a1+2.5a2+5a32.5a_1+2.5a_2+5a_32.5a1​+2.5a2​+5a3​】>新Pattern的价格【9元(14cm)】
即:
2.5a1+2.5a2+5a3>92.5a_1+2.5a_2+5a_3>92.5a1​+2.5a2​+5a3​>9
⇒9−(2.5a1+2.5a2+5a3)<0\Rightarrow 9-(2.5a_1+2.5a_2+5a_3)<0⇒9−(2.5a1​+2.5a2​+5a3​)<0(不等号左边我们一般称之为检验数,这就是我们常说的检验数判定解是否是最优解
这里我们用一个约束转换成目标函数的小技巧:令z=9−(2.5a1+2.5a2+5a3)z=9-(2.5a_1+2.5a_2+5a_3)z=9−(2.5a1​+2.5a2​+5a3​),如果min⁡z\min zminz比0还大,那说明不存在z>0z>0z>0的解,也就是不存在更省钱的Pattern。
新Pattern切割后总长度不能超过原始木材长度:4a1+5a2+7a3≤144a_1+5a_2+7a_3\leq 144a1​+5a2​+7a3​≤14
综合起来就是:
min⁡9−(2.5a1+2.5a2+5a3)\min{9-(2.5a_1+2.5a_2+5a_3)}min9−(2.5a1​+2.5a2​+5a3​)
4a1+5a2+7a3≤144a_1+5a_2+7a_3\leq 144a1​+5a2​+7a3​≤14

于是我们分别建立9cm、14cm、16cm的Subproblem :
————————————————————————————————————————————————————————
Subproblem 1(9cm,5元)
定义决策变量aj\bm{a_{j}}aj​是Pattern切割后4cm,5cm,7cm木材的数量。
min⁡z=5−(2.5a1+2.5a2+5a3)\min{z=5-(2.5a_1+2.5a_2+5a_3)}minz=5−(2.5a1​+2.5a2​+5a3​)
s.t.s.t.s.t.
4a1+5a2+7a3≤94a_1+5a_2+7a_3\leq 94a1​+5a2​+7a3​≤9
ai∈Na_i\in\mathbb{N}ai​∈N
求解得:a=(2,0,0)T,z=0a=(2,0,0)^T, z=0a=(2,0,0)T,z=0
————————————————————————————————————————————————————————
Subproblem 2(14cm,9元)
定义决策变量aj\bm{a_{j}}aj​是Pattern切割后4cm,5cm,7cm木材的数量。
min⁡z=9−(2.5a1+2.5a2+5a3)\min{z=9-(2.5a_1+2.5a_2+5a_3)}minz=9−(2.5a1​+2.5a2​+5a3​)
s.t.s.t.s.t.
4a1+5a2+7a3≤144a_1+5a_2+7a_3\leq 144a1​+5a2​+7a3​≤14
ai∈Na_i\in\mathbb{N}ai​∈N
求解得:a=(0,0,2)T,z=−1\bm{a=(0,0,2)^T, z=-1}a=(0,0,2)T,z=−1
————————————————————————————————————————————————————————
Subproblem 3(16cm,10元)
定义决策变量aj\bm{a_{j}}aj​是Pattern切割后4cm,5cm,7cm木材的数量。
min⁡z=10−(2.5a1+2.5a2+5a3)\min{z=10-(2.5a_1+2.5a_2+5a_3)}minz=10−(2.5a1​+2.5a2​+5a3​)
s.t.s.t.s.t.
4a1+5a2+7a3≤164a_1+5a_2+7a_3\leq 164a1​+5a2​+7a3​≤16
ai∈Na_i\in\mathbb{N}ai​∈N
求解得:a=(4,0,0)T,z=0a=(4,0,0)^T, z=0a=(4,0,0)T,z=0

迭代

我们发现Subproblem 2的z<0z<0z<0,于是我们把a=(0,0,2)Ta=(0,0,2)^Ta=(0,0,2)T这个Pattern加入到RLMP中,因为这就是我们找到的更省钱的Pattern。
定义决策变量xi\bm{x_i}xi​为使用第iii种Pattern的根数。
min⁡5x1+5x2+5x3+9x9\min{5x_1+5x_2+5x_3+9x_9}min5x1​+5x2​+5x3​+9x9​
s.t.s.t.s.t.
2x1+x2+0x3+0x9≥302x_1+x_2+0x_3+0x_9\geq 302x1​+x2​+0x3​+0x9​≥30
0x1+x2+0x3+0x9≥200x_1+x_2+0x_3+0x_9\geq 200x1​+x2​+0x3​+0x9​≥20
0x1+0x2+x3+2x9≥400x_1+0x_2+x_3+2x_9\geq 400x1​+0x2​+x3​+2x9​≥40
xi≥0x_i\geq 0xi​≥0

求解后得到:

Objectivevalue=305Objective \: value = 305Objectivevalue=305
x1=5x_1 = 5x1​=5
x2=20x_2 = 20x2​=20
x3=0x_3 = 0x3​=0
x9=20x_9 = 20x9​=20
y1=2.5y_1 = 2.5y1​=2.5
y2=2.5y_2 = 2.5y2​=2.5
y9=4.5y_9 = 4.5y9​=4.5
由于x3=0x_3=0x3​=0,所以我们可以从模型中舍去x3x_3x3​。
于是我们分别建立9cm、14cm、16cm的Subproblem :
————————————————————————————————————————————————————————
Subproblem 1(9cm,5元)
定义决策变量aj\bm{a_{j}}aj​是Pattern切割后4cm,5cm,7cm木材的数量。
min⁡z=5−(2.5a1+2.5a2+4.5a9)\min{z=5-(2.5a_1+2.5a_2+4.5a_9)}minz=5−(2.5a1​+2.5a2​+4.5a9​)
s.t.s.t.s.t.
4a1+5a2+7a9≤94a_1+5a_2+7a_9\leq 94a1​+5a2​+7a9​≤9
ai∈Na_i\in\mathbb{N}ai​∈N
求解得:a=(2,0,0)T,z=0a=(2,0,0)^T, z=0a=(2,0,0)T,z=0
————————————————————————————————————————————————————————
Subproblem 2(14cm,9元)
定义决策变量aj\bm{a_{j}}aj​是Pattern切割后4cm,5cm,7cm木材的数量。
min⁡z=9−(2.5a1+2.5a2+4.5a9)\min{z=9-(2.5a_1+2.5a_2+4.5a_9)}minz=9−(2.5a1​+2.5a2​+4.5a9​)
s.t.s.t.s.t.
4a1+5a2+7a9≤144a_1+5a_2+7a_9\leq 144a1​+5a2​+7a9​≤14
ai∈Na_i\in\mathbb{N}ai​∈N
求解得:a=(0,0,2)T,z=0a=(0,0,2)^T, z=0a=(0,0,2)T,z=0
————————————————————————————————————————————————————————
Subproblem 3(16cm,10元)
定义决策变量aj\bm{a_{j}}aj​是Pattern切割后4cm,5cm,7cm木材的数量。
min⁡z=10−(2.5a1+2.5a2+4.5a9)\min{z=10-(2.5a_1+2.5a_2+4.5a_9)}minz=10−(2.5a1​+2.5a2​+4.5a9​)
s.t.s.t.s.t.
4a1+5a2+7a9≤164a_1+5a_2+7a_9\leq 164a1​+5a2​+7a9​≤16
ai∈Na_i\in\mathbb{N}ai​∈N
求解得:a=(4,0,0)T,z=0a=(4,0,0)^T, z=0a=(4,0,0)T,z=0

所有的Subproblem目标z≥0z \geq 0z≥0,那就说明不存在更好的Pattern,于是最终的解(记得上取整):x1=5,x2=20,x9=20x_1 = 5, x_2 = 20, x_9 = 20x1​=5,x2​=20,x9​=20

以上整个算法过程我们就称之为——列生成

列生成:Cutting Stock Problem

本节需要一定的运筹学基础,但如果你已经看完上文的话,我相信理解起来也会非常简单了。——@小猪快跑

提出Gomory割的大佬Gomory在IBM的时候,与另一个大佬Gilmore 共同提出了著名的Column Generation:

参考文献:
@article{gilmore1961linear,
title={A linear programming approach to the cutting-stock problem},
author={Gilmore, Paul C and Gomory, Ralph E},
journal={Operations research},
volume={9},
number={6},
pages={849–859},
year={1961},
publisher={INFORMS}
}

问题描述

卖家有nnn种长度的木材:LiL_iLi​ m(cic_ici​元)
买家需要mmm种长度的木材:lil_ili​ m(did_idi​根)
于是卖家需要通过切割木材满足买家的需求,而且卖家希望成本最低从而达到受益最大。

建模

Master Problem(MP)

min⁡∑i=1ncixis.t.∑i=1naijxi≥bi,j=1,2,...,mxi∈N,∀i\begin{aligned} & \min{\sum_{i=1}^n c_ix_i} \\ & s.t. \sum_{i=1}^n a_{ij}x_i \geq b_i , j=1,2,...,m \\ & x_i\in\mathbb{N}, \forall i \end{aligned} ​mini=1∑n​ci​xi​s.t.i=1∑n​aij​xi​≥bi​,j=1,2,...,mxi​∈N,∀i​

Restricted Master Problem(RMP)

min⁡∑i=1kcixis.t.∑i=1kaijxi≥bi,j=1,2,...,mxi∈N,∀i\begin{aligned} & \min{\sum_{i=1}^k c_ix_i} \\ & s.t. \sum_{i=1}^k a_{ij}x_i \geq b_i , j=1,2,...,m \\ & x_i\in\mathbb{N}, \forall i \end{aligned} ​mini=1∑k​ci​xi​s.t.i=1∑k​aij​xi​≥bi​,j=1,2,...,mxi​∈N,∀i​

也就是MP问题变量数从nnn减少到kkk个,需要注意我们强制了xi(i>k)x_i(i>k)xi​(i>k)的变量为非基变量。

Dual of Restricted Master Problem

为了在Subproblem中计算检验数:σj=cj−cBB−1aj\sigma_j = c_j-c_BB^{-1}a_jσj​=cj​−cB​B−1aj​,我们需要计算出cBB−1c_BB^{-1}cB​B−1,一般来说他有两重含义:

  1. 通过求解RMP问题得到的影子价格(shadow price)。
  2. 通过求解RMP对偶问题得到的对偶变量(dual variable)。

我们一般使用第2种对偶问题求解。因为RMP一般变量极多,而单纯形法对于变量多的问题求解很困难。原问题的变量对应对偶问题的约束,目标系数对应约束边界,约束矩阵倒转过来。所以在对偶问题上就没有这个困扰。

Subproblem

min⁡cj−∑ωiais.t.∑i=1mliai≤Ljai≥0,∀i\begin{aligned} & \min c_j-\sum \omega_i a_{i} \\ & s.t. \sum_{i=1}^m l_{i}a_i \leq L_j \\ & a_i\geq 0, \forall i \end{aligned} ​mincj​−∑ωi​ai​s.t.i=1∑m​li​ai​≤Lj​ai​≥0,∀i​

迭代

检验数小于0的话,就把Pattern加入列,进行下一次迭代,直到所有检验数大于等于0。最后上取整结果即可。

流程图

总结

  1. 列生成算法主要用于求解变量多,但大部分变量取值为0的线性规划问题。
  2. 总体思路是先选出小部分变量构建RMP(也就是其余变量取值都是0)快速得到一个可行解,之后再通过Subproblem计算检验数(reduced cost)寻找有没有更好的变量加入模型再次求解,直到找不到更好的变量。
  3. 为什么增加变量可以让目标值更好呢?原问题增加变量=>对偶问题增加约束=>对偶问题最优值不变或者变小(对偶问题是max问题,约束越多可行域越小,自然目标函数优度下降)=>原问题最优值不变或者变小(对偶问题和原问题最优解是一样的)
    事实上,我们需要找的变量是能在对偶问题中让最优解不满足新增的约束。

【0基础运筹学】【超详细】列生成(Column Generation)相关推荐

  1. DM数据库——模式、表、索引管理基础(超详细版)

    DM数据库--模式.表.索引管理基础(超详细版) 一.管理模式对象的空间 1.DM8对普通表和索引提供的参数 2.DM8对HUGE表提供的参数 3.空间限制 4.查看占用的空间 二.管理表 1.设计表 ...

  2. 大学计算机基础知识点图文,大学计算机基础知识点超详细总结

    大学计算机基础知识点超详细总结 第一章 计算机及信息技术概述1. 电子计算机的发展历程①1946 年 2 月由宾夕法尼亚大学研制成功的 ENIAC 是世界上第一台电子数字计算机. "诞生了一 ...

  3. mysql超详细教程_MySQL8.0.23安装超详细教程

    前言 最近在做一个人脸识别的项目,需要用数据库保存学生信息与前段交互. MySQL的优点 1.mysql性能卓越,服务稳定,很少出现异常宕机. 2.mysql开放源代码且无版权制约,自主性及使用成本低 ...

  4. MySQL数据库零基础教学[超详细]

    文章较长,但很详细,大家选择性观看即可 文章目录 一.数据库简介 二.MySQL数据类型常用类型 三.常用Sql语句 (1)Sql语句简介 SQL的概念 (2)数据定义语言DDL`create,alt ...

  5. PyQt5基础知识 超详细!!!(含代码)

    在哔哩哔哩中看的教程整理的笔记:视频链接https://www.bilibili.com/video/BV1VE411t7kC?p=1 目录 一.水平布局 二.垂直布局 三.Grid 栅格布局 四.  ...

  6. 一篇搞定css基础(超详细,附代码)

    第一章:css概述 1.1.css的简介 1)什么是CSS css中文名称叫层叠样式表,层叠为css的布局,表示布局方式是通过一层层来实现的:样式是布局层的显示效果,主要是通过css提供的一些属性和属 ...

  7. java春招面试冲刺系列:mysql基础知识超详细复习

    目录 基础 番外篇 MySQL体系结构 MySQL基准测试 数据库结构优化 MySQL的复制功能 MySQL日志 索引 表中有多个索引,优化器怎么决定使用哪个索引 SQL查询优化 数据库监控 常用命令 ...

  8. 【JAVA基础】初学者指南--两万字知识点总结--零基础,超详细 。

    Java基础知识 JAVA入门 JAVA三大版本 JAVA的特性和优势 JAVA运行机制 JVM.JRE.JDK JAVA开发环境搭建 变量.数据类型和运算符 变量(variable) 变量的本质 变 ...

  9. 【深度学习】基础知识 | 超详细逐步图解 Transformer

    作者 | Chilia 整理 | NewBeeNLP 1. 引言 读完先修知识中的文章之后,你会发现:RNN由于其顺序结构训练速度常常受到限制,既然Attention模型本身可以看到全局的信息, 那么 ...

  10. 第一章 R语言编程基础(超详细)

    目录 1.1 工作环境 1.1.1 R的历史与发展 1.1.2 R的资源 1.1.3 RGui 1.1.4 Rstudio 1.1.5 为什么选择R 1.1.6 Tips for R 1.1.6 Ti ...

最新文章

  1. android中文首字母排序,Android上汉字按拼音排序如何实现?
  2. 有趣而又被忽略的Unity技巧
  3. 田志刚:人跟人差距怎么那么大呢?
  4. Python应用02--批量往Mysql数据库插入数据
  5. 计算机有残留office,电脑中无法安装Office2013删除残留文件的方法
  6. STM32F10x_StdPeriph_Lib_V3.5.0库与系统滴答定时器(Systick)
  7. 【Docker】Asp.net core在docker容器中的端口问题
  8. js 数组 ajax php,js里面的对象ajax post到php端直接变成数组了?
  9. python中的order_Hive中Order by和Sort by的区别是什么?
  10. Python数据结构与算法(二)栈和队列
  11. JAVA毕业设计河南口腔医疗机构线上服务系统计算机源码+lw文档+系统+调试部署+数据库
  12. Java枚举(enum)
  13. python 实体识别_英文实体识别的python实现
  14. [转帖]AMD、英特尔为何争相走向胶水多核处理器?真相在此
  15. assimp批量转模型_IGS模型批量转换成STL模型
  16. 怎么用python画房子_python绘图作业:使用pygame库画房子
  17. python 实现单链表 Lined List
  18. 【机器学习算法面试题】四.深度神经网络中激活函数有哪些?
  19. composer搭建php框架,利用 Composer 一步一步构建自己的 PHP 框架(一)——基础准备...
  20. 位宽512bit显卡_显卡位宽是什么?详解显卡位宽基础知识科普!

热门文章

  1. 使用PHP控制MODBUS-RTU设备
  2. 使用JMeter进行接口压力测试
  3. Chrome浏览器用IDM插件下载出现401、403、404错误
  4. WiFi基础知识解析
  5. 华为hcie证书含金量_华为hcie证书含金量高吗
  6. 安装RoboWare Studio
  7. keil中L6002U的error原因之一
  8. 互联网产品经理好书推荐
  9. 计算机毕业设计-ssm超市进销存管理系统(项目+类似文档)超市仓库管理系统javaweb-超市库存预警管理系统源码
  10. 联想平板刷android,联想平板电脑刷机全教程【图文】