0-1整数线性规划(0-1整数线性规划建模、隐枚举法、指派问题、匈牙利法)

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={01xi1,x10,xiZxi=01
    注:如果变量 x i x_i xi不是仅取值0或1,而是可取其他范围的非负整数,这时可利用二进制的计数法将它用若干个0-1变量来代替。

  • 相互排斥的计划

    请添加图片描述

    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变量

    2. 目标函数
      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=17cixi
      注:对于 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 1ci;如果没选 A i ,   x i = 0 A_i,~x_i=0 Ai, xi=0,此时利润为 0 ⋅ c i 0\cdot c_i 0ci,但我们用整体视角去看上述两种情况时,不难发现,无论选择或不选择 A i A_i Ai,利润直接表示为 x i c i x_ic_i xici即可

    3. 约束方程

    { ∑ 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=17bixiBx1+x2+x32x4+x51x6+x71xi=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++xnM

  • 相互排斥的约束项

    现公司需要运输货物,考虑使用集装箱,集装箱分甲乙两个型号,甲的容量为 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。另外,选择了车运就不能船运,反之亦然。

    1. 不妨设 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+4x224船运:7x1+3x245
      注:车运和船运只能二选一,因此两个约束条件是互斥的,不能同时发生。如果写在同一个方程组中则是同时生效的。考虑引入0-1变量,但之后如何处理是难题

    2. 引入0-1变量 y y y,令
      y = { 0 , 用车运 1 , 用船运 y=\left\{\begin{array}{c}0,\text{用车运}\\1,\text{用船运}\end{array}\right. y={0,用车运1,用船运

    3. 约束方程(细品)
      { 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+4x224+yM7x1+3x245+(1y)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+y2Mm1
      注:对于 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=m1,且当 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

    1. 首先可以列出不同投资方式的成本
      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

    2. 目标函数,使总投入最小。引入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

    3. 目标函数
      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)

    4. 约束方程
      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=31

      注:当 y j = 1 y_j=1 yj=1时, x j ≤ M x_j\le M xjM,因此不对 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=3x12x2+5x3, s.t.x1+2x2x32x1+4x2+x34x1+x234x1+x36xi=01

    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

    2. 观察约束方程组,通过试探的方法随便找出一个可行解: x = ( 1 , 0 , 0 ) T x=(1,0,0)^T x=(1,0,0)T

    3. 将2中试探出的可行解代入目标函数 z z z后得出一个取值 z 0 z_0 z0,因为我们希望找到 max ⁡ z \max z maxz,所以我们希望 z ≥ z 0 z\ge z_0 zz0,将此不等式作为一个新增约束: 3 x 1 − 2 x 2 + 5 x 3 ≥ 5      ⑤ 3x_1-2x_2+5x_3\ge 5 ~~~~~\text{⑤} 3x12x2+5x35     

    4. 开始枚举和比较

      请添加图片描述

      注:对目标函数进行重排之后可以使目标函数求值非递减

指派问题
  • 有一份中文说明书,需译成英、日、德、俄四种文字。分别记作E、J、G、R。现有甲、乙、丙、丁四人。他们将中文说明书翻译成不同语种的说明书所需时间如图所示。问应指派何人去完成何工作,使所需总时间最少?

    请添加图片描述

    注:n个人干n件事,不重不漏,既没有人没事干,也不能有事没人干。给个人只干一件事,每件事都只被一个人处理

    1. 引入决策变量 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项任务

    2. 约束方程
      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=ixij=1,jxij=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+xi41每个人至多干一件事xi1+xi2+xi3+xi41xi1+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

    3. 目标函数
      min ⁡ z = ∑ i ∑ j c i j x i j \min z=\sum\limits_i\sum\limits_j c_{ij}x_{ij} minz=ijcijxij

  • 一般化模型: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=ijcijxijxij=ixij=1,jxij=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

  • 匈牙利法步骤

    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=210971541481314161141513924970600130511110742114206001305176300920
      注:必须先变行,再变列,不能同时进行改变

    2. 试指派:找出独立0元素

      1. 从只有一个0元素的行开始,给这个0元素加圈,记作 ⊚ \circledcirc 。这表示对这行所代表的人,只有一种任务可指派。然后划去 ⊚ \circledcirc 所在列的其他0元素,记作 Φ \Phi Φ。这表示这列所代表的任务已指派完,不必再考虑别人了
      2. 给只有一个0元素列的0元素加圈,记作 ⊚ \circledcirc ;然后划去 ⊚ \circledcirc 所在行的其他0元素,记作 Φ \Phi Φ
      3. 反复进行1、2两步,直到所有0元素都被圈出和划掉为止
      4. 若仍有没有划圈的0元素,且同行的0元素至少有两个(表示对这个人可以从两项任务中指派其一)。这可用不同的方案去试探。从剩有0元素最少的行(列)开始,比较这行各0元素所在列中0元素的数目,选择0元素少的那列的这个0元素加圈(表示选择性多的要“礼让”选择性少的)。然后划掉同行同列的其他0元素。可反复进行,直到所有0元素都已圈出和划掉为止
      5. ⊚ \circledcirc 元素的数目 m m m等于矩阵的阶数 n n n ,那么这指派问题的最优解已得到。若 m ≤ n m\le n mn,则转入下一步

      注:对于上矩阵,先给 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Φ135176392Φ最优解0010010000011000最优值minz=c31+c22+c43+c14=28

    3. 打钩、直线覆盖:作最少的直线覆盖所有的0元素,以确定该系数矩阵中能找到最多的独立元素,以下矩阵为例

      1. 对没有 ⊚ \circledcirc 的行打 √ √
      2. 对已打 √ √ 号的行中所有含 Φ \Phi Φ元素的列打 √ √
      3. 再对打有 √ √ 的列中含 ⊚ \circledcirc 元素的行打 √ √
      4. 重复2、3直到得不出新的打 √ √ 的行列为止
      5. 对没有打 √ √ 的行画一条横线,有打 √ √ 的列画一条纵线,这就得到覆盖所有0元素的最少直线数
      6. 令直线数为 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,另行试探
        请添加图片描述请添加图片描述
    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=ijcijxij,需要转化为求 min ⁡ \min min的情形。需要令 b i j = M − c i j b_{ij}=M-c_{ij} bij=Mcij,其中 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=ijbijxij的最优解就是原问题的最优解

  • 7
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值