0基础运筹学超详细列生成(Column Generation)
Posted ymzhu385
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0基础运筹学超详细列生成(Column Generation)相关的知识,希望对你有一定的参考价值。
目录
列生成(Column generation)
是一种解决大型线性程序的有效算法。
相关教程
相关文献
- 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 | x 1 x_1 x1 |
5 | 9 | 1 | 1 | 0 | x 2 x_2 x2 |
5 | 9 | 0 | 0 | 1 | x 3 x_3 x3 |
9 | 14 | 3 | 0 | 0 | x 4 x_4 x4 |
9 | 14 | 2 | 1 | 0 | x 5 x_5 x5 |
9 | 14 | 1 | 2 | 0 | x 6 x_6 x6 |
9 | 14 | 1 | 0 | 1 | x 7 x_7 x7 |
9 | 14 | 0 | 1 | 1 | x 8 x_8 x8 |
9 | 14 | 0 | 0 | 2 | x 9 x_9 x9 |
10 | 16 | 4 | 0 | 0 | x 10 x_10 x10 |
10 | 16 | 2 | 0 | 1 | x 11 x_11 x11 |
10 | 16 | 1 | 1 | 1 | x 12 x_12 x12 |
10 | 16 | 0 | 3 | 0 | x 13 x_13 x13 |
于是我们只需要从All Cutting Pattern
里面确定每个Pattern需要几次
就行了。(举个例子:比如
x
1
=
30
\\bmx_1=30
x1=30代表我们使用第1种切法切了30根9cm长度的木材)。
我们目标是用最少的钱
完成买家的需求,也就是每个Pattern的
c
o
s
t
×
数量
\\bmcost\\times \\textbf数量
cost×数量的总和。
5 x 1 + 5 x 2 + 5 x 3 + 9 x 4 + 9 x 5 + 9 x 6 + 9 x 7 + 9 x 8 + 9 x 9 + 10 x 10 + 10 x 11 + 10 x 12 + 10 x 13 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 5x1+5x2+5x3+9x4+9x5+9x6+9x7+9x8+9x9+10x10+10x11+10x12+10x13
另外呢我们需要满足买家数量上的要求
。
4cm要超过30根:
2 x 1 + x 2 + 0 x 3 + 3 x 4 + 2 x 5 + x 6 + x 7 + 0 x 8 + 0 x 9 + 4 x 10 + 2 x 11 + x 12 + 0 x 13 ≥ 30 2x_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 30 2x1+x2+0x3+3x4+2x5+x6+x7+0x8+0x9+4x10+2x11+x12+0x13≥30
5cm要超过20根:
0 x 1 + x 2 + 0 x 3 + 0 x 4 + x 5 + 2 x 6 + 0 x 7 + x 8 + 0 x 9 + 0 x 10 + 0 x 11 + x 12 + 3 x 13 ≥ 20 0x_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 20 0x1+x2+0x3+0x4+x5+2x6+0x7+x8+0x9+0x10+0x11+x12+3x13≥20
7cm要超过70根:
0 x 1 + 0 x 2 + x 3 + 0 x 4 + 0 x 5 + 0 x 6 + x 7 + x 8 + 2 x 9 + 0 x 10 + x 11 + x 12 + 0 x 13 ≥ 40 0x_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 40 0大数据分析-零基础学Tableau+超详细讲解+示例练习