文章内容大致介绍:
规划中的变量(部分或全部)限制为整数时,称为整数规划。若在线性规划模型中, 变量限制为整数,则称为整数线性规划。目前所流行的求解整数规划的方法,往往只适用于整数线性规划。目前还没有一种方法能有效地求解一切整数规划(IP问题)。
【注】:这篇博客不是应试不是应试不是应试 (/bushi) 第一次学着用 latex 打公式,好吧,俺承认这确实很香…如有错误,还望dalao批评指正。
提示:以下是本篇文章正文内容,下面案例可供参考
要求一部分或全部决策变量必须取整数值的规划问题称为整数规划(integer programming,IP)。不考虑整数条件,由余下的目标函数和约束条件构成的规划问题称为该整数规划的松弛问题(slack problem)。若松弛问题是一个线性规划,则称该整数规划为整数线性规划(integer linear programming)。整数线性规划数学模型的一般形式为:
max ( 或 m i n ) Z = ∑ j = 1 n c j x j ( 5.1 a ) \max(或min)Z = \sum_{j=1}^n c_{j}x_{j} (5.1a) max(或min)Z=j=1∑ncjxj(5.1a)
s . t . { ∑ j = 1 n a i j x j ≤ ( 或 = , 或 ≥ ) b i ( i = 1 , 2 , . . , m ) ( 5.1 b ) x i ≥ 0 ( j = 1 , 2 , . . . , n ) ( 5.1 c ) x 1 , x 2 , . . . , x n 中 部 分 或 全 部 取 整 数 s.t. \begin{cases} \sum_{j=1}^n a_{ij}x_{j}≤(或=,或≥)b_{i}(i=1,2,..,m)(5.1b)\ \\x_{i}≥0(j=1,2,...,n)(5.1c) \\ x_{1},x_{2},...,x_{n}中部分或全部取整数 \end{cases} s.t.⎩⎪⎨⎪⎧∑j=1naijxj≤(或=,或≥)bi(i=1,2,..,m)(5.1b) xi≥0(j=1,2,...,n)(5.1c)x1,x2,...,xn中部分或全部取整数
· 整数线性规划问题可以分为下列几种类型:
- 纯整数线性规划(pure integer linear programming):指全部决策变量都必须取整数值的线性规划。有时,也称全整数规划。
- 混合整数线性规划(mixed integer linear programming):指决策变量中有一部分必须取整数值,另一部分可以不取整数值的整数线性规划。
- 0-1型整数线性规划(zero-one integer linear programming):指决策变量只能取0或1的整数线性规划。
【注】本章仅讨论整数线性规划。后面提到的整数规划,一般都是指纯整数线性规划。
【注】下面四个例子主要从一般整数规划,0-1型整数规划,指派问题以及如何将问题转换为整数规划问题来研究。
【例一】 班次安排问题。下表给出了某公司上班时间段及所需人员数,问题中提出该公司需配备多少人员,才能满足公式的正常运转。
时间段 | 5:00-7:00 | 7:00-9:00 | 9:00-11:00 | 11:00-13:00 | 13:00-15:00 |
---|---|---|---|---|---|
所需人数 | 26 | 50 | 34 | 40 | 38 |
时间段 | 15:00-7:00 | 17:00-19:00 | 19:00-21:00 | 21:00-23:00 |
---|---|---|---|---|
所需人数 | 50 | 46 | 36 | 26 |
模型建立:
设 x 1 x_{1} x1, x 2 x_{2} x2,…, x 9 x_{9} x9分别为从5:00至17:00各时段开始的上班人数,该题列出了如下线性规划模型:
min Z = x 1 + x 2 + x 3 + x 4 + x 5 + x 6 + x 7 \min Z = x_{1}+x_{2}+x_{3}+x_{4}+x_{5}+x_{6}+x_{7} minZ=x1+x2+x3+x4+x5+x6+x7
s . t . { x 1 ≥ 26 x 1 + x 2 ≥ 50 x 1 + x 2 + x 3 ≥ 34 x 2 + x 3 + x 4 ≥ 40 x 3 + x 4 + x 5 ≥ 38 x 4 + x 5 + x 6 ≥ 50 x 5 + x 6 + x 7 ≥ 46 x 6 + x 7 ≥ 36 x 7 ≥ 26 x j ≥ 0 ( j = 1 , 2 , . . . , 7 ) s.t. \begin{cases} \ x_{1}≥26 \\x_{1}+x_{2}≥50\\ x_{1}+x_{2}+x_{3}≥34 \\ x_{2}+x_{3}+x_{4}≥40\\ x_{3}+x_{4}+x_{5}≥38 \\ x_{4}+x_{5}+x_{6}≥50\\ x_{5}+x_{6}+x_{7}≥46\\ x_{6}+x_{7}≥36\\ x_{7}≥26\\ x_{j}≥0 (j=1,2,...,7)\end{cases} s.t.⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧ x1≥26x1+x2≥50x1+x2+x3≥34x2+x3+x4≥40x3+x4+x5≥38x4+x5+x6≥50x5+x6+x7≥46x6+x7≥36x7≥26xj≥0(j=1,2,...,7)
实际上要求 x j ≥ 0 ( j = 1 , 2 , . . . , 7 ) x_{j}≥0 (j=1,2,...,7) xj≥0(j=1,2,...,7)必须取整数值,所以这是一个整数规划问题。
【例二】 背包问题。一个旅行者外出旅行,携带一背包,装一些最有用的东西,共有n件物品可供选择。已知每件物品的“使用价值” c j c_{j} cj和质量 a j a_{j} aj,要求:
(1) 最多携带物品的质量为b千克;
(2)每件物品要么不带,要么只能整件携带。
携带哪些物品能使总使用价值最大?
问题分析
这是关于决策问题中比较经典的0-1规划问题。可选方案很多,决策方案是带什么,选择的方式是要么带,要么不带,这是一个二值逻辑问题。
模型建立
引进0-1变量
x i = { 1 , 携 带 第 i 种 物 品 0 , 不 携 带 第 i 种 物 品 x_{i}= \begin{cases}\ 1,携带第i种物品\\ 0,不携带第i种物品 \end{cases} xi={ 1,携带第i种物品0,不携带第i种物品
目标函数
使用价值最大,即
max Z = ∑ i = 1 n c i x i \max Z = \sum_{i=1}^n c_{i}x_{i} maxZ=i=1∑ncixi
约束条件
(1)质量限制;
(2)携带方式限制。
则数学模型可以描述为:
max Z = ∑ i = 1 n c i x i \max Z = \sum_{i=1}^n c_{i}x_{i} maxZ=i=1∑ncixi
s . t . { ∑ i = 1 n a i x i ≤ b x i = 0 或 1 , i = 1 , 2 , . . . , n . s.t. \begin{cases} \sum_{i=1}^n a_{i}x_{i}≤b\ \\x_{i}=0或1,i=1,2,...,n. \end{cases} s.t.{ ∑i=1naixi≤b xi=0或1,i=1,2,...,n.
【例三】 指派问题。某商业公司计划开办5家新商店,决定由5家建筑公司分别承建。已知建筑公司 A i ( i = 1 , 2 , . . . , 5 ) A_{i} (i=1,2,...,5) Ai(i=1,2,...,5) 对新商店 B j ( j = 1 , 2 , . . . , 5 ) B_{j}(j=1,2,...,5) Bj(j=1,2,...,5) 的建造费用报价如下表所示。问:商业公司应对5家建筑公司如何分配建造任务,使得总建造费用最小?
B 1 B_{1} B1 | B 2 B_{2} B2 | B 3 B_{3} B3 | B 4 B_{4} B4 | B 5 B_{5} B5 | |
---|---|---|---|---|---|
A 1 A_{1} A1 | 4 | 8 | 7 | 15 | 12 |
A 2 A_{2} A2 | 7 | 9 | 17 | 14 | 10 |
A 3 A_{3} A3 | 6 | 9 | 12 | 8 | 7 |
A 4 A_{4} A4 | 6 | 7 | 14 | 6 | 10 |
A 5 A_{5} A5 | 6 | 9 | 12 | 10 | 6 |
这是一个标准的指派问题。若设0-1变量
x i j = { 1 , 当 A i 承 建 B j 时 0 , 当 A i 不 承 建 B j 时 ( i , j = 1 , 2 , 3 , 4 , 5 ) x_{ij}= \begin{cases} \ 1,当 A_{i} 承建 B_{j} 时 \\ 0,当 A_{i} 不承建 B_{j} 时 \end{cases}(i,j=1,2,3,4,5) xij={ 1,当Ai承建Bj时0,当Ai不承建Bj时(i,j=1,2,3,4,5)
则问题的数学模型为
m i n Z = 4 x 11 + 8 x 12 + . . . + 10 x 54 + 6 x 55 min Z=4x_{11}+8x_{12}+...+10x_{54}+6x_{55} minZ=4x11+8x12+...+10x54+6x55
s . t . { ∑ i = 1 5 x i j = 1 ( j = 1 , 2 , . . . , 5 ) ∑ j = 1 5 x i j = 1 ( i = 1 , 2 , . . . , 5 ) x i j = 0 或 1 ( i , j = 1 , 2 , . . . , 5 ) s.t. \begin{cases} \sum_{i=1}^5 x_{ij}=1(j=1,2,...,5) \\\sum_{j=1}^5 x_{ij}=1(i=1,2,...,5)\\x_{ij}=0或1(i,j=1,2,...,5) \end{cases} s.t.⎩⎪⎨⎪⎧∑i=15xij=1(j=1,2,...,5)∑j=15xij=1(i=1,2,...,5)xij=0或1(i,j=1,2,...,5)
【例四】 旅行商问题(又称货郎担问题)。有一推销员,从城市 v 1 v_{1} v1出发,要遍访城市 v 2 v_{2} v2, v 3 v_{3} v3,…, v n v_{n} vn各一次,最后返回 v 1 v_{1} v1。已知从 v i v_{i} vi到 v j v_{j} vj的旅费为 c i j c_{ij} cij。问他应按怎样的次序访问这些城市,才能使总旅费最少。
问题分析
旅行商问题是一个经典的图论问题,可以归结为一个成本最低的行走路线安排问题。这一问题的应用非常广泛,如城市交通网络建设等,其困难在于模型与算法的准确性和高效性,至今仍是图论研究领域的热点问题之一。
首先,推销员要访问到每一个城市,而且访问次数只能有一次,不能重复访问;任意一对城市之间可以连通,其费用已知,费用可以理解为距离、时间或乘坐交通工具的费用等;其次每访问一个城市,则这个城市既是本次访问的终点,又是下一次访问的起点;访问完所有城市后,最后应回到出发点。这一问题可用图论中的赋权图的结构形式来描述。这里用纯粹的0-1整数规划来构建其模型。
模型建立
决策变量:对每一对城市 v i v_{i} vi, v j v_{j} vj,定义一个变量 v i v_{i} vi出发访问 v j v_{j} vj,令
x i j = { 1 , 如 果 推 销 员 决 定 从 v i 直 接 进 入 v j 0 , 否 则 . x_{ij}= \begin{cases} \ 1,如果推销员决定从v_{i}直接进入v_{j} \\ 0,否则. \end{cases} xij={ 1,如果推销员决定从vi直接进入vj0,否则.
其中 i , j = 1 , 2 , . . . , n i,j=1,2,...,n i,j=1,2,...,n
目标函数
若推销员决定从 v i v_{i} vi直接进入 v j v_{j} vj,则其旅行费用为 c i j x i j c_{ij}x_{ij} cijxij,于是总旅费为
Z = ∑ i = 1 n ∑ j = 1 n c i j x i j Z=\sum_{i=1}^n\sum_{j=1}^n c_{ij}x_{ij} Z=i=1∑nj=1∑ncijxij
其中,若 i = j i=j i=j,则规定 c i j = M c_{ij}=M cij=M, M M M为事先选定的充分大实数, i , j = 1 , 2 , . . . , n i,j=1,2,...,n i,j=1,2,...,n。
约束条件
(1) 每个城市恰好进入一次
(2) 每个城市离开一次
(3) 为防止在遍历的过程中,出现子回路,即无法返回出发点的情形,附加一个强制性约束:
u i − u j + n x i j ≤ n − 1 ( i , j = 1 , 2 , . . . , n ) u_{i}-u_{j}+nx_{ij} ≤ n-1(i,j=1,2,...,n) ui−uj+nxij≤n−1(i,j=1,2,...,n)
式中: u 1 = 0 u_{1}=0 u1=0, 1 ≤ u i ≤ n − 1 1≤u_{i}≤n-1 1≤ui≤n−1, i = 2 , . . . , n i=2,...,n i=2,...,n
综上所述,建立旅行商问题的如下0-1整数规划模型:
m i n Z = ∑ i = 1 n ∑ j = 1 n c i j x i j , min Z=\sum_{i=1}^n\sum_{j=1}^n c_{ij}x_{ij}, minZ=i=1∑nj=1∑ncijxij,
s . t . { ∑ i = 1 n x i j = 1 ( j = 1 , 2 , . . . , n ) ∑ j = 1 n x i j = 1 ( i = 1 , 2 , . . . , n ) u i − u j + n x i j ≤ n − 1 ( i , j = 1 , 2 , . . . , n ) u 1 = 0 , 1 ≤ u i ≤ n − 1 ( i , j = 1 , 2 , . . . , n ) x i j = 0 或 1 ( i , j = 1 , 2 , . . . , 5 ) s.t. \begin{cases} \sum_{i=1}^n x_{ij}=1(j=1,2,...,n) \\\sum_{j=1}^n x_{ij}=1(i=1,2,...,n)\\u_{i}-u_{j}+nx_{ij} ≤ n-1(i,j=1,2,...,n)\\u_{1}=0,1≤u_{i}≤n-1(i,j=1,2,...,n)\\x_{ij}=0或1(i,j=1,2,...,5) \end{cases} s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧∑i=1nxij=1(j=1,2,...,n)∑j=1nxij=1(i=1,2,...,n)ui−uj+nxij≤n−1(i,j=1,2,...,n)u1=0,1≤ui≤n−1(i,j=1,2,...,n)xij=0或1(i,j=1,2,...,5)
若仅考虑前面两个约束式,则式类似于指派问题的模型,对于旅行商问题的模型只是必要条件,并不充分。
· 旅行商问题有两个可证特点:
(1)任何含子回路的路线都必然不满足约束条件式(不管 u i u_{i} ui如何取值)
(2)全部不含子回路的整体巡回路线都可以满足约束条件式(只要 u i u_{i} ui取合适的值)
证明并不难,在此不赘述。
整数线性规划及其松弛问题,从解的特点上来说,二者之间既有密切的联系,又有本质的区别。
松弛问题作为一个线性规划问题,其可行解的集合是一个凸集,任意两个可行解的凸组合仍为可行解。整数规划问题的可行解集合是它的松弛问题可行解集合的一个子集,任意两个可行解的凸组合不一定满足整数约束条件,因而不一定仍为可行解。由于整数规划问题的可行解一定也是它的松弛问题的可行解(反之则不一定),所以,前者最优解的目标函数值不会优于后者最优解的目标函数值。
在一般情况下,松弛问题的最优解不会刚好满足变量的整数约束条件,因而不是整数规划的可行解,自然就不是整数规划的最优解。此时,若对松弛问题的这个最优解中不符合整数要求的分量简单地取整,所得到的解不一定是整数规划问题的最优解,甚至也不一定是整数规划问题的可行解。
由于整数规划及其松弛问题之间的上述特殊关系,先求出松弛问题的最优解,再用简单取整的方法虽然简单,却不是求解整数规划问题的有效方法。
考虑纯整数规划问题
max Z = ∑ j = 1 n c j x j \max Z = \sum_{j=1}^n c_{j}x_{j} maxZ=j=1∑ncjxj
s . t . { ∑ j = 1 n a i j x j ≤ b , i = 1 , 2 , . . . , n . x j ≥ 0 , j = 1 , 2 , . . . , n . x j 取 整 数 s.t. \begin{cases} \sum_{j=1}^n a_{ij}x_{j}≤b,i=1,2,...,n.\ \\x_{j}≥0,j=1,2,...,n.\\ x_{j}取整数 \end{cases} s.t.⎩⎪⎨⎪⎧∑j=1naijxj≤b,i=1,2,...,n. xj≥0,j=1,2,...,n.xj取整数
设其中 a i j ( i = 1 , 2 , . . . , m ; j = 1 , 2 , . . . , n ) a_{ij}(i=1,2,...,m;j=1,2,...,n) aij(i=1,2,...,m;j=1,2,...,n)和 b i ( i = 1 , 2 , . . . , m ) b_{i}(i=1,2,...,m) bi(i=1,2,...,m)皆为整数(若不为整数时,可乘上一个倍数化为整数)。
纯整数规划的松弛问题由上式构成,是一个线性规划问题,可以用单纯形法求解。
用单纯形法求得的最优解若不全为整数,则松弛问题的最优解并非是整数规划问题的最优解,下面我们介绍割平面法。
用割平面法(cutting plane approach)解整数规划问题时,若其松弛问题的最优解 X ∗ X^* X∗不满足,则从 X ∗ X^* X∗的非整分量中选取一个,用以构造一个线性约束条件,将其加入原松弛问题中,形成一个新的线性规划,然后求解之。若新的最优解满足整数条件要求,则它就是整数规划问题的最优解;否则,重复上述步骤,直到获得整数的最优解为止。
为最终获得整数最优解,每次增加的线性约束条件应当具备两个基本性质:其一是已获得的不符合整数要求的线性规划最优解不满足该线性约束条件,从而不可能在以后的解中再出现;其二是凡整数可行解均满足该线性约束条件,因而整数最优解始终被保留在每次形成的线性规划可行域中。
下面展示手解割平面法:
割平面法在1958 年由高莫瑞 ( R . E . G o m o r y ) (R.E.Gomory) (R.E.Gomory)首先提出,故又称 Gomory 割平面法在割平面法中,每次增加的用于“切割”的线性约束称为割平面约束或 G o m o r y Gomory Gomory 约束。构造割平面约束的方法很多,但上图中式⑤的约束条件是最常用的一种,它可以从相应线性规划的最终单纯形表中直接产生。
实际解题时,经验表明若从最优单纯形表中选择具有最大小(分)数部分的非整分量所在行构造割平面约束,往往可以提高“切割”效果,减少“切割”次数。
在用割平面法解整数规划时常常会遇到收敛速度很慢的情形。因此在实际使用的时候往往与下一节中讲述的分支定界法配合使用。
这里就暂不安排割平面法的例题了。
我将重点放在接下来介绍的分支定界法。
混合整数规划问题一般有无限多个可行解。即使是纯整数规划问题,随着问题规模的扩大,其可行解的数目也将急剧增加。因此通过枚举全部可行解,并从其中筛选出最优解的算法无实际应用价值。分支定界法(branch and bound method)是一种隐枚举法(implicit enumeration)或部分枚举法,它不是一种有效算法,是枚举法基础上改进的。分支定界法的关键是分支和定界。
若整数规划的松弛问题的最优解不符合整数要求,假设 x i = b i ˉ x_{i}=\bar{b_{i}} xi=biˉ不符合整数要求, [ b i ˉ ] [\bar{b_{i}}] [biˉ]是不超过 b i ˉ \bar{b_{i}} biˉ的最大整数,则构成两个约束条件, x i ≤ b i ˉ x_{i}≤\bar{b_{i}} xi≤biˉ和 x i ≥ b i ˉ + 1 x_{i}≥\bar{b_{i}}+1 xi≥biˉ+1。分别将其并入上述松弛问题中,从而形成两个分支,即两个后继问题。两个后继问题的可行域中包含原整数规划的所有可行解,而在原松弛问题可行域中,满足 [ b i ˉ ] < x i < [ b i ˉ ] + 1 [\bar{b_{i}}]<x_{i}<[\bar{b_{i}}]+1 [biˉ]<xi<[biˉ]+1的一部分区域在以后的求解过程中国被遗弃了,然而它不包含整数规划的任何可行解。根据需要,各后继问题可以类似地产生自己的分支,即自己的后继问题。如此不断继续,直到获得整数规划的最优解。这就是所谓的“分支”。
所谓“定界”,实在分支的过程中,若某个后继问题恰巧获得整数规划问题的一个可行解,那么,它的目标函数值就是一个“界限”,可作为衡量处理其他分支的一个依据。因为整数规划问题的可行解集是它的松弛问题可行解集的一个子集,前者最优解的目标函数值不会优于后者最优解的目标函数值。所以,对于那些相应松弛问题最优解的目标函数值比上述“界限”值差的后继问题,就可以剔除而不再考虑了。当然,如果再以后的分支过程中出现了更好的“界限”,则以它来取代原来的界限,这样就可以提高定界的效果。
“分支”为整数规划最优解的出现创造了条件,而“定界”则可以提高搜索效率。经验表明,在可能的情况下,根据对实际问题的了解,事先选择一个合理的“界限”,可以提高分支定界法的搜索效率。
下面我们通过一个例子来阐明分支定界法的基本思想和一般步骤。
【例五】 求解
m a x Z = x 1 + x 2 max 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 x 1 , x 2 取 整 数 s.t. \begin{cases} \ x_{1}+\frac {9}{14}x_{2} ≤\frac {51}{14} \\ -2x_{1}+x_{2}≤\frac {1}{3} \\ x_{1},x_{2}≥0 \\x_{1},x_{2}取整数 \end{cases} s.t.⎩⎪⎪⎪⎨⎪⎪⎪⎧ x1+149x2≤1451−2x1+x2≤31x1,x2≥0x1,x2取整数
解 记整数归回问题为(IP),它的松弛问题为(LP)。图5-3中S为(LP)的可行域,黑点表示(IP)的可行域。用单纯形法(LP),最优解为 x 1 = 3 2 , x 2 = 10 3 x_{1}=\frac {3}{2},x_{2}=\frac {10}{3} x1=23,x2=310,即点A, m a x z = 29 6 max z=\frac {29}{6} maxz=629。
(LP)的最优解不符合整数要求,可任选一个变量,如选择 x 1 = 3 2 x_{1}= \frac {3}{2} x1=23进行分支。由于最接近 3 2 \frac {3}{2} 23的整数时1和2,因而可以构造两个约束条件
x 1 ≥ 2 ( a ) x_{1}≥2(a) x1≥2(a)
和
x 2 ≤ 1 ( b ) x_{2}≤1(b) x2≤1(b)
将(a)和(b)分别并入例题的松弛问题(LP)中,形成两个分支,即后继问题 ( L P 1 ) (LP_{1}) (LP1)和 ( L P 2 ) (LP_{2}) (LP2)的可行域。不连通的域 S 1 ∪ S 2 S1∪S2 S1∪S2中包含了(IP)的所有可行解,S中被舍去的一部分 S S S \ S 1 ∪ S 2 S1∪S2 S1∪S2中不包含(IP)的任何可行解。
解 ( L P 1 ) (LP_{1}) (LP1),最优解为 x 1 = 2 , x 2 = 23 9 x_{1}=2,x_{2}=\frac {23}{9} x1=2,x2=923,即点B, m a x z = 41 9 max z=\frac {41}{9} maxz=941。点B仍不符合整数要求,再解 ( L P 2 ) (LP_{2}) (LP2)最优解为 x 1 = 1 , x 2 = 7 3 x_{1}=1,x_{2}=\frac {7}{3} x1=1,x2=37,即点C, m a x z = 10 3 max z=\frac {10}{3} maxz=310。点C也不符合整数要求。因此,必须继续分支。
我们继续构造约束条件,继续形成两个分支,形成后继问题。最终可以得到:
最优解为: x 1 = 3 , x 2 = 1 x_{1}=3,x_{2}=1 x1=3,x2=1和 x 1 = 2 , x 2 = 2 , max z = 4 x_{1}=2,x_{2}=2, \max z = 4 x1=2,x2=2,maxz=4。
上述分支定界法的求解过程可以用下图表示:
· 分支定界法的一般步骤: 设有最大化的整数规划问题A ,与它相对应的松弛问题为B。 (1)先不考虑原问题的整数约束,求解相应的松弛问题。用图解法或单纯形法求得最优解,记为分枝定界法的一般步骤 。
(2)若求得的最优解分枝定界法的一般步骤 刚好就是整数解,则该整数解就是原整数规划问题的最优解;否则,对原问题进行分枝寻求整数最优解。
(3)分支。根据对变量重要性的了解,在最优解中选择一个不符合整数约束条件的 x j x_{j} xj ,其值为 b j b_{j} bj
,以[ b j ˉ \bar{b_{j}} bjˉ]表示小于 b j b_{j} bj的最大整数。构造两个约束条件: x ≤ [ b j ˉ ] x ≤ [\bar{b_{j}}] x≤[bjˉ]和 x ≥ [ b j ˉ ] + 1 x ≥ [\bar{b_{j}}]+1 x≥[bjˉ]+1分别加入原LP问题形成两个子问题,因为
[ b j ˉ ] [\bar{b_{j}}] [bjˉ]与 [ b j ˉ ] + 1 [\bar{b_{j}}]+1 [bjˉ]+1之间无整数,故这两个子集内的整数解必定与原可行解集合整数解一致,这一步称为“分支”。
(4)定界。首先判断各个子问题是否存在整数解。若存在,找出目标函数值最大对应的整数解,设为 Z ∗ Z^* Z∗,则A问题的整数解目标函数 Z ≥ Z ∗ Z≥Z^* Z≥Z∗,这就是定界。而且分枝过程中,一旦有某个子问题 Z ≥ Z ∗ Z≥Z^* Z≥Z∗,则令 Z ∗ = Z Z^*=Z Z∗=Z。
(5)若存在大于 Z ∗ Z^* Z∗的子问题则需分枝。第(4)步中若不存在整数解,也需继续分枝寻找整数解,并从目标函数值最大对应的子问题先分枝。
(6)若所有子问题的目标值都小于等于 Z ∗ Z^* Z∗,则不需继续分枝, Z ∗ Z^* Z∗所对应的整数解即为最优解。
分支定界法时求解整数规划问题的较好方法,在实际问题中有着广泛应用。
前面在【例2】中有简单给出0-1整数规划的例子,如前所述,若变量只能取0或1,则称其为0-1变量。
0-1变量作为逻辑变量(logical variable),常被用来表示系统是否处于某一个特定状态,或者决策时是否取某个特定方案,例如:
x = { 1 , 当 决 策 方 案 P 时 0 , 当 决 策 方 案 不 取 P 时 ( 即 取 P ˉ 时 ) x= \begin{cases}\ 1,当决策方案P时\\ 0,当决策方案不取P时(即取\bar{P}时) \end{cases} x={ 1,当决策方案P时0,当决策方案不取P时(即取Pˉ时)
当问题含有多项要素,而每项要素皆有两种选择的时,
x i = { 1 , 若 E j 选 择 A j 0 , 若 E j 选 择 A j ˉ ( j = 1 , 2 , . . . , n ) x_{i}= \begin{cases}\ 1,若E_{j}选择A_{j}\\ 0,若E_{j}选择\bar{A_{j}} \end{cases}(j=1,2,...,n) xi={ 1,若Ej选择Aj0,若Ej选择Ajˉ(j=1,2,...,n)
那么,向量 ( x 1 , x 2 , . . . , x n ) T (x_{1},x_{2},...,x_{n})^T (x1,x2,...,xn)T就描述了问题的特定状态或方案,即
在应用中,有时会遇到变量可以取多个整数值的问题。这时,利用0-1变量是二进制变量(binary variable)的性质,可以用一组0-1变量来取代变量。例如:变量x可取0与9之间的任意整数时,可令
x = 2 0 x 0 + 2 1 x 1 + 2 2 x 2 + 2 3 x 3 ≤ 9 x=2^0x_{0}+2^1x_{1}+2^2x_{2}+2^3x_{3}≤9 x=20x0+21x1+22x2+23x3≤9
其中, x 0 , x 1 , x 2 , x 3 x_{0},x_{1},x_{2},x_{3} x0,x1,x2,x3皆为0-1变量。
0-1变量不仅广泛应用于科学技术问题,在经济管理问题中也有十分重要的应用。
关于0-1整数规划问题约束条件的设置是十分有趣的,你需要阅读大量实例来感悟约束条件应如何用数学表达式展现。0-1整数规划的建模过程是一大难点,尽管它的决策变量的取值非常简单。多积累0-1整数规划问题的模型,对“数感”的培养也十分有益。
0-1型整数规划是一种特殊的整数规划,若含有n个变量,则可以产生 2 n 2^n 2n个可能的变量组合。当n较大时,采用完全枚举法解题几乎时不可能的。已有的求解0-1型整数规划的方法一般都属于隐枚举法。
【例六】 求解0-1整数规划
m a x Z = 3 x 1 − 2 x 2 + 5 x 3 max Z=3x_{1}-2x_{2}+5x_{3} maxZ=3x1−2x2+5x3
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 2 + x 3 ≤ 6 x 1 , x 2 , x 3 = 0 或 1 s.t. \begin{cases} \ x_{1}+2x_{2}-x_{3} ≤2 \\ x_{1}+4x_{2}+x_{3}≤4 \\ x_{1}+x_{2} ≤3\\ 4x_{2}+x_{3} ≤6 \\x_{1},x_{2},x_{3}=0或1 \end{cases} s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧ x1+2x2−x3≤2x1+4x2+x3≤4x1+x2≤34x2+x3≤6x1,x2,x3=0或1
求解过程可以列表表示:
( x 1 , x 2 , x 3 ) (x_{1},x_{2},x_{3}) (x1,x2,x3) | z z z值 | 约束条件 a b c d a b c d abcd | 过滤条件 |
---|---|---|---|
(0,0,0) | 0 | √ √ √ √ | z ≥ 0 z≥0 z≥0 |
(0,0,1) | 5 | √ √ √ √ | z ≥ 5 z≥5 z≥5 |
(0,1,0) | -2 | ||
(0,1,1) | 3 | ||
(1,0,0) | 3 | ||
(1,0,1) | 8 | √ √ √ √ | z ≥ 8 z≥8 z≥8 |
(1,1,0) | 1 | ||
(1,1,1) | 6 |
所以最优解 ( x 1 , x 2 , x 3 ) T = ( 1 , 0 , 1 ) T , m a x z = 8 (x_{1},x_{2},x_{3})^T=(1,0,1)^T,max z = 8 (x1,x2,x3)T=(1,0,1)T,maxz=8。
采用上述解法实际上只做了20次计算。
为了进一步减少计算量,常按目标函数中各系数的大小顺序重新排列各变量,以使最优解有可能较早发现。对于最大化问题,可按由小到大的顺序排列:对于最小化的问题,则相反。为此上例可写成下列形式:
m a x Z = 5 x 3 + 3 x 1 − 2 x 2 max Z=5x_{3}+3x_{1}-2x_{2} maxZ=5x3+3x1−2x2
s . t . { − x 3 − x 1 + 2 x 2 ≤ 2 x 3 + x 1 + 4 x 2 ≤ 4 x 1 + x 2 ≤ 3 x 3 + 4 x 2 ≤ 6 x 1 , x 2 , x 3 = 0 或 1 s.t. \begin{cases} \ -x_{3}-x_{1}+2x_{2} ≤2 \\ x_{3}+x_{1}+4x_{2}≤4 \\ x_{1}+x_{2} ≤3\\ x_{3}+4x_{2} ≤6 \\x_{1},x_{2},x_{3}=0或1 \end{cases} s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧ −x3−x1+2x2≤2x3+x1+4x2≤4x1+x2≤3x3+4x2≤6x1,x2,x3=0或1
求解时先令排在前面的变量取值为1,如本例中可取 ( x 3 , x 1 , x 2 ) = ( 1 , 0 , 0 ) (x_{3},x_{1},x_{2})=(1,0,0) (x3,x1,x2)=(1,0,0),若不满足约束条件,可退为取值(0,0,1)等,依次类推。据此改写后模型的求解过程可见下表:
( x 3 , x 1 , x 2 ) (x_{3},x_{1},x_{2}) (x3,x1,x2) | z z z值 | 约束条件 a b c d a b c d abcd | 过滤条件 |
---|---|---|---|
(0,0,0) | 0 | √ √ √ √ | z ≥ 0 z≥0 z≥0 |
(1,0,0) | 5 | √ √ √ √ | z ≥ 5 z≥5 z≥5 |
(1,1,0) | 8 | √ √ √ √ | z ≥ 8 z≥8 z≥8 |
从目标函数方程看到, z z z值已不可能再增大, ( x 3 , x 1 , x 2 ) = ( 1 , 1 , 0 ) (x_{3},x_{1},x_{2})=(1,1,0) (x3,x1,x2)=(1,1,0)即为本例的最优解。
采取这样的形式用上法解此例,可以很大程度上减少运算次数。一般问题的规模越大,这样做的好处就越明显。
在生活中经常遇到这样的问题,某单位需完成n项任务,恰好有n个人可承担这些任务。由于每人的专长不同,各人完成任务不同(或 所费时间),效率也不同。于是产生应指派哪个人去完成哪项任务 ,使完成n项任务的总效率最高(或所需总时间最小)。
设有 n 个资源(人或机器等) A 1 , A 2 , … , A n A_{1}, A_{2}, …, A_{n} A1,A2,…,An分配做 n 件事 B 1 , B 2 , … , B n B_{1}, B_{2}, …, B_{n} B1,B2,…,Bn要求每件事必须使用1个资源,且不同事件由不同资源完成已知 A i A_{i} Ai做 B j B_{j} Bj的效率(如劳动工时、成本、创造价值等)为 C i j C_{ij} Cij。问如何进行指派可使总工作效率最佳?
其中我们称 C i j C_{ij} Cij为效率矩阵,问题数学模型为:
m i n Z = ∑ i = 1 n ∑ j = 1 n c i j x i j , min Z=\sum_{i=1}^n\sum_{j=1}^n c_{ij}x_{ij}, minZ=i=1∑nj=1∑ncijxij,
s . t . { ∑ i = 1 n x i j = 1 ( j = 1 , 2 , . . . , n ) ∑ j = 1 n x i j = 1 ( i = 1 , 2 , . . . , n ) x i j = 0 或 1 ( i , j = 1 , 2 , . . . , n ) s.t. \begin{cases} \sum_{i=1}^n x_{ij}=1(j=1,2,...,n) \\\sum_{j=1}^n x_{ij}=1(i=1,2,...,n)\\x_{ij}=0或1(i,j=1,2,...,n) \end{cases} s.t.⎩⎪⎨⎪⎧∑i=1nxij=1(j=1,2,...,n)∑j=1nxij=1(i=1,2,...,n)xij=0或1(i,j=1,2,...,n)
从上述数学模型可知,标准的指派问题是一类特殊的整数规划问题,又是特殊的0-1规划问题和特殊的运输问题,因此,它可以用多种相应的解法来求解。但是,这些解法都没有充分利用指派问题的特殊性质,有效地减少其计算量。1955年,库恩 ( W . W . K u h n ) (W.W.Kuhn) (W.W.Kuhn)利用匈牙利数学家康尼格 ( D . K o n i g ) (D.Konig) (D.Konig)的关于矩阵中独立零元素的定理,提出了解指派问题的一种算法,习惯上称之为匈牙利解法。
匈牙利算法基于线性代数的基本初变换的内容,使系数矩阵中的0尽可能的多,根据变换后的矩阵中的独立0元素的分布,可以达到“一眼看去出结果”的效果。
大概思想就简单提一嘴,这个算法并不难理解,而且也是线性代数中一个比较著名的算法,相信大家也都了解。个人深觉,这个算法对0-1型整数规划问题的贴合度极高,看完有关匈牙利算法解决整数规划问题真的忍不住拍案叫绝!!!
那么这个算法对于大多数的整数规划的普适性并不强,那么在此不多赘述了,有兴趣可以自行了解。
【注】 其实指派问题还与运输问题有着包含关系哦,所以考虑用运输问题的表上作业法来求解指派问题使一样可行的!
好!那么到此为之,所有的数学理论已经大概全部渗透一遍了。下面我们走向建模实战,看看如何;利用计算机软件帮我们解决有关整数规划问题。
我主要使用到的软件有:MATLAB,LINGO
话不多说,直接上实战!
【实战1】 <一般线性整数规划>
为了生产的需要,某工厂的一条生产线需要每天24h不间断运转,但是每天不同时间段所需要的工人最低数量不同,具体数据如下表所示。已知每名工人的连续工作时间为 8 h 8h 8h。则该工厂应该为该生产线配备多少工人?
班次 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
时间段 | 0:00-4:00 | 4:00-8:00 | 8:00-12:00 | 12:00-16:00 | 16:00-20:00 | 20:00-24:00 |
所需人数 | 35 | 40 | 50 | 45 | 55 | 30 |
问题分析
从降低经营成本的角度来看,为该生产线配备的工人数量越少,工厂所付出的工人薪资之和也就越低。因此,该问题需要确定在每个时间段工作的工人的数量,使其既能满足生产线的生产需求,又能使得雇佣的工人总数最低。
模型假设
(1)每名工人每 24 h 24h 24h 只能工作 8 h 8h 8h;
(2)每名工人只能在某个班次的初始时刻报到。符号说明
设 x x x;表示在第 i i i个班次报到的工人数量, i = 1 , 2 , . . . , 6 i=1,2,...,6 i=1,2,...,6。
模型建立
该问题的目标函数为雇佣的工人总数最小。约束条件为安排在不同班次上班的工人数量不低于该班次需要的人数,且 x i ( i = 1 , 2 , . . . , 6 ) x_{i}(i=1,2,...,6) xi(i=1,2,...,6)为非负整数。
该问题的数学模型为:
min Z = x 1 + x 2 + x 3 + x 4 + x 5 + x 6 \min Z = x_{1}+x_{2}+x_{3}+x_{4}+x_{5}+x_{6} minZ=x1+x2+x3+x4+x5+x6
s . t . { x 1 + x 6 ≥ 35 x 1 + x 2 ≥ 40 x 2 + x 3 ≥ 50 x 3 + x 4 ≥ 45 x 4 + x 5 ≥ 55 x 5 + x 6 ≥ 30 x i ≥ 0 且 为 整 数 ( i = 1 , 2 , . . . , ) s.t. \begin{cases} \ x_{1}+x_{6}≥35 \\x_{1}+x_{2}≥40\\ x_{2}+x_{3}≥50 \\ x_{3}+x_{4}≥45\\ x_{4}+x_{5}≥55 \\ x_{5}+x_{6}≥30\\ x_{i}≥0 且为整数 (i=1,2,...,)\end{cases} s.t.⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧ x1+x6≥35x1+x2≥40x2+x3≥50x3+x4≥45x4+x5≥55x5+x6≥30xi≥0且为整数(i=1,2,...,)
利用MATLAB软件求得最优解为
x 1 = 35 , x 2 = 5 , x 3 = 45 , x 4 = 0 , x 5 = 55 , x 6 = 0 , x_{1}=35,x_{2}=5,x_{3}=45,x_{4}=0,x_{5}=55,x_{6}=0, x1=35,x2=5,x3=45,x4=0,x5=55,x6=0,
目标函数最优值为140,即最少需要140人,才能保证生产线正常运转。
代码如下:
clc,clear,prob = optimproblem;
x = optimvar('x',6,'Type','integer',"LowerBound",0);
prob.Objective = sum(x);
con = optimconstr(6);
a = [35,40,50,45,55,30];
con(1) = x(1)+x(6)>=35;
for i=1:5
con(i+1) = x(i)+x(i+1)>=a(i+1);
end
prob.Constraints.con = con;
[sol,fval,falg] = solve(prob),sol.x
下图为运行效果:
【实战2】 <固定费用问题(Fixed Cost Problem)>
某工厂为了生产某种产品,有几种不同的生产方式可供选择,如选定的生产方式投资高(选购自动化程度高的设备),由于产量大,因而分配到每件产品的变动成本就降低;反之,如选定的生产方式投资低,将来分配到每件产品的变动成本可能增加。所以必须全面考虑。
今设有三种方式可供选择,令
j = 1 , 2 , 3 j=1,2,3 j=1,2,3分别表示三种生产方式;
x j x_{j} xj表示采用第 种方式时的产量;
c j c_{j} cj表示采用第 种方式时每件产品的变动成本;
k j k_{j} kj 表示采用第 种方式时的固定成本。
为了说明成本的特点,暂不考虑其它约束条件。采用各种生产方式的总成本分别为
P j = { k j + c j x j , 当 x j > 0 , 0 , 当 x j = 0 , j = 1 , 2 , 3. P_{j}= \begin{cases} \ k_{j}+c_{j}x_{j},当x_{j}>0,\\0,当x_{j}=0 ,\end{cases} j=1,2,3. Pj={ kj+cjxj,当xj>0,0,当xj=0,j=1,2,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_{1}y_{1}+c_{1}x_{1})+(k_{2}y_{2}+c_{2}x_{2})+(k_{3}y_{3}+c_{3}x_{3}) minZ=(k1y1+c1x1)+(k2y2+c2x2)+(k3y3+c3x3)
{ y j ϵ ≤ x j M , j = 1 , 2 , 3. y j = 0 或 1 , j = 1 , 2 , 3. \begin{cases} \ y_{j}\epsilon≤x_{j}M, j=1,2,3.\\ y_{j}=0或1, j=1,2,3. \end{cases} { yjϵ≤xjM,j=1,2,3.yj=0或1,j=1,2,3.
ϵ \epsilon ϵ是一个充分小的数;M是一个充分大的正常数。
【实战3】 <蒙特卡洛法><非线性整数规划>
蒙特卡洛方法也称为计算机随机模拟方法,它源于世界著名的赌城—摩纳哥的Monte Carlo(蒙特卡洛)。它是基于对大量事件的统计结果来实现一些确定性问题的计算。使用蒙特卡洛方法必须使用计算机生成相关分布的随机数,MATLAB给出了生成各种随机数的命令。
y = x 2 , y = 12 − x y=x^2,y=12-x y=x2,y=12−x与 x x x轴在第一象限围成一个曲边三角形。设计一个随机实验,求该图形面积的近似值。
所围的曲边三角形如下图所示。设计的随机试验的思想如下,在矩形区域 上产生服从均匀分布的 个随机点,统计随机点落在曲边三角形内的频数,则曲边三角形的面积近似为上述矩形的面积乘以频率。
代码如下:
clc, clear, n=10^7;
x=unifrnd(0,12,[1,n]); y=unifrnd(0,9,[1,n]);
pinshu=sum(y<x.^2 & x<=3)+sum(y<12-x & x>=3);
area_appr=12*9*pinshu/n
【实战4】 <0-1型整数规划>
某连锁超市经营企业为了扩大规模,新租用五个门店,经过装修后再营业。现有四家装饰公司分别对这五个门店的装修费用进行报价,具体数据如表2.2所示。为保证装修质量,规定每个装修公司最多承担两个门店的装修任务。则为节省装修费用,该企业该如何分配装修任务?
问题分析
这是一个非标准(人数和工作不相等)的“指派问题”。解决此类问题就是在满足指派要求的条件下,确定最优的指派方案,使得按该方案实施后的“效益”最佳。可以引入0-1变量来表示某一个装修公司是否承担某一个门店的装修任务。
模型假设
每个门店的装修工作只能由一个装修公司单独完成。
符号说明
设 分别表示A、B、C、D四家装修公司, 表示第 家装修公司对第 个门店的装修费用报价。
引入0-1变量
x = { 1 , 第 i 家 装 修 公 司 承 担 第 j 个 门 店 的 装 修 , 0 , 第 i 家 装 修 公 司 不 承 担 第 j 个 门 店 的 装 修 . x= \begin{cases}\ 1,第i家装修公司承担第j个门店的装修,\\ 0,第i家装修公司不承担第j个门店的装修. \end{cases} x={ 1,第i家装修公司承担第j个门店的装修,0,第i家装修公司不承担第j个门店的装修.
该问题的目标函数为总的装修费用最小,即
min Z = ∑ i = 1 4 ∑ j = 1 5 c i j x i j \min Z = \sum_{i=1}^4\sum_{j=1}^5 c_{ij}x_{ij} minZ=i=1∑4j=1∑5cijxij
代码如下:
clc, clear, c = load('data2_6.txt');
prob = optimproblem;
x = optimvar('x',4,5,'Type','integer','LowerBound',0,'UpperBound',1);
prob.Objective = sum(sum(c.*x));
prob.Constraints.con1 = sum(x,1)==1;
prob.Constraints.con2 = sum(x,2)<=2;
[sol, fval, flag] = solve(prob), sol.x
【实战5】 <比赛项目排序问题>
(本题选自2005年电工杯数学建模竞赛B题)
在各种运动比赛中,为了使比赛公平、公正、合理地举行,一个基本要求是:在比赛项目排序过程中,尽可能使每个运动员不连续参加两项比赛,以便运动员恢复体力,发挥正常水平。
下表(2.1)所示是某个小型运动会的比赛报名表。有14个比赛项目,40名运动员参加比赛。表中第1行表示14个比赛项目,第1列表示40名运动员,表中“#”号位置表示运动员参加此项比赛。建立此问题的数学模型,并且合理安排比赛项目顺序,使连续参加两项比赛的运动员人次尽可能地少。
代码如下:
clc, clear, a = importdata('data2_10.xlsx');
a(isnan(a))=0; %把不确定值NaN替换为0
M=10^7; w=ones(14)*M;
for i=1:14
for j=1:14
if i~=j, w(i,j)=sum(a(:,i).*a(:,j)); end
end
end
n=15; w(n,n)=M; prob=optimproblem;
x=optimvar('x',n,n,'Type','integer','LowerBound',0,'UpperBound',1);
u=optimvar('u',n,'LowerBound',0) %序号变量
prob.Objective=sum(sum(w.*x));
prob.Constraints.con1=[sum(x,2)==1; sum(x,1)'==1; u(1)==0];
con2 = [1<=u(2:end); u(2:end)<=14];
for i=1:n
for j=2:n
con2 =[con2; u(i)-u(j)+n*x(i,j)<=n-1];
end
end
prob.Constraints.con2 = con2;
[sol, fval, flag]=solve(prob)
xx=sol.x; [i,j]=find(xx);
fprintf('xij=1对应的行列位置如下:\n')
ij=[i'; j']
《运筹学教程》——胡运权,郭耀煌
《数学建模算法与应用》——司守奎,孙玺菁