列生成算法及python实践
列生成算法是在混合整数规划中一个经典的且强大的精确算法。
引例-下料问题
一家木材厂有一种长度为80英寸的木材原料。现在有3个顾客,他们分别需要46个10英寸,22个11英寸,43个19英寸的木材产品。
为了满足客户不同的需求并且使得切割的原料最少,问该公司最少需要的木材多少根,以及如何切割?
为了方便求解该问题,我们引入如下记号:
记号 | 含义 |
---|---|
m m m | 客户的集合 |
W W W | 木材的最大宽度 |
w i , i ∈ m w_i,i\in m wi,i∈m | 客户 i i i要求的棒材宽度 |
n i , i ∈ m n_i,i\in m ni,i∈m | 客户 i i i对棒材宽度为 w i w_i wi的需求数量 |
求解方法
Kantorovich 建模方式
记号 | 含义 |
---|---|
K \mathcal{K} K | 待切割的棒材的集合 |
y k ∈ { 0 , 1 } y_k\in\{0,1\} yk∈{ 0,1} | 棒材 k k k是否被切割,1表示切割,0表示不切割 |
x i k x_i^k xik | 棒材 k k k被规格为 w i w_i wi切割的个数 |
于是可以将数学模型表述为如下形式:
min ∑ k ∈ K y k s.t. ∑ k ∈ K x i k ≥ n i , i = 1 , … , m , (demand) ∑ i = 1 n w i x i k ≤ W y k , k ∈ K , (width limitation) x i k ∈ Z + , y k ∈ { 0 , 1 } . \begin{aligned} &\text{min} \sum_{k\in\mathcal{K}}y_k \\ &\text{s.t.} \sum_{k\in\mathcal{K}}x_i^k\geq n_i,\quad i=1,\ldots,m,\quad\text{(demand)} \\ &\sum_{i=1}^nw_ix_i^k\leq Wy_k,\quad k\in\mathcal{K},\quad\text{(width limitation)} \\ &x_i^k\in\mathbb{Z}_+, y_k\in\{0,1\}. \end{aligned} min