0-1整数线性规划
引入0-1变量的实际问题
-
更多的是站在数学建模的角度讨论
-
整数几何意义:当我们有了“0”和“1”的时候,其他整数就很容易被我们创造出来了,这个创造的方法在几何上叫平移
-
决策变量
x i = { 0 1 ⟺ x i ≤ 1 , x 1 ≥ 0 , x i ∈ Z ⟺ x i = 0 或 1 x_i=\left\{\begin{array}{c}0\\1\end{array}\right. \Longleftrightarrow x_i\le 1,x_1\ge 0,x_i\in Z \Longleftrightarrow x_i=0\text{或}1 xi={01⟺xi≤1,x1≥0,xi∈Z⟺xi=0或1
注:如果变量 x i x_i xi不是仅取值0或1,而是可取其他范围的非负整数,这时可利用二进制的计数法将它用若干个0-1变量来代替。 -
相互排斥的计划
-
引入0-1变量 x i x_i xi
x i = { 1 , 当 A i 点被选用 0 , 当 A i 点没被选用 , i = 1 , 2 , ⋯ , 7 x_i=\left\{\begin{array}{c}1,\text{当}A_i\text{点被选用}\\0,\text{当}A_i\text{点没被选用}\end{array}\right. ,~i=1,2,\cdots,7 xi={1,当Ai点被选用0,当Ai点没被选用, i=1,2,⋯,7
注:难点往往是选择合适的决策变量,为什么要选择0-1变量 -
目标函数
max z = c 1 x 1 + c 2 x 2 + ⋯ + c 7 x 7 = ∑ i = 1 7 c i x i \max z=c_1x_1+c_2x_2+\cdots+c_7x_7=\sum\limits_{i=1}^7c_ix_i maxz=c1x1+c2x2+⋯+c7x7=i=1∑7cixi
注:对于 x i x_i xi来说选与不选用 x i x_i xi来表示。如果选了 A i , x i = 1 A_i,~x_i=1 Ai, xi=1,此时利润为 1 ⋅ c i 1\cdot c_i 1⋅ci;如果没选 A i , x i = 0 A_i,~x_i=0 Ai, xi=0,此时利润为 0 ⋅ c i 0\cdot c_i 0⋅ci,但我们用整体视角去看上述两种情况时,不难发现,无论选择或不选择 A i A_i Ai,利润直接表示为 x i c i x_ic_i xici即可 -
约束方程
{ ∑ i = 1 7 b i x i ≤ B x 1 + x 2 + x 3 ≤ 2 x 4 + x 5 ≥ 1 x 6 + x 7 ≥ 1 x i = 0 或 1 \left\{\begin{array}{c} \sum\limits_{i=1}^7b_ix_i\le B\\ x_1+x_2+x_3\le 2\\ x_4+x_5\ge 1\\ x_6+x_7\ge 1\\ x_i=0~\text{或}~1 \end{array}\right. ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧i=1∑7bixi≤Bx1+x2+x3≤2x4+x5≥1x6+x7≥1xi=0 或 1
注:方程2可以抽象为:在 A 1 , A 2 , ⋯ , A n A_1,A_2,\cdots,A_n A1,A2,⋯,An中至多选 M M M个 ⇒ \Rightarrow ⇒ x 1 + x 2 + ⋯ + x n ≤ M x_1+x_2+\cdots+x_n\le M x1+x2+⋯+xn≤M
-
-
相互排斥的约束项
现公司需要运输货物,考虑使用集装箱,集装箱分甲乙两个型号,甲的容量为 5 m 3 / 箱 5m^3/\text{箱} 5m3/箱,乙的容量为 4 m 3 / 箱 4m^3/\text{箱} 4m3/箱,且甲乙两个型号只能车运,且车运限制为 24 m 3 24m^3 24m3. 现有人提出了另一个方案,使用船运,在船运时,甲的容量可调整为 7 m 3 / 箱 7m^3/\text{箱} 7m3/箱,但乙的容量须调整为 3 m 3 / 箱 3m^3/\text{箱} 3m3/箱,船运上限为 45 m 3 45m^3 45m3。另外,选择了车运就不能船运,反之亦然。
-
不妨设 x 1 x_1 x1个甲, x 2 x_2 x2个乙,则有
车运: 5 x 1 + 4 x 2 ≤ 24 船运: 7 x 1 + 3 x 2 ≤ 45 \text{车运:}5x_1+4x_2\le 24\\ \text{船运:}7x_1+3x_2\le 45 车运:5x1+4x2≤24船运:7x1+3x2≤45
注:车运和船运只能二选一,因此两个约束条件是互斥的,不能同时发生。如果写在同一个方程组中则是同时生效的。考虑引入0-1变量,但之后如何处理是难题 -
引入0-1变量 y y y,令
y = { 0 , 用车运 1 , 用船运 y=\left\{\begin{array}{c}0,\text{用车运}\\1,\text{用船运}\end{array}\right. y={0,用车运1,用船运 -
约束方程(细品)
{ 5 x 1 + 4 x 2 ≤ 24 + y M 7 x 1 + 3 x 2 ≤ 45 + ( 1 − y ) M , M 是充分大的数 \left\{\begin{array}{c} 5x_1+4x_2\le 24+yM\\ 7x_1+3x_2\le 45+(1-y)M \end{array}\right. ,~M\text{是充分大的数} {5x1+4x2≤24+yM7x1+3x2≤45+(1−y)M, M是充分大的数
注:引入大M可以使部分约束失效注:如果有 m m m个约束条件相互排斥,则引入 m m m个0-1变量 y i , i = 1 , ⋯ , m y_i,i=1,\cdots,m yi,i=1,⋯,m和一个充分大的数 M M M,并把原约束写成如下形式
{ a 11 x 1 + a 12 x 2 + ⋯ a 1 n x n ≤ b 1 + y 1 M a 21 x 1 + a 22 x 2 + ⋯ a 2 n x n ≤ b 2 + y 2 M ⋮ a m 1 x 1 + a m 2 x 2 + ⋯ a m n x n ≤ b m + y 2 M y 1 + u 2 + ⋯ + y m = m − 1 \left\{\begin{array}{lcl} a_{11}x_1+a_{12}x_2+\cdots a_{1n}x_n&\le& b_1+y_1M\\ a_{21}x_1+a_{22}x_2+\cdots a_{2n}x_n&\le& b_2+y_2M\\ &\vdots&\\ a_{m1}x_1+a_{m2}x_2+\cdots a_{mn}x_n&\le& b_m+y_2M\\ y_1+u_2+\cdots+y_m&=&m-1 \end{array}\right. ⎩⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎧a11x1+a12x2+⋯a1nxna21x1+a22x2+⋯a2nxnam1x1+am2x2+⋯amnxny1+u2+⋯+ym≤≤⋮≤=b1+y1Mb2+y2Mbm+y2Mm−1
注:对于 y i ( i = 1 , ⋯ , m ) y_i(i=1,\cdots,m) yi(i=1,⋯,m)来说一定要求 y 1 + y 2 + ⋯ + y m = m − 1 y_1+y_2+\cdots+y_m=m-1 y1+y2+⋯+ym=m−1,且当 y i = 0 y_i=0 yi=0时,相应的约束才生效
-
-
关于固定费用的问题
某工厂为了生产某种产品,有几种不同的生产方式可供选择,如选定投资高的生产方式,每件产品的变动成本就降低;如选定投资低的生产方式,每件产品的变动成本可能增加。设有三种方式可供选择。令 x j x_j xj表示第 j j j种方式时的产量; c j c_j cj表示采用第 j j j种方式时每件产品的变动成本; k j k_j kj表示采用第 j j j种方式时的固定成本( j = 1 , 2 , 3 j=1,2,3 j=1,2,3)
-
首先可以列出不同投资方式的成本
P j = { k j + c j x j , x j > 0 0 , x j = 0 , j = 1 , 2 , 3 P_j=\left\{\begin{array}{lcl}k_j+c_jx_j&,&x_j>0\\0&,&x_j=0\end{array}\right.,~j=1,2,3 Pj={kj+cjxj0,,xj>0xj=0, j=1,2,3 -
目标函数,使总投入最小。引入0-1变量 y j y_j yj
y j = { 1 , 当采用第 j 种生产方式,即 x j > 0 0 , 当不采用第 j 种生产方式,即 x j = 0 y_j=\left\{\begin{array}{c}1,\text{当采用第}j\text{种生产方式,即}x_j>0\\0,\text{当不采用第}j\text{种生产方式,即}x_j=0\end{array}\right. yj={1,当采用第j种生产方式,即xj>00,当不采用第j种生产方式,即xj=0 -
目标函数
min z = ( k 1 y 1 + c 1 x 1 ) + ( k 2 y 2 + c 2 x 2 ) + ( k 3 y 3 + c 3 x 3 ) \min z=(k_1y_1+c_1x_1)+(k_2y_2+c_2x_2)+(k_3y_3+c_3x_3) minz=(k1y1+c1x1)+(k2y2+c2x2)+(k3y3+c3x3) -
约束方程
Cannot read property 'type' of undefined
注:若只允许采用一种投资方式,则需要满足 y 1 + y 2 + y 3 = 3 − 1 y_1+y_2+y_3=3-1 y1+y2+y3=3−1注:当 y j = 1 y_j=1 yj=1时, x j ≤ M x_j\le M xj≤M,因此不对 x j x_j xj产生约束;当 y j = 0 y_j=0 yj=0时, x j = 0 x_j=0 xj=0,即不生产
-
隐枚举法
-
枚举法: n n n个变量需要穷举 2 n 2^n 2n次(上限)。隐枚举法(分支定界法也是一种隐枚举法)本质是对枚举法的一种优化(此外还有拉格朗日松弛法)
-
e.g. max z = 3 x 1 − 2 x 2 + 5 x 3 , s . t . { x 1 + 2 x 2 − x 3 ≤ 2 ① x 1 + 4 x 2 + x 3 ≤ 4 ② x 1 + x 2 ≤ 3 ③ 4 x 1 + x 3 ≤ 6 ④ x i = 0 或 1 \max z=3x_1-2x_2+5x_3 , ~s.t. \left\{\begin{array}{lc} x_1+2x_2-x_3\le 2 &\text{①}\\ x_1+4x_2+x_3\le 4 &\text{②}\\ x_1+x_2\le 3 &\text{③}\\ 4x_1+x_3\le 6 &\text{④}\\ x_i=0\text{或}1 \end{array}\right. maxz=3x1−2x2+5x3, s.t.⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x1+2x2−x3≤2x1+4x2+x3≤4x1+x2≤34x1+x3≤6xi=0或1①②③④
-
不用化标准型,但对目标函数进行一些处理。保证是在求 max z \max z maxz的条件下对 x i x_i xi前的系数按从小到大的顺序排序: max z = − 2 x 2 + 3 x 1 + 5 x 3 \max z=-2x_2+3x_1+5x_3 maxz=−2x2+3x1+5x3
-
观察约束方程组,通过试探的方法随便找出一个可行解: x = ( 1 , 0 , 0 ) T x=(1,0,0)^T x=(1,0,0)T
-
将2中试探出的可行解代入目标函数 z z z后得出一个取值 z 0 z_0 z0,因为我们希望找到 max z \max z maxz,所以我们希望 z ≥ z 0 z\ge z_0 z≥z0,将此不等式作为一个新增约束: 3 x 1 − 2 x 2 + 5 x 3 ≥ 5 ⑤ 3x_1-2x_2+5x_3\ge 5 ~~~~~\text{⑤} 3x1−2x2+5x3≥5 ⑤
-
开始枚举和比较
注:对目标函数进行重排之后可以使目标函数求值非递减
-
指派问题
-
有一份中文说明书,需译成英、日、德、俄四种文字。分别记作E、J、G、R。现有甲、乙、丙、丁四人。他们将中文说明书翻译成不同语种的说明书所需时间如图所示。问应指派何人去完成何工作,使所需总时间最少?
注:n个人干n件事,不重不漏,既没有人没事干,也不能有事没人干。给个人只干一件事,每件事都只被一个人处理
-
引入决策变量 x i j x_{ij} xij
x i j = { 1 当指派第 i 人去完成第 j 项任务 0 当不指派第 i 人去完成第 j 项任务 x_{ij}=\left\{\begin{array}{ll}1&\text{当指派第}i\text{人去完成第}j\text{项任务}\\0&\text{当不指派第}i\text{人去完成第}j\text{项任务}\end{array}\right. xij={10当指派第i人去完成第j项任务当不指派第i人去完成第j项任务 -
约束方程
x i j = { ∑ i x i j = 1 , j = 1 , 2 , 3 , 4 ∑ j x i j = 1 , i = 1 , 2 , 3 , 4 x i j = 1 或 0 x_{ij}=\left\{\begin{array}{ll} \sum\limits_{i}x_{ij}=1,&j=1,2,3,4\\ \sum\limits_{j}x_{ij}=1,&i=1,2,3,4\\ x_{ij}=1\text{ 或 }0 \end{array}\right. xij=⎩⎪⎪⎨⎪⎪⎧i∑xij=1,j∑xij=1,xij=1 或 0j=1,2,3,4i=1,2,3,4
注:从人的角度考虑,每个人至少干一件事,且每个人最多干一件事
{ 每个人至少干一件事 ⇒ x i 1 + x i 2 + x i 3 + x i 4 ≥ 1 每个人至多干一件事 ⇒ x i 1 + x i 2 + x i 3 + x i 4 ≤ 1 ⇒ x i 1 + x i 2 + x i 3 + x i 4 = 1 \left\{\begin{array}{c} \text{每个人至少干一件事}\Rightarrow x_{i1}+x_{i2}+x_{i3}+x_{i4}\ge 1\\ \text{每个人至多干一件事}\Rightarrow x_{i1}+x_{i2}+x_{i3}+x_{i4}\le 1 \end{array}\right. \Rightarrow x_{i1}+x_{i2}+x_{i3}+x_{i4}=1 {每个人至少干一件事⇒xi1+xi2+xi3+xi4≥1每个人至多干一件事⇒xi1+xi2+xi3+xi4≤1⇒xi1+xi2+xi3+xi4=1
注:从事情的角度,每件事至少有一个人来做,且做每件事的人不超过一个人
x 1 j + x 2 j + x 3 j + x 4 j = 1 x_{1j}+x_{2j}+x_{3j}+x_{4j}=1 x1j+x2j+x3j+x4j=1 -
目标函数
min z = ∑ i ∑ j c i j x i j \min z=\sum\limits_i\sum\limits_j c_{ij}x_{ij} minz=i∑j∑cijxij
-
-
一般化模型:n个人干n件事情
min z = ∑ i ∑ j c i j x i j x i j = { ∑ i x i j = 1 , j = 1 , 2 , ⋯ , n ∑ j x i j = 1 , i = 1 , 2 , ⋯ , n x i j = 1 或 0 \begin{array}{c} \min z=\sum\limits_i\sum\limits_j c_{ij}x_{ij}\\ x_{ij}=\left\{\begin{array}{ll} \sum\limits_{i}x_{ij}=1,&j=1,2,\cdots,n\\ \sum\limits_{j}x_{ij}=1,&i=1,2,\cdots,n\\ x_{ij}=1\text{ 或 }0 \end{array}\right. \end{array} minz=i∑j∑cijxijxij=⎩⎪⎪⎨⎪⎪⎧i∑xij=1,j∑xij=1,xij=1 或 0j=1,2,⋯,ni=1,2,⋯,n
指派问题-匈牙利法
-
匈牙利法:可以认为是专门解决指派问题的算法
-
解矩阵:把可行解 x i j x_{ij} xij写成矩阵形式
[ x 11 x 12 x 13 x 14 x 21 x 22 x 23 x 24 x 31 x 32 x 33 x 34 x 41 x 42 x 43 x 44 ] = = 比如 [ 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 ] \left[\begin{array}{cccc} x_{11}&x_{12}&x_{13}&x_{14}\\ x_{21}&x_{22}&x_{23}&x_{24}\\ x_{31}&x_{32}&x_{33}&x_{34}\\ x_{41}&x_{42}&x_{43}&x_{44} \end{array}\right] \overset{\text{比如}}{==} \left[\begin{array}{cccc} 0&1&0&0\\ 0&0&1&0\\ 1&0&0&0\\ 0&0&0&1 \end{array}\right] ⎣⎢⎢⎡x11x21x31x41x12x22x32x42x13x23x33x43x14x24x34x44⎦⎥⎥⎤==比如⎣⎢⎢⎡0010100001000001⎦⎥⎥⎤
注:每一行每一列都只有一个1 -
匈牙利法步骤
-
将题干中的工作矩阵写出来,并变换系数矩阵,使每行每列都出现0:每一行元素中减去该行最小元素,并在此基础上每列元素减去该列最小元素
C = [ 2 ‾ 15 13 4 10 4 ‾ 14 15 9 ‾ 14 16 13 7 ‾ 8 11 9 ] 2 4 9 7 → [ 0 13 11 2 6 0 ‾ 10 11 0 5 7 4 0 ‾ 1 4 ‾ 2 ‾ ] → [ 0 13 7 0 6 0 6 9 0 5 3 2 0 1 0 0 ] C= \left[\begin{array}{cccc} \underline{2}&15&13&4\\ 10&\underline{4}&14&15\\ \underline{9}&14&16&13\\ \underline{7}&8&11&9 \end{array}\right] \begin{array}{c} 2\\4\\9\\7 \end{array} \to \left[\begin{array}{cccc} 0&13&11&2\\ 6&\underline{0}&10&11\\ 0&5&7&4\\ \underline{0}&1&\underline{4}&\underline{2} \end{array}\right] \to \left[\begin{array}{cccc} 0&13&7&0\\ 6&0&6&9\\ 0&5&3&2\\ 0&1&0&0 \end{array}\right] C=⎣⎢⎢⎡2109715414813141611415139⎦⎥⎥⎤2497→⎣⎢⎢⎡06001305111107421142⎦⎥⎥⎤→⎣⎢⎢⎡06001305176300920⎦⎥⎥⎤
注:必须先变行,再变列,不能同时进行改变 -
试指派:找出独立0元素
- 从只有一个0元素的行开始,给这个0元素加圈,记作 ⊚ \circledcirc ⊚。这表示对这行所代表的人,只有一种任务可指派。然后划去 ⊚ \circledcirc ⊚所在列的其他0元素,记作 Φ \Phi Φ。这表示这列所代表的任务已指派完,不必再考虑别人了
- 给只有一个0元素列的0元素加圈,记作 ⊚ \circledcirc ⊚;然后划去 ⊚ \circledcirc ⊚所在行的其他0元素,记作 Φ \Phi Φ
- 反复进行1、2两步,直到所有0元素都被圈出和划掉为止
- 若仍有没有划圈的0元素,且同行的0元素至少有两个(表示对这个人可以从两项任务中指派其一)。这可用不同的方案去试探。从剩有0元素最少的行(列)开始,比较这行各0元素所在列中0元素的数目,选择0元素少的那列的这个0元素加圈(表示选择性多的要“礼让”选择性少的)。然后划掉同行同列的其他0元素。可反复进行,直到所有0元素都已圈出和划掉为止
- 若 ⊚ \circledcirc ⊚元素的数目 m m m等于矩阵的阶数 n n n ,那么这指派问题的最优解已得到。若 m ≤ n m\le n m≤n,则转入下一步
注:对于上矩阵,先给 b 22 b_{22} b22加圈,然后给 b 31 b_{31} b31加圈,划掉 b 11 , b 41 b_{11},b_{41} b11,b41;给 b 43 b_{43} b43加圈,划掉 b 44 b_{44} b44,最后给 b 14 b_{14} b14加圈
[ Φ 13 7 ⊚ 6 ⊚ 6 9 ⊚ 5 3 2 Φ 1 ⊚ Φ ] ⟹ 最优解 [ 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 ] ⟹ 最优值 min z = c 31 + c 22 + c 43 + c 14 = 28 \left[\begin{array}{cccc} \Phi&13&7&\circledcirc\\ 6&\circledcirc&6&9\\ \circledcirc&5&3&2\\ \Phi&1&\circledcirc&\Phi \end{array}\right] \begin{array}{c} &\overset{\text{最优解}}{\Longrightarrow} \left[\begin{array}{cccc} 0&0&0&1\\ 0&1&0&0\\ 1&0&0&0\\ 0&0&1&0 \end{array}\right]\\ &\overset{\text{最优值}}{\Longrightarrow} \min z=c_{31}+c_{22}+c_{43}+c_{14}=28 \end{array} ⎣⎢⎢⎡Φ6⊚Φ13⊚51763⊚⊚92Φ⎦⎥⎥⎤⟹最优解⎣⎢⎢⎡0010010000011000⎦⎥⎥⎤⟹最优值minz=c31+c22+c43+c14=28 -
打钩、直线覆盖:作最少的直线覆盖所有的0元素,以确定该系数矩阵中能找到最多的独立元素,以下矩阵为例
- 对没有 ⊚ \circledcirc ⊚的行打 √ √ √号
- 对已打 √ √ √号的行中所有含 Φ \Phi Φ元素的列打 √ √ √
- 再对打有 √ √ √的列中含 ⊚ \circledcirc ⊚元素的行打 √ √ √
- 重复2、3直到得不出新的打 √ √ √的行列为止
- 对没有打 √ √ √的行画一条横线,有打 √ √ √的列画一条纵线,这就得到覆盖所有0元素的最少直线数
- 令直线数为
l
l
l,若
l
<
n
l<n
l<n,说明必须再变换当前的系数矩阵,才能找到
n
n
n个独立的0元素,转至下一步;若
l
=
n
l=n
l=n而
m
<
n
m<n
m<n则回到上一步4,另行试探
-
找到没有覆盖的最小元素 m i n min min,没有覆盖的(打钩)行 − m i n -min −min,覆盖的(打钩)列 + m i n +min +min,得到新系数矩阵,若得到 n n n个独立的0元素,则已经得到最优解,否则回到上一步重复进行
-
-
对于 max z \max z maxz的问题 max z = ∑ i ∑ j c i j x i j \max z=\sum\limits_i\sum\limits_jc_{ij}x_{ij} maxz=i∑j∑cijxij,需要转化为求 min \min min的情形。需要令 b i j = M − c i j b_{ij}=M-c_{ij} bij=M−cij,其中 M M M是足够大的数,如选 c i j c_{ij} cij中最大元素为 M M M即可,解得 min z ′ = ∑ i ∑ j b i j x i j \min z'=\sum\limits_i\sum\limits_jb_{ij}x_{ij} minz′=i∑j∑bijxij的最优解就是原问题的最优解