文章目录
前言
学习列生成之前,有一些前置基础需要理解,不然就没法继续往下学了。所以为了写这篇文章,我提前铺垫了3篇文章帮助自己把基础捡起来!
今天终于可以进入正题了!
从Cutting stock problem说起
有一堆固定长度的钢管,不同的顾客想要长度不一样的钢管若干,怎么切割钢管能够使得消耗的钢管数最少?
常规建模
【集合】
- K K K:未切割的钢管集合;
- I I I:所需钢管的种类集合;
【参数】
- D i D_i Di:第 i i i种钢管的需求数量;
- L k L_k Lk:第 k k k根未切钢管的长度;
- L i L_i Li:第 i i i种钢管的长度;
【决策变量】
- x k i x_{ki} xki:第 k k k根钢管切割第 i i i种长度的数量;
- y k y_k yk:第 k k k根钢管是否使用;
【数学模型】
目标函数:最小化使用的钢管数量
约束条件:
- 每根钢管被切割的总长度,不多于该根钢管的总长度;
- 每种钢管被切割的数量不低于该种钢管的总需求量;
m i n ∑ k ∈ K y k s . t . ∑ i ∈ I x k i L i ≤ L k ∗ y k , ∀ k ∈ K ∑ k ∈ K x k i ≥ D i , ∀ i ∈ I x k i ∈ { 0 , 1 } , ∀ k ∈ K , i ∈ I y k ∈ { 0 , 1 } , ∀ k ∈ K min \quad \sum_{k\in K}y_k\\ s.t. \sum_{i\in I}x_{ki}L_i\leq L_k*y_k, \forall k \in K\\ \sum_{k\in K}x_{ki} \geq D_i, \forall i \in I\\ x_{ki} \in \{0, 1\}, \forall k\in K, i\in I\\ y_{k} \in \{0, 1\}, \forall k\in K mink∈K∑yks.t.i∈I∑xkiLi≤Lk∗yk,∀k∈Kk∈K∑xki≥D