数学建模线性规划(整数规划)

线性规划(整数规划)

概述

​ 数学规划中的变量(全部或部分)限制为整数时,称为整数规划。若在线性规划模型中,变量限制为整数,则称为整数线性规划。

数学模型

例1 合理下料问题

​ 设用某型号的圆钢下零件 A 1 , A 2 , ⋯   , A m \text A_1,\text A_2,\cdots,\text A_\text m A1,A2,,Am的毛坯。在一根圆钢上下料的方式有 B 1 , B 2 , ⋯   , B n \text B_1,\text B_2,\cdots,\text B_\text n B1,B2,,Bn种,每种下料方式可以得到各种零件的毛坯数以及每种零件的需求量,如表所示。问怎样安排下料方式,使得既满足需要,所用的原材料又最少?

B 1 \text B_1 B1 ⋯ \cdots B n \text B_\text n Bn零件毛坯数
A 1 \text A_1 A1 a 11 a_{11} a11 ⋯ \cdots a 1  n a_{1\ \text n} a1 n b 1 \text b_1 b1
⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots
A m \text A_\text m Am a m  1 a_{\text m\ 1} am 1 ⋯ \cdots a mn a_{\text m\text n} amn b m \text b_\text m bm

a ij a_{\text{ij}} aij表示用 B j \text B_\text j Bj种下料方式可以得到 A i \text A_\text i Ai零件的毛坯数。

​ 设: x j x_\text j xj表示用 B j ( j = 1 , 2 , ⋯   , n ) \text B_\text j(\text j=1,2,\cdots,\text n) Bj(j=1,2,,n)种方式下料根数。
min ⁡ z = ∑ j = 1 n x j \min\quad z=\sum_{\text j=1}^\text nx_\text j minz=j=1nxj

s.t. { ∑ j = 1 n a ij x j ≥ b i i = 1 , 2 , ⋯   , m x j ≥ 0 j = 1 , 2 , ⋯   , n x j ∈ Z j = 1 , 2 , ⋯   , n \text{s.t.}\quad \begin{cases} \sum\limits_{\text j=1}^\text na_{\text{ij}}x_\text j\ge \text b_\text i&\text i=1,2,\cdots,\text m\\ x_\text j\ge0&\text j=1,2,\cdots,\text n\\ x_\text j\in\Z&\text j=1,2,\cdots,\text n\\ \end{cases} s.t. j=1naijxjbixj0xjZi=1,2,,mj=1,2,,nj=1,2,,n

例2 建厂问题

​ 某公司计划在 m \text m m个地点建厂,可供选择的地点有 A 1 , A 2 , ⋯   , A m \text A_1,\text A_2,\cdots,\text A_\text m A1,A2,,Am,他们的生产能力分别是 a 1 , a 2 , ⋯   , a m a_1,a_2,\cdots,a_\text m a1,a2,,am(假设生产同一产品)。第 i \text i i个工厂的建设费用为 f i   ( i = 1 , 2 , ⋯   , m ) \text f_\text i\ (\text i=1,2,\cdots,\text m) fi (i=1,2,,m),又有 n \text n n个地点 B 1 , B 2 , ⋯   , B n \text B_1,\text B_2,\cdots,\text B_\text n B1,B2,,Bn需要销售这种产品,其销量分别为 b i , b 2 , ⋯   , b n \text b_ i,\text b_2,\cdots,\text b_\text n bi,b2,,bn。从工地运往销地的单位运费为 c ij \text c_\text {ij} cij。试决定应在哪些地方建厂,既满足各地需要,又使总建设费用和总运输费用最省?

B 1 \text B_\text 1 B1 B 2 \text B_\text 2 B2 ⋯ \cdots B n \text B_\text n Bn生产能力建设费用
A 1 \text A_\text 1 A1 c 11 \text c_\text {11} c11 c 12 \text c_\text {12} c12 ⋯ \cdots c 1   n \text c_\text {1\,n} c1n a 1 a_1 a1 f 1 \text f_\text 1 f1
A 2 \text A_\text 2 A2 c 21 \text c_\text {21} c21 c 22 \text c_\text {22} c22 ⋯ \cdots c 2   n \text c_\text {2\,n} c2n a 2 a_2 a2 f 2 \text f_\text 2 f2
⋮ \vdots ⋮ \vdots ⋮ \vdots ⋱ \ddots ⋮ \vdots ⋮ \vdots ⋮ \vdots
A m \text A_\text m Am c m   1 \text c_\text {m\,1} cm1 c m2 \text c_\text {m2} cm2 ⋯ \cdots c mn \text c_\text {mn} cmn a m a_\text m am f m \text f_\text m fm
销量 b 1 \text b_\text 1 b1 b 2 \text b_\text 2 b2 ⋯ \cdots b n \text b_\text n bn

​ 设: x ij x_{\text{ij}} xij表示从工厂 A i \text A_\text i Ai运往销地 B j \text B_\text j Bj的运量。 y i = { 1 在 A i 建厂 0 不在 A i 建厂 y_\text i=\begin{cases}1&在\text A_\text i建厂\\0&不在\text A_\text i建厂\end{cases} yi={10Ai建厂不在Ai建厂
min ⁡ z = ∑ i = 1 m ∑ j = 1 n c ij x ij + ∑ i = 1 m f i y i \min\quad z=\sum_{\text i=1}^m\sum_{\text j=1}^n\text c_{\text{ij}}x_{\text{ij}}+\sum_{\text i=1}^m\text f_\text iy_\text i minz=i=1mj=1ncijxij+i=1mfiyi

s.t. { ∑ j = 1 n x ij ≤ a i y i i = 1 , 2 , ⋯   , m ∑ i = 1 m x ij ≥ b j j = 1 , 2 , ⋯   , n x ij ≥ 0 i = 1 , 2 , ⋯   , m、j = 1 , 2 , ⋯   , n y i = 0 或 1 i = 1 , 2 , ⋯   , m \text{s.t.}\quad \begin{cases} \sum\limits_{\text j=1}^\text nx_{\text{ij}}\le a_\text iy_\text i&\text i=1,2,\cdots,\text m\\ \sum\limits_{\text i=1}^\text mx_{\text{ij}}\ge \text b_\text j&\text j=1,2,\cdots,\text n\\ x_\text{ij}\ge0&\text i=1,2,\cdots,\text m、\text j=1,2,\cdots,\text n\\ y_\text i=0或1&\text i=1,2,\cdots,\text m \end{cases} s.t. j=1nxijaiyii=1mxijbjxij0yi=01i=1,2,,mj=1,2,,ni=1,2,,mj=1,2,,ni=1,2,,m

整数规划的一般形式如下
max ⁡ z = ∑ j = 1 n c j x j \max\quad z=\sum_{\text j=1}^\text n\text c_\text jx_\text j maxz=j=1ncjxj

s.t. { ∑ j = 1 n a ij x j = b i i = 1 , 2 , ⋯   , m x j ≥ 0 j = 1 , 2 , ⋯   , n x j ∈ Z j = 1 , 2 , ⋯   , n \text{s.t.}\quad \begin{cases} \sum\limits_{\text j=1}^\text na_{\text{ij}}x_\text j= \text b_\text i&\text i=1,2,\cdots,\text m\\ x_\text j\ge0&\text j=1,2,\cdots,\text n\\ x_\text j\in\Z&\text j=1,2,\cdots,\text n\\ \end{cases} s.t. j=1naijxj=bixj0xjZi=1,2,,mj=1,2,,nj=1,2,,n

分类

​ 依照决策变量取整要求的不同,整数规划可分为纯整数规划、全整数规划、混合整数规划、0-1整数规划。

  • 纯整数规划:所有决策变量要求取非负整数,这时引进的松弛变量和剩余变量可以不要求取整数。
  • 全整数规划:除了所有决策变量要求取非负整数外,系数 a ij a_{\text{ij}} aij和常数 b i \text b_\text i bi也要求取整数,这时引进的松弛变量和剩余变量也必须是整数。
  • 混合整数规划:只有一部分的决策变量要求取非负整数,另一部分可以取非负实数。
  • 0-1整数规划:所有决策变量只能取0或1两个整数。

​ 这四个分类中都要求决策变量是非负整数,我觉得这是因为数学模型解决的是生活中的实际问题,而不是单纯的数学问题,所以这里对决策变量做了非负整数的规定。

松弛变量与剩余变量:为了使线性约束的不等式约束变为等式约束,我们通过引入额外的变量来达到这一目的,即松弛变量剩余变量
s.t. x 1 + x 2 ≤ 10 (1) \text{s.t.}\quad x_1+x_2\le10\tag 1 s.t.x1+x210(1)

s.t. { x 1 + x 2 + x 3 = 10 x 3 ≥ 0 (2) \text{s.t.}\quad\tag 2 \begin{cases} \begin{aligned} x_1+x_2+x_3=10\\ x_3\ge0 \end{aligned} \end{cases} s.t.{x1+x2+x3=10x30(2)

​ 通过引入 x 3 x_3 x3,可以把约束条件 ( 1 ) (1) (1)中的小于等于号 ≤ \le 变为 = = =。约束条件 ( 1 ) (1) (1)与约束条件 ( 2 ) (2) (2)是等价的,区别就在于决策变量的个数不同。我们把 x 3 x_3 x3称为松弛变量
s.t. x 4 + x 5 ≥ 10 (3) \text{s.t.}\quad x_4+x_5\ge10\tag 3 s.t.x4+x510(3)

s.t. { x 4 + x 5 − x 6 = 10 x 6 ≥ 0 (4) \text{s.t.}\quad\tag 4 \begin{cases} \begin{aligned} x_4+x_5-x_6=10\\ x_6\ge0 \end{aligned} \end{cases} s.t.{x4+x5x6=10x60(4)

​ 通过引入 x 6 x_6 x6,可以把约束条件 ( 3 ) (3) (3)中的大于等于号 ≥ \ge 变为 = = =。约束条件 ( 3 ) (3) (3)与约束条件 ( 4 ) (4) (4)是等价的,区别就在于决策变量的个数不同。我们把 x 6 x_6 x6称为剩余变量

与松弛线性规划的联系

  • 整数规划可行解是松弛问题可行域中的整数格点。
  • 松弛问题无可行解,则整数规划无可行解。
  • 整数规划最优值要劣于松弛问题的最优值。
  • 松弛问题最优解满足整数要求,则该最优解为整数规划最优解。
  • 整数规划最优解不是松弛问题最优解简单的四舍五入,这样做不能保证解的最优性以及满足约束条件。

例3 设整数规划问题如下
max ⁡ z = x 1 + x 2 \max\quad z=x_1+x_2 maxz=x1+x2

s.t. { 14 x 1 + 9 x 2 ≤ 51 − 6 x 1 + 3 x 2 ≤ 1 x 1 , x 2 ≥ 0 x 1 , x 2 ∈ Z \text{s.t.}\quad \begin{cases} \begin{aligned} 14x_1+9x_2\le51\\ -6x_1+3x_2\le1\\ x_1,x_2\ge0\\ x_1,x_2\in \Z \end{aligned} \end{cases} s.t. 14x1+9x2516x1+3x21x1,x20x1,x2Z

​ 首先不考虑整数约束,得到线性规划问题(也称为松弛问题伴随问题)。
max ⁡ z = x 1 + x 2 \max\quad z=x_1+x_2 maxz=x1+x2

s.t. { 14 x 1 + 9 x 2 ≤ 51 − 6 x 1 + 3 x 2 ≤ 1 x 1 , x 2 ≥ 0 \text{s.t.}\quad \begin{cases} \begin{aligned} 14x_1+9x_2\le51\\ -6x_1+3x_2\le1\\ x_1,x_2\ge0\\ \end{aligned} \end{cases} s.t. 14x1+9x2516x1+3x21x1,x20

image-20221024161706962
可行域

​ 用图解法求出最优解 x 1 = 3 2 , x 2 = 10 3 , z = 29 6 x_1=\frac{3}{2},x_2=\frac{10}{3},z=\frac{29}{6} x1=23,x2=310,z=629

​ 现求整数解(最优解):如用“舍入取整法”可得到4个点即 ( 1 , 3 ) , ( 2 , 3 ) , ( 1 , 4 ) , ( 2 , 4 ) (1,3),(2,3),(1,4),(2,4) (1,3),(2,3),(1,4),(2,4)。显然它们都不可能是整数规划的最优解,因为它们都不在可行域内。

​ 按整数规划约束条件,其可行解是线性规划问题的可行域内的整数格点。固整数规划问题的可行解是一个有限集。因此,可将集合内的整数点一一找出,其最大目标函数的值为最优解,此法为完全枚举法。

​ 如上例:其中 ( 2 , 2 ) , ( 3 , 1 ) (2,2),(3,1) (2,2),(3,1)点目标函数取到最大值, z = 4 z=4 z=4

模型求解方法

​ 对于有较大可行域的整数规划问题,枚举法有点不太适用。目前,常用的求解整数规划的方法有:分枝定界法割平面法;对于0-1规划问题采用隐枚举法和匈牙利法

分枝定界法

求解步骤
  1. 不考虑整数限制先求出相应松弛问题的最优解。
    1. 若松弛问题无可行解,则整数规划无可行解。
    2. 若求得的松弛问题最优解符合整数要求,则是原整数规划的最优解。
  2. 若不满足整数条件,则任选一个不满足整数条件的变量 x i x_\text i xi来构造新的约束条件添加到松弛问题中形成两个子问题 x i ≤ [ x i ] ; x i ≥ [ x i ] + 1 x_\text i\le[x_\text i];x_\text i\ge[x_\text i]+1 xi[xi];xi[xi]+1
  3. 依次在缩小的可行域中求解新构造的松弛规划的最优解,并重复上述过程,直到子问题无解或有整数最优解(被查清)。
求解细节
  • 在分支的过程中,若当前已经得到满足整数要求的最优值为 z m z_\text m zm,则该 z m z_\text m zm就可作为一个过滤条件,对于最优值小于或等于 z m z_\text m zm的子问题无需再分支,则这样的子问题被称为被剪枝。未被剪枝的子问题需要继续分支。
  • 分支定界法的最终子问题要么被查清要么被剪枝。
  • 若两个子问题 P 1 , P 2 \text P_1,\text P_2 P1,P2的松弛规划的最优解分别为 z 1 , z 2 z_1,z_2 z1,z2,且 z 1 < z 2 z_1<z_2 z1<z2,则优先选取 P 2 \text P_2 P2进行分支(目标函数为求解最大值)。这是因为如果先对 P 2 \text P_2 P2进行分支,则 P 2 \text P_2 P2的子问题有可能存在最优值大于 P 1 \text P_1 P1的最优值 z 1 z_1 z1的整数解,此时 P 1 \text P_1 P1被剪枝,我们无需再对 P 1 \text P_1 P1及其子问题讨论了;但若是先对 P 1 \text P_1 P1进行分支,则 P 1 \text P_1 P1的所有子问题的最优值一定小于 P 2 \text P_2 P2的最优值(约束越多最优值越差),所以 P 2 \text P_2 P2一定不会被剪枝。
对分支定界法的理解

​ 整数规划对应的松弛问题的最优解 x = [ a 1 , a 2 , ⋯   , a n ] x=[a_1,a_2,\cdots,a_\text n] x=[a1,a2,,an],且该最优解不满足整数约束。我们假定该整数规划是存在最优解的,设整数规划的最优解为 x = [ b 1 , b 2 , ⋯   , b n ] x=[\text b_1,\text b_2,\cdots,\text b_\text n] x=[b1,b2,,bn]。则 b i ≤ [ a i ] 或 b i ≥ [ a i ] + 1 i = 1 , 2 , ⋯   , n \text b_\text i\le[a_\text i]或\text b_\text i\ge[a_\text i]+1\quad \text i=1,2,\cdots,\text n bi[ai]bi[ai]+1i=1,2,,n,所以对于任意一个 x i = a i x_\text i=a_\text i xi=ai,我们可以根据排除法添加一个约束条件 x i ≤ [ x i ] 或 x i ≥ [ x i ] + 1 x_\text i\le[x_\text i]或x_\text i\ge[x_\text i]+1 xi[xi]xi[xi]+1形成两个子问题,减小了可行域的范围。然后不断的对最优解不满足整数约束的子问题进行分支,直到子问题被查清或者被剪枝。

例4 用分枝定界法求解该整数规划问题:
max ⁡ z = x 1 + x 2 \max\quad z=x_1+x_2 maxz=x1+x2

s.t. { x 1 + 9 14 x 2 ≤ 51 14 − 2 x 1 + x 2 ≤ 1 3 x 1 , x 2 ≥ 0 且 ∈ Z \text{s.t.}\quad \begin{cases} \begin{aligned} x_1+\frac{9}{14}x_2\le\frac{51}{14}\\ -2x_1+x_2\le\frac{1}{3}\\ x_1,x_2\ge0且\in\Z \end{aligned} \end{cases} s.t. x1+149x214512x1+x231x1,x20Z

​ 首先对松弛问题 P 0 \text P_0 P0求解,最优解为 x 1 = 3 2 , x 2 = 10 3 x_1=\frac{3}{2},x_2=\frac{10}{3} x1=23,x2=310,最优值 z = 4 z=4 z=4。显然最优值不满足整数约束,所以要根据最优解的情况进行分枝。

​ 我们先以 x 1 x_1 x1的取值划分子问题,也就是分别以 x 1 ≤ [ 3 2 ] x_1\le[\frac{3}{2}] x1[23] x 2 ≥ [ 3 2 ] + 1 x_2\ge[\frac{3}{2}]+1 x2[23]+1为约束条件添加到原松弛问题中形成两个子问题 P 1 , P 2 \text P_1,\text P_2 P1,P2(还是松弛问题)。并对 P 1 , P 2 \text P_1,\text P_2 P1,P2求解。 P 1 \text P_1 P1的最优解为 x 1 = 1 , x 2 = 7 3 x_1=1,x_2=\frac{7}{3} x1=1,x2=37,最优值 z = 10 3 z=\frac{10}{3} z=310 P 2 \text P_2 P2的最优解为 x 1 = 2 , x 2 = 23 9 x_1=2,x_2=\frac{23}{9} x1=2,x2=923,最优值 z = 41 9 z=\frac{41}{9} z=941。显然 P 1 , P 2 \text P_1,\text P_2 P1,P2的最优解都不满足整数约束,所以还要进行分支,但是 P 2 \text P_2 P2的最优值要优于 P 1 \text P_1 P1的最优值( z 2 ≥ z 1 z_2\ge z_1 z2z1),所以我们优先对 P 2 \text P_2 P2进行分枝。

​ 然后就是计算各个分枝的解,直到所有分枝都被查清或者被剪枝

流程图
流程图

割平面法

求解步骤
  • 求解线性规划最优解
    • 若线性规划无解,则整数规划无解
    • 若求得的松弛问题最优解符合整数要求,则是原整数规划的最优解
  • 引入松弛变量构造切割方程,约束条件中有几个不等式约束,就引入几个松弛变量。并对引入松弛变量的等式约束进行线性变换,使其变为一个决策变量 x i x_\text i xi和松弛变量线性组合 ∑ a ik x k \sum a_{\text{ik}}x_\text k aikxk的叠加,如下式。

x i + ∑ a ik x k = b i i = 1 , 2 , ⋯ x_\text i+\sum a_{\text{ik}}x_\text k=\text b_\text i\quad \text i=1,2,\cdots xi+aikxk=bii=1,2,

​ 然后选取其中一个等式约束构造切割方程,我们将系数 a ik , b i a_{\text{ik}},\text b_\text i aik,bi分解为小数部分和整数部分,小数部分的范围是 [ 0 , 1 ) [0,1) [0,1)。整数部分可以是负数。
a ik = [ a ik ] + ( a ik − [ a ik ] ) = [ a ik ] + f ik a_{\text{ik}}=[a_{\text{ik}}]+(a_{\text{ik}}-[a_{\text{ik}}])=[a_{\text{ik}}]+\text f_{\text{ik}} aik=[aik]+(aik[aik])=[aik]+fik

b i = [ b i ] + ( b i − [ b i ] ) = [ b i ] + f i \text b_\text i=[\text b_\text i]+(\text b_\text i-[\text b_\text i])=[\text b_\text i]+\text f_\text i bi=[bi]+(bi[bi])=[bi]+fi

​ 然后将所有的整数部分放在方程的左侧,小数部分放在右侧。
x i + ∑ [ a ik ] x k + ∑ f ik x k = [ b i ] + f i ⇓ x i + ∑ [ a ik ] x k − [ b i ] = f i − ∑ f ik x k x_i+\sum[a_\text{ik}]x_\text k+\sum \text f_\text{ik}x_\text k=[\text b_\text i]+\text f_\text i\\ \Downarrow\\ x_i+\sum[a_\text{ik}]x_\text k-[\text b_\text i]=\text f_\text i-\sum \text f_\text{ik}x_\text k xi+[aik]xk+fikxk=[bi]+fixi+[aik]xk[bi]=fifikxk
​ 方程左侧 x i + ∑ [ a ik ] x k − [ b i ] x_i+\sum[a_\text{ik}]x_\text k-[\text b_\text i] xi+[aik]xk[bi]是整数的线性组合,所以结果也必然是整数;方程式右侧 f i \text f_\text i fi是小数,且有 0 ≤ f i < 1 0\le\text f_\text i<1 0fi<1,而 ∑ f ik x k \sum \text f_\text{ik}x_\text k fikxk一定是大于0的(松弛变量 x k ≥ 0 x_\text k\ge0 xk0),所以方程右侧满足 f i − ∑ f ik x k < 1 \text f_\text i-\sum \text f_\text{ik}x_\text k<1 fifikxk<1。考虑到方程式左侧是整数,则方程式右侧也必定是整数,固有 f i − ∑ f ik x k ≤ 0 \text f_\text i-\sum \text f_\text{ik}x_\text k\le0 fifikxk0。于是我们便多了一个约束条件。

  • 然后将新的约束带入到松弛问题中求解,如果得到的最优解不满足整数约束,我们再选取另一个等式约束重新构造切割方程形成新的约束,再带入问题中求解,反复循环直到求出整数解或者所有切割方程均无整数解为止。
image-20221024171209093

例6 求解下面的整数规划:
max ⁡ z = x 1 + x 2 \max\quad z=x_1+x_2 maxz=x1+x2

s.t. { − x 1 + x 2 ≤ 1 3 x 1 + x 2 ≤ 4 x 1 , x 2 ≥ 0 x 1 , x 2 ∈ Z \text{s.t.}\quad \begin{cases} \begin{aligned} -x_1+x_2\le1\\ 3x_1+x_2\le4\\ x_1,x_2\ge0\\ x_1,x_2\in\Z \end{aligned} \end{cases} s.t. x1+x213x1+x24x1,x20x1,x2Z

image-20221024171333709

LP : x 1 = 3 4 , x 2 = 7 4 , z = 5 2 ; IP : x 1 = 1 , x 2 = 1 , z = 2 \text{LP}:x_1=\frac{3}{4},x_2=\frac{7}{4},z=\frac{5}{2};\text{IP}:x_1=1,x_2=1,z=2 LP:x1=43,x2=47,z=25;IP:x1=1,x2=1,z=2 LP \text{LP} LP表示线性规划, IP \text{IP} IP表示整数规划。

​ 约束条件中有两个不等式约束,所以我们引入两个松弛变量 x 3 , x 4 x_3,x_4 x3,x4
max ⁡ z = x 1 + x 2 + 0 x 3 + 0 x 4 \max\quad z=x_1+x_2+0x_3+0x_4 maxz=x1+x2+0x3+0x4

s.t. { − x 1 + x 2 + x 3 = 1 3 x 1 + x 2 + x 4 = 4 x 1 , x 2 , x 3 , x 4 ≥ 0 x 1 , x 2 , x 3 , x 4 ∈ Z (5) \text{s.t.}\quad\tag 5 \begin{cases} \begin{aligned} -x_1+x_2+x_3=1\\ 3x_1+x_2+x_4=4\\ x_1,x_2,x_3,x_4\ge0\\ x_1,x_2,x_3,x_4\in\Z \end{aligned} \end{cases} s.t. x1+x2+x3=13x1+x2+x4=4x1,x2,x3,x40x1,x2,x3,x4Z(5)

​ 然后我们对 ( 5 ) (5) (5)进行线性变换:
s.t. { x 1 − 1 4 x 3 + 1 4 x 4 = 3 4 x 2 + 3 4 x 3 + 1 4 x 4 = 7 4 x 1 , x 2 , x 3 , x 4 ≥ 0 x 1 , x 2 , x 3 , x 4 ∈ Z (6) \text{s.t.}\quad\tag6 \begin{cases} \begin{aligned} \small{x_1-\frac{1}{4}x_3+\frac{1}{4}x_4=\frac{3}{4}}\\ \small{x_2+\frac{3}{4}x_3+\frac{1}{4}x_4=\frac{7}{4}}\\ x_1,x_2,x_3,x_4\ge0\\ x_1,x_2,x_3,x_4\in\Z \end{aligned} \end{cases} s.t. x141x3+41x4=43x2+43x3+41x4=47x1,x2,x3,x40x1,x2,x3,x4Z(6)
​ 然后可以构造两个切割方程:
x 1 − x 3 = 3 4 − ( 3 4 x 3 + 1 4 x 4 ) x_1-x_3=\frac{3}{4}-(\frac{3}{4}x_3+\frac{1}{4}x_4) x1x3=43(43x3+41x4)

x 2 − 1 = 3 4 − ( 3 4 x 3 + 1 4 x 4 ) x_2-1=\frac{3}{4}-(\frac{3}{4}x_3+\frac{1}{4}x_4) x21=43(43x3+41x4)

​ 形成两个新的约束条件。此例题中这两个切割方程得出的约束条件是相同的(这个我也不知道为啥是相同的,可能是因为 n \text n n个切割方程只能得到 n 2 \frac{\text n}{2} 2n个新的约束条件吧,这只是我的猜测)。
3 x 3 + x 4 ≤ 3 3x_3+x_4\le3 3x3+x43
​ 最后将其带入到 ( 5 ) (5) (5)式中可以得到:
x 2 ≤ 1 x_2\le1 x21
​ 新的可行域如下:

可行域3

​ 用割平面法形象的解释就是 x 2 ∈ Z + x_2\in\Z_+ x2Z+,所以我们可以把 x 2 ∈ ( 1 , 7 4 ] x_2\in(1,\frac{7}{4}] x2(1,47]的可行域给割掉,割掉的部分不含整数解。

0-1变量的使用

非指派问题

例7 投资问题

​ 有600万元投资5个项目,收益如表,求利润最大的方案?

项目投资额项目收益
1210160
2300210
315060
413080
5260180

​ 约束条件:项目1,2,3中选一项;项目3,4中选一项;项目5以项目1位先验条件(就是投资项目1才能投资项目5,当然也可以不投)。
设 x j = { 1 选中第j个项目投资 0 不选第j个项目投资 设x_\text j= \begin{cases} 1&选中第\text j个项目投资\\ 0&不选第\text j个项目投资 \end{cases} xj={10选中第j个项目投资不选第j个项目投资

max ⁡ z = 160 x 1 + 210 x 2 + 60 x 3 + 80 x 4 + 180 x 5 \max\quad z=160x_1+210x_2+60x_3+80x_4+180x_5 maxz=160x1+210x2+60x3+80x4+180x5

s.t. { 210 x 1 + 300 + x 2 + 150 x 3 + 130 x 4 + 260 x 5 ≤ 600 x 1 + x 2 + x 3 = 1 x 3 + x 4 = 1 x 5 ≤ x 1 x 1 , x 2 , x 3 , x 4 , x 5 = 0 或 1 \text{s.t.}\quad \begin{cases} \begin{aligned} 210x_1+300+x2+150x_3+130x_4+260x_5\le600\\ x_1+x_2+x_3=1\\ x_3+x_4=1\\ x_5\le x_1\\ x_1,x_2,x_3,x_4,x_5=0或1 \end{aligned} \end{cases} s.t. 210x1+300+x2+150x3+130x4+260x5600x1+x2+x3=1x3+x4=1x5x1x1,x2,x3,x4,x5=01

例8 互斥类问题

​ 例如某种工序的约束条件为: 4 x 1 + 5 x 2 ≤ 200 4x_1+5x_2\le200 4x1+5x2200,企业也可以考虑一种新的加工工序: 3 x 1 + 5 x 2 ≤ 180 3x_1+5x_2\le180 3x1+5x2180。这两个工序只能选其一,是互相排斥的。引入0-1变量 y y y,令:
y = { 1 采用原工序 0 采用新工序 y= \begin{cases} 1&采用原工序\\ 0&采用新工序 \end{cases} y={10采用原工序采用新工序
​ 互斥问题可由下述的条件来代替,其中 M \text M M是充分大的数。
s.t. { 4 x 1 + 5 x 2 ≤ 200 + ( 1 − y ) M 3 x 1 + 5 x 2 ≤ 180 + y M \text{s.t.}\quad \begin{cases} \begin{aligned} 4x_1+5x_2\le200+(1-y)\text M\\ 3x_1+5x_2\le180+y\text M \end{aligned} \end{cases} s.t.{4x1+5x2200+(1y)M3x1+5x2180+yM
​ 假设采取原工序,则 y = 1 y=1 y=1。第二个约束条件的右边 180 + y M 180+y\text M 180+yM可看做 ∞ \infty 所以也就是 3 x 1 + 5 x 2 3x_1+5x_2 3x1+5x2可以取任意值,因为不管怎么取值都不会比 ∞ \infty 更大。

互斥问题的推广

​ 从下述 p \text p p个约束条件中恰好选择 q \text q q个约束条件:
∑ j = 1 n a ij x j ≤ b i i = 1 , 2 , ⋯   , p \sum_{\text j=1}^\text na_\text{ij}x_\text j\le\text b_\text i\quad \text i=1,2,\cdots,\text p j=1naijxjbii=1,2,,p

y i = { 0 选第i个约束条件 1 不选第i个约束条件 i = 1 , 2 , ⋯   , p y_\text i= \begin{cases} 0&选第\text i个约束条件\\ 1&不选第\text i个约束条件 \end{cases} \quad \text i=1,2,\cdots,\text p yi={01选第i个约束条件不选第i个约束条件i=1,2,,p

​ 新的约束如下:
s.t. { ∑ j = 1 n a ij x j ≤ b i + M y i ∑ i = 1 p y i = p − q i = 1 , 2 , ⋯   , p \text{s.t.}\quad \begin{cases} \begin{aligned} \sum_{\text j=1}^\text na_\text{ij}x_\text j\le\text b_\text i+\text My_\text i\\ \sum_{\text i=1}^\text py_i=\text p-\text q \end{aligned} \end{cases} \qquad \text i=1,2,\cdots,\text p s.t. j=1naijxjbi+Myii=1pyi=pqi=1,2,,p

例9 固定费用问题

​ 服装公司租用生产线拟生产 T \text T T恤,衬衫和裤子。每年可用劳动力 8200 h 8200\text h 8200h,布料 8800 m 2 8800\text m^2 8800m2

T \text T T衬衫裤子
劳动力326
布料0.81.11.5
售价250400600
可变成本100180300
生产租金(万)201510

设   y i = { 1 要租用生产线j 0 不租用生产线j j = 1 , 2 , 3 ;第j种服装生产量 x j 设\,y_\text i= \begin{cases} 1&要租用生产线\text j\\ 0&不租用生产线\text j \end{cases} \quad \text j=1,2,3;第\text j种服装生产量x_\text j yi={10要租用生产线j不租用生产线jj=1,2,3;第j种服装生产量xj

max ⁡ z = 150 x 1 + 220 x 2 + 300 x 3 − 200000 y 1 − 150000 y 2 − 100000 y 3 \max\quad z=150x_1+220x_2+300x_3-200000y_1-150000y_2-100000y_3 maxz=150x1+220x2+300x3200000y1150000y2100000y3

s.t. { 3 x 1 + 2 x 2 + 6 x 3 ≤ 8200 0.8 x 1 + 1.1 x 2 + 1.5 x 3 ≤ 8800 x 1 , x 2 , x 3 ≥ 0 , 且 ∈ Z y 1 , y 2 , y 3 = 0 或 1 x 1 ≤ M y 1 x 2 ≤ M y 2 x 3 ≤ M y 3 \text{s.t.}\quad \begin{cases} \begin{aligned} 3x_1+2x_2+6x_3\le8200\\ 0.8x_1+1.1x_2+1.5x_3\le8800\\ x_1,x_2,x_3\ge0,且\in \Z\\ y_1,y_2,y_3=0或1\\ x_1\le \text My_1\\ x_2\le \text My_2\\ x_3\le \text My_3 \end{aligned} \end{cases} s.t. 3x1+2x2+6x382000.8x1+1.1x2+1.5x38800x1,x2,x30,Zy1,y2,y3=01x1My1x2My2x3My3

M \text M M取充分大的数,当 y i = 1 y_\text i=1 yi=1时,则对应的 x i x_\text i xi可以任意取值;当 y i = 0 y_\text i=0 yi=0时,则对应的 x i x_\text i xi只能等于0;

指派问题

例10 指派问题

​ 甲乙丙丁四个人, ABCD \text{ABCD} ABCD四项工作,要求每人只能做一项工作,每项工作只能由一人完成,问如何指派总时间最短?

A \text A A B \text B B C \text C C D \text D D
3584
6854
2585
9252

引入0-1变量 x ij x_\text {ij} xij
x ij = { 1 第i人做第j项工作 0 第i人不做第j项工作 x_{\text{ij}}= \begin{cases} 1&第\text i人做第\text j项工作\\ 0&第\text i人不做第\text j项工作 \end{cases} xij={10i人做第j项工作i人不做第j项工作

min ⁡ z = 3 x 11 + 5 x 12 + 8 x 13 + 4 x 14 + 6 x 21 + 8 x 22 + 5 x 23 + 4 x 24 + 2 x 31 + 5 x 32 + 8 x 33 + 5 x 34 + 9 x 41 + 2 x 42 + 5 x 43 + 2 x 44 \min\quad z=3x_{11}+5x_{12}+8x_{13}+4x_{14}+6x_{21}+8x_{22}+5x_{23}+4x_{24}+2x_{31}+5x_{32}+8x_{33}+5x_{34}+9x_{41}+2x_{42}+5x_{43}+2x_{44} minz=3x11+5x12+8x13+4x14+6x21+8x22+5x23+4x24+2x31+5x32+8x33+5x34+9x41+2x42+5x43+2x44

​ 一个工作只由一人完成
{ x 11 + x 21 + x 31 + x 41 = 1 x 12 + x 22 + x 32 + x 42 = 1 x 13 + x 23 + x 33 + x 43 = 1 x 14 + x 24 + x 34 + x 44 = 1 \begin{cases} x_{11}+x_{21}+x_{31}+x_{41}=1\\ x_{12}+x_{22}+x_{32}+x_{42}=1\\ x_{13}+x_{23}+x_{33}+x_{43}=1\\ x_{14}+x_{24}+x_{34}+x_{44}=1 \end{cases} x11+x21+x31+x41=1x12+x22+x32+x42=1x13+x23+x33+x43=1x14+x24+x34+x44=1

​ 一个人只完成一项任务
{ x 11 + x 12 + x 13 + x 14 = 1 x 21 + x 22 + x 23 + x 24 = 1 x 31 + x 32 + x 33 + x 34 = 1 x 41 + x 42 + x 43 + x 44 = 1 \begin{cases} x_{11}+x_{12}+x_{13}+x_{14}=1\\ x_{21}+x_{22}+x_{23}+x_{24}=1\\ x_{31}+x_{32}+x_{33}+x_{34}=1\\ x_{41}+x_{42}+x_{43}+x_{44}=1 \end{cases} x11+x12+x13+x14=1x21+x22+x23+x24=1x31+x32+x33+x34=1x41+x42+x43+x44=1

指派问题的标准形式

​ 有 n \text n n个人和 n \text n n项工作,已知第 i \text i i个人做第 j \text j j项工作的代价为 c ij ( i , j = 1 , 2 , ⋯   , n ) \text c_{\text{ij}}(\text i,\text j=1,2,\cdots,\text n) cij(i,j=1,2,,n),要求每项工作只能交由其中一人完成,每个人只能完成其中一项工作,问如何分配可使总代价最少?
C = ( c ij ) n × n = ( c 11 c 12 ⋯ c 1 n c 21 c 22 ⋯ c 2 n ⋮ ⋮ ⋱ ⋮ c n 1 c n 2 ⋯ c nn ) \bf C=(\text c_{\text{ij}})_{\text n\times\text n}= \begin{pmatrix} \text c_{11}&\text c_{12}&\cdots&\text c_{1\text n}\\ \text c_{21}&\text c_{22}&\cdots&\text c_{2\text n}\\ \vdots&\vdots&\ddots&\vdots\\ \text c_{\text n1}&\text c_{\text n2}&\cdots&\text c_{\text{nn}}\\ \end{pmatrix} C=(cij)n×n= c11c21cn1c12c22cn2c1nc2ncnn
C \bf C C是指派问题的系数矩阵, i \text i i行元素表示第 i \text i i个人完成各项工作的代价; j \text j j列元素表示各人完成第 j \text j j项工作的代价。

指派问题的数学模型

x ij = { 1 第i个人做第j项工作 0 第i个人不做第j项工作 i , j = 1 , 2 , ⋯   , n x_{\text{ij}}= \begin{cases} 1&第\text i个人做第\text j项工作\\ 0&第\text i个人不做第\text j项工作 \end{cases} \qquad \text i,\text j=1,2,\cdots,n xij={10i个人做第j项工作i个人不做第j项工作i,j=1,2,,n

min ⁡ z = ∑ i = 1 n ∑ j = 1 n c ij x ij \min\quad z=\sum_{\text i=1}^\text n\sum_{\text j=1}^\text n\text c_{\text{ij}}x_{\text{ij}} minz=i=1nj=1ncijxij

s.t. { ∑ j = 1 n x ij = 1 ∑ i = 1 n x ij = 1 x ij = 0 或 1 i , j = 1 , 2 , ⋯   , n \text{s.t.}\quad \begin{cases} \begin{aligned} \sum_{\text j=1}^\text nx_{\text {ij}}=1\\ \sum_{\text i=1}^\text nx_{\text {ij}}=1\\ x_{\text{ij}}=0或1 \end{aligned} \end{cases} \qquad \text i,\text j=1,2,\cdots,\text n s.t. j=1nxij=1i=1nxij=1xij=01i,j=1,2,,n

X = ( x ij ) n × n = ( x 11 x 12 ⋯ x 1 n x 21 x 22 ⋯ x 2 n ⋮ ⋮ ⋱ ⋮ x n 1 x n 2 ⋯ x nn ) \bf{X}=(x_{\text{ij}})_{\text n\times\text n}= \begin{pmatrix} x_{11}&x_{12}&\cdots&x_{1\text n}\\ x_{21}&x_{22}&\cdots&x_{2\text n}\\ \vdots&\vdots&\ddots&\vdots\\ x_{\text n1}&x_{\text n2}&\cdots&x_{\text{nn}}\\ \end{pmatrix} X=(xij)n×n= x11x21xn1x12x22xn2x1nx2nxnn

​ 指派问题可行解中,每行每列有且只有一个1。

非标准形式的指派问题
  • 最大化指派问题

C = ( c ij ) n × n \bf C=(\text c_{\text{ij}})_{\text n\times\text n} C=(cij)n×n中最大元素为 m \text m m,令 B = ( b ij ) n × n = ( m − c ij ) n × n \bf B=(\text b_{\text{ij}})_{\text n\times\text n}=(\text m-\text c_{\text{ij}})_{\text n\times\text n} B=(bij)n×n=(mcij)n×n(其实也就是加负号的变型而已,之所以每个元素都加 m \text m m,是为了保证每个元素都大于0)。

  • 人数和工作数不等
    • 人少工作多:添加虚拟的“人”,代价都为0
    • 人多工作少:添加虚拟的“工作”,代价都为0
  • 一个人可做多件工作

​ 该人可以等价为几个相同的人。

  • 某工作一定不能由某人做

​ 该人做该工作的相应代价取足够大 M \text M M,只要该人做了这件工作,则肯定不是最优解。

非标准形式的指派问题转换为标准型的思想就是将最终的矩阵转变为方阵

匈牙利法的一般步骤
  • 变换指派问题的系数矩阵(也称效率矩阵) ( c ij ) (\text c_\text{ij}) (cij) ( b ij ) (\text b_\text{ij}) (bij),使在 ( b ij ) (\text b_\text{ij}) (bij)的各行各列中都出现0元素。
    • ( c ij ) (\text c_\text{ij}) (cij)的每行元素都减去该行的最小元素;
    • 再从所得新系数矩阵的每列元素中减去该列的最小元素。
  • 进行试指派,以寻求最优解。在 ( b ij ) (\text b_\text{ij}) (bij)中找尽可能多的独立0元素,若能找出 n \text n n个独立0元素,就以这 n \text n n个独立0元素对应解矩阵 ( x ij ) (x_\text{ij}) (xij)中的元素为1,其余为0,这就得到最优解。找独立0元素常用的步骤为:
    • 从只有一个0元素的行(列)开始,给这个0元素加圈,记作 ⨀ \bigodot 。然后划去 ⨀ \bigodot 所在列(行)的其他0元素,记作 ⨂ \bigotimes ;这表示这列所代表的任务已指派完,不必再考虑别人了。
    • 从只有一个0元素的列(行)开始,给这个0元素加圈,记作 ⨀ \bigodot 。然后划去 ⨀ \bigodot 所在行(列)的其他0元素,记作 ⨂ \bigotimes ;这表示这行所代表的人已指派完,不必再考虑其他工作了。
    • 反复进行上述两步,直到尽可能多的0元素都被圈出和划掉为止。
    • 若仍有没有划圈的0元素,且同行(列)的0元素至少有两个,则从剩有0元素最少的行(列)开始,比较这行(列)各0元素所在列(行)中0元素的数目,选择0元素最少的那列(行)对应的0元素加圈(表示选择性多的要礼让选择性少的)。然后划掉同行同列的其他零元素。可反复进行,直到所有0元素都已圈出和划掉为止。
    • ⨀ \bigodot 元素的数目 m \text m m等于矩阵的阶数 n \text n n,那么这指派问题的最优解已得到。若 m < n \text m<\text n m<n则转入下一步。
  • 作最少的直线覆盖所有 ⨀ \bigodot 元素。
    • 对没有 ⨀ \bigodot 的行打√号;
    • 对已打√号的行中所有含 ⨂ \bigotimes 元素的列打√号;
    • 再对打√号的列中含 ⨀ \bigodot 元素的行打√号;
    • 重复上述两步直到得不出新的打√号的行列为止;
    • 对没有打√号的行画横线,有打√号的列画纵线,这就得到覆盖所有 ⨀ \bigodot 元素最少的直线数 l l l l l l应该等于 m \text m m,若不相等,说明试指派过程有误,回到第二步的(4),另行试指派(也就是最初的那种可能不是最优解);若 l = m < n l=\text m<\text n l=m<n,需再变换当前的系数矩阵,以找到 n \text n n个独立的0元素,为此转第四步。
  • 变换系数矩阵 ( b ij ) (\text b_\text{ij}) (bij)以增加0元素。在没有被直线覆盖的所有元素中找出最小元素,然后√号的各行(没有划线的行)都减去这个最小元素;打√号各列(划线的列)都加上这个最小元素(以保证系数矩阵中不出现负元素,个人觉得即使不这样做也不会出现负元素)。新系数矩阵的最优解和原问题仍相同。转回第二步。
对匈牙利解法的理解
  • ⨀ \bigodot 所在的行和列不会有第二个 ⨀ \bigodot ,这是因为如果一个0元素被圈了,就说明这一列对应的工作和这一行对应的人都已经被指派了。所以就要划去这一行和这一列所有的0元素,避免发生指派冲突。
  • 在作最少直线覆盖所有的 ⨀ \bigodot 元素这一步中,之所以对没有 ⨀ \bigodot 的行打√号,是因为在划横线时是对没有打√号的行划线,这样所有的 ⨀ \bigodot 元素都会被横线覆盖。
  • 对含有 ⨂ \bigotimes 元素的列划√号是因为这一列大概率有 ⨀ \bigodot 元素,而且打√号的列会划线,所以在划纵线时,这个 ⨀ \bigodot 元素(假设存在 b i g o d o t \text bigodot bigodot元素)就会被覆盖,所以横线就没有必要划了,于是我们就在 ⨀ \bigodot 所在的行打√号,这样穿过 ⨀ \bigodot 元素只有纵线。
  • 最后所有 ⨀ \bigodot 元素与 ⨂ \bigotimes 只会被横线或者纵线贯穿,不会同时被两者贯穿。
  • 最后一步进行加减最小值时, ⨀ \bigodot 元素和 ⨂ \bigotimes 元素不变化,再重新指派时,这两种元素恢复为最初的0元素。并且所有元素只能进行加或者减操作,不能既加最小值,又减最小最小值。我们假设存在这样的元素,则这个元素一定是行√号和纵√号的交点,所以这个元素一定是 ⨀ \bigodot 元素或者 ⨂ \bigotimes

例11 有一份中文说明书,需译成英、日、德、俄四种文字,分别记作 A,B,C,D \text{A,B,C,D} A,B,C,D。现有甲、乙、丙、丁四人,他们将中文说明书译成不同语种的说明书所需时间如下表所示,问如何分派任务,可使总时间最少?

A \text A A67112
B \text B B4598
C \text C C31104
C \text C C5982

求解过程如下:

  1. 变换系数矩阵:

    1. 每行减去该行的最小元素

    ( 6 7 11 2 4 5 9 8 3 1 10 4 5 9 8 2 ) − ( 2 2 2 2 4 4 4 4 1 1 1 1 2 2 2 2 ) = ( 4 5 9 0 0 1 5 4 2 0 9 3 3 7 6 0 ) \begin{pmatrix} 6&7&11&2\\ 4&5&9&8\\ 3&1&10&4\\ 5&9&8&2\\ \end{pmatrix}- \begin{pmatrix} 2&2&2&2\\ 4&4&4&4\\ 1&1&1&1\\ 2&2&2&2\\ \end{pmatrix}= \begin{pmatrix} 4&5&9&0\\ 0&1&5&4\\ 2&0&9&3\\ 3&7&6&0\\ \end{pmatrix} 643575191191082842 2412241224122412 = 4023510795960430

    1. 每列减去该列的最小元素

    ( 4 5 9 0 0 1 5 4 2 0 9 3 3 7 6 0 ) − ( 0 0 5 0 0 0 5 0 0 0 5 0 0 0 5 0 ) = ( 4 5 4 0 0 1 0 4 2 0 4 3 3 7 1 0 ) \begin{pmatrix} 4&5&9&0\\ 0&1&5&4\\ 2&0&9&3\\ 3&7&6&0\\ \end{pmatrix}- \begin{pmatrix} 0&0&5&0\\ 0&0&5&0\\ 0&0&5&0\\ 0&0&5&0\\ \end{pmatrix}= \begin{pmatrix} 4&5&4&0\\ 0&1&0&4\\ 2&0&4&3\\ 3&7&1&0\\ \end{pmatrix} 4023510795960430 0000000055550000 = 4023510740410430

  2. 试指派:

( 4 5 4 0 0 1 0 4 2 0 4 3 3 7 1 0 ) ⟹ ( 4 5 4 ⨀ ⨀ 1 ⨂ 4 2 ⨀ 4 3 3 7 1 ⨂ ) \begin{pmatrix} 4&5&4&0\\ 0&1&0&4\\ 2&0&4&3\\ 3&7&1&0\\ \end{pmatrix} \Longrightarrow \begin{pmatrix} 4&5&4&\bigodot\\ \bigodot&1&\bigotimes&4\\ 2&\bigodot&4&3\\ 3&7&1&\bigotimes\\ \end{pmatrix} 4023510740410430 42351744143

​ 找到3个独立0元素,但 m = 3 < n \text m=3<\text n m=3<n。进行下一步

  1. 做最少直线覆盖所有 ⨀ \bigodot 元素。
划线矩阵

​ 4.变换系数矩阵 ( b ij ) (\text b_\text{ij}) (bij)以增加0元素(最小元素为1):
( 4 5 4 ⨀ ⨀ 1 ⨂ 4 2 ⨀ 4 3 3 7 1 ⨂ ) − ( 1 1 1 1 0 0 0 − 1 0 0 0 − 1 1 1 1 1 ) = ( 3 4 3 ⨀ ⨀ 1 ⨂ 5 2 ⨀ 4 4 2 6 0 ⨂ ) \begin{pmatrix} 4&5&4&\bigodot\\ \bigodot&1&\bigotimes&4\\ 2&\bigodot&4&3\\ 3&7&1&\bigotimes\\ \end{pmatrix}- \begin{pmatrix} 1&1&1&1\\ 0&0&0&-1\\ 0&0&0&-1\\ 1&1&1&1\\ \end{pmatrix}= \begin{pmatrix} 3&4&3&\bigodot\\ \bigodot&1&\bigotimes&5\\ 2&\bigodot&4&4\\ 2&6&0&\bigotimes\\ \end{pmatrix} 42351744143 1001100110011111 = 32241634054

  1. 转第二步进行试指派

( 3 4 3 ⨀ ⨀ 1 ⨂ 5 2 ⨀ 4 4 2 6 0 ⨂ ) ⟹ ( 3 4 3 0 0 1 0 5 2 0 4 4 2 6 0 0 ) ⟹ ( 3 4 3 ⨀ ⨀ 1 ⨂ 5 2 ⨀ 4 4 2 6 ⨀ ⨂ ) ⟹ ( 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 ) \begin{pmatrix} 3&4&3&\bigodot\\ \bigodot&1&\bigotimes&5\\ 2&\bigodot&4&4\\ 2&6&0&\bigotimes\\ \end{pmatrix} \Longrightarrow \begin{pmatrix} 3&4&3&0\\ 0&1&0&5\\ 2&0&4&4\\ 2&6&0&0\\ \end{pmatrix} \Longrightarrow \begin{pmatrix} 3&4&3&\bigodot\\ \bigodot&1&\bigotimes&5\\ 2&\bigodot&4&4\\ 2&6&\bigodot&\bigotimes\\ \end{pmatrix} \Longrightarrow \begin{pmatrix} 0&0&0&1\\ 1&0&0&0\\ 0&1&0&0\\ 0&0&1&0\\ \end{pmatrix} 32241634054 3022410630400540 3224163454 0100001000011000

​ 整数规划问题的求解可以使用 Lingo \text{Lingo} Lingo等专用软件。对于一般的整数规划问题,无法直接利用 MATLAB \text{MATLAB} MATLAB的函数求解,必须利用 MATLAB \text{MATLAB} MATLAB编程实现分枝定界法和割平面法。但对于指派问题等特殊的整数规划问题有时可以直接利用 MATLAB \text{MATLAB} MATLAB的函数 linporg \text {linporg} linporg

例12 求解下列指派问题,已知指派矩阵为:
C = ( 3 8 2 10 3 8 7 2 9 7 6 4 2 7 5 8 4 2 3 5 9 10 6 9 10 ) \bf C= \begin{pmatrix} 3&8&2&10&3\\ 8&7&2&9&7\\ 6&4&2&7&5\\ 8&4&2&3&5\\ 9&10&6&9&10 \end{pmatrix} C= 3868987441022226109739375510
MATLAB \text{MATLAB} MATLAB程序如下:

c=[3 8 2 10 3;8 7 2 9 7;6 4 2 7 5;8 4 2 3 5;9 10 6 9 10];
c=c(:);
a=zeros(10,25);
for i=1:5
    a(i,(i-1)*5+1:5*i)=1;
    a(5+i,i:5:25)=1;
end
b=ones(10,1);
[x,y]=linprog(c,[],[],a,b,zeros(25,1),ones(25,1));
X=reshape(x,5,5)
opt=y

​ 解矩阵为:
X = ( 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 ) \bf X= \begin{pmatrix} 0&0&0&0&1\\ 0&0&1&0&0\\ 0&1&0&0&0\\ 0&0&0&1&0\\ 1&0&0&0&0\\ \end{pmatrix} X= 0000100100010000001010000
​ 最优值为21.

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
摘要 货运公司的运输问题直接关系到货运公司的经济效益和长远发展。本文以线性规划为基础,通过建立线性规划模型、图论模型以及通过0-1规划研究了具有供求平衡、有序卸货特点的运输问题,求解最小运费,通过优化来确定运输线路和卸货顺序,从而得出最佳运输方案。 货运公司的运输问题是涉及最短路径、最少运费、合理的卸货顺序的配送优化问题,要综合考虑运输路径、装载方式以及卸货顺序等方面。 本题中已给出了唯一的路线图、各公司所需材料量和相关费用。首先,题目规定派出6辆6吨车,出车成本既定,就要尽量减少出车次数,同时合理规划路线和卸货顺序。为此建立了两个线性规划模型。 模型Ⅰ:线性规划模型 在不考虑运输路线和卸货过程,要减少出车次数,建立简单的线性规划模型求出最少出车次数S为27次。在这个前提下,由于出车后不能掉头,再考虑每个车次的出车方向和运载方式。由于出车不是顺时针就是逆时针,采用0-1规划来确定出车方向,以运输量为决策变量,以车容量、卸货顺序和各公司需求建立线性规划模型求解。 模型Ⅱ:图论模型 由于模型中有大量0-1规划需计算,没有很好的算法,建立图论模型来优化派遣方案。在图论模型中,首先尽量满载,其次利用贪婪算法来考虑各公司为满足的材料量,以车容量和卸货顺序为约束逐步计算出最优化的派遣方案(附表一)。 问题二中,出车后可以掉头,就产生了两种可能减少总运费的运输方式,经过证明可得仅有货物全部卸载完毕后选择最短返程路线可以节省运费,于是在问题一的基础上修改即得到问题二中的最优化派遣方案(附表二)。 问题三中,增加了运输车的种类,并改变了不同类型运输车空载时的运费。于是装载方式多样化。仍以满载为前提,并尽量保证同车货物卸载同地,在问题二的基础上,增加相关约束条件,通过规划得出安排的车辆数为3辆车,一辆6吨位的,两辆8吨位,并得出最优化派遣方案(附表三)。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值