0 −1型整数规划是整数规划中的特殊情形,它的变量xj" role="presentation">xj仅取值 0 或 1。这时xj" role="presentation">xj 称 为
0 −1变量,或称二进制变量。xj" role="presentation">xj 仅取值 0 或 1 这个条件可由下述约束条件:
0≤xj≤1" role="presentation">0≤xj≤1
整数所代替,是和一般整数规划的约束条件形式一致的。在实际问题中,如果引入 0 −1变 量,就可以把有各种情况需要分别讨论的线性规划问题统一在一个问题中讨论了。我们 先介绍引入0 −1变量的实际问题。
1.数学建模过程
投资场所的选定—相互排斥的计划
例 4 某公司拟在市东、西、南三区建立门市部。拟议中有 7 个位置(点)Ai(i=1,2,...,7)" role="presentation">Ai(i=1,2,...,7)可供选择。规定:
在东区。由 A1,A2,A3" role="presentation">A1,A2,A3 三个点中至多选两个;
在西区。由 A4,A5" role="presentation">A4,A5 两个点中至少选一个;
在南区,由 A6,A7" role="presentation">A6,A7 两个点中至少选一个。
如选用 Ai" role="presentation">Ai点,设备投资估计为bi" role="presentation">bi 元,每年可获利润估计为 ci" role="presentation">ci元,但投资总额不能 超过 B" role="presentation">B 元。问
应选择哪几个点可使年利润为最大?
解题时先引入0 −1变量xi(i=1,2,...,7)" role="presentation">xi(i=1,2,...,7) 令
于是问题可列写成:
Maxz=∑i=17cixi{∑i=17bixi≤Bx1+x2+x3≤2x4+x5≥1x6+x7≥1,xi=0 or 1" role="presentation">Maxz=∑i=17cixi⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪∑7i=1bixi≤Bx1+x2+x3≤2x4+x5≥1x6+x7≥1,xi=0 or 1
2.相互排斥的约束条件
有两个相互排斥的约束条件
5x1+4x2≤24 or 7x1+3x2≤45" role="presentation" style="position: relative;">5x1+4x2≤24 or 7x1+3x2≤45
引入0 −1变量 y ,则上述约束条件可改写为:
{5x1+4x2≤24+yM7x1+3x2≤45+(1−y)My=0 or 1" role="presentation" style="position: relative;">⎧⎩⎨⎪⎪5x1+4x2≤24+yM7x1+3x2≤45+(1−y)My=0 or 1
其中 M 是充分大的数。 约束条件
x1=0 or 500≤x1≤800" role="presentation" style="position: relative;">x1=0 or 500≤x1≤800
可改写为
{500y≤x1≤800yy=0 or 1" role="presentation" style="position: relative;">{500y≤x1≤800yy=0 or 1
如果有 m 个互相排斥的约束条件:
ai1x1+⋯+ainxn≤bii=1,2,⋯,m" role="presentation" style="position: relative;">ai1x1+⋯+ainxn≤bii=1,2,⋯,m
为了保证这 m" role="presentation" style="position: relative;">m 个约束条件只有一个起作用,我们引入 m" role="presentation" style="position: relative;">m 个0 −1变量yi(i=1,2,...,m)" role="presentation" style="position: relative;">yi(i=1,2,...,m) 和一个充分大的常数 M" role="presentation" style="position: relative;">M ,而下面这一组m+1" role="presentation" style="position: relative;">m+1个约束条件
ai1x1+⋯+ainxn≤bi+yiMi=1,2,⋯,my1+⋯+ym=m−1" role="presentation" style="position: relative;">ai1x1+⋯+ainxn≤bi+yiMi=1,2,⋯,my1+⋯+ym=m−1
就合于上述的要求。这是因为,由于(2),m 个 yi" role="presentation" style="position: relative;">yi 中只有一个能取 0 值,设 yi∗=0" role="presentation" style="position: relative;">y∗i=0 , 代入(1),就只有i=i∗" role="presentation" style="position: relative;">i=i∗的约束条件起作用,而别的式子都是多余的。
3.关于固定费用的问题(Fixed Cost Problem)
固定费用(固定成本)的问题不能用一般线 性规划来描述,但可改变为混合整数规划来解决,见下例。
例 5 某工厂为了生产某种产品,有几种不同的生产方式可供选择,如选定的生产 方式投资高(选购自动化程度高的设备),由于产量大,因而分配到每件产品的变动成 本就降低;反之,如选定的生产方式投资低,将来分配到每件产品的变动成本可能增加。 所以必须全面考虑。今设有三种方式可供选择,令:
- xj" role="presentation" style="position: relative;">xj 表示采用第 j 种方式时的产量;
- cj" role="presentation" style="position: relative;">cj 表示采用第 j 种方式时每件产品的变动成本;
- kj" role="presentation" style="position: relative;">kj 表示采用第 j 种方式时的固定成本。
为了说明成本的特点,暂不考虑其它约束条件。采用各种生产方式的总成本分别为:
Pj={kj+cjxj, xj>00, xj=0j=1,2,3." role="presentation" style="position: relative;">Pj={kj+cjxj,0, xj>0 xj=0j=1,2,3.
在构成目标函数时,为了统一在一个问题中讨论,现引入0 −1变量yj" role="presentation" style="position: relative;">yj ,令
于是目标函数
minz=(k1y1+c1x1)+(k2y2+c2x2)+(k3y3+c3x3)" role="presentation" style="position: relative;">minz=(k1y1+c1x1)+(k2y2+c2x2)+(k3y3+c3x3)
(3)式这个规定可表为下述 3 个线性约束条件:
yjε≤xj≤yjM,j=1,2,3" role="presentation" style="position: relative;">yjε≤xj≤yjM,j=1,2,3
其中ε" role="presentation" style="position: relative;">ε是一个充分小的正常数,M" role="presentation" style="position: relative;">M 是个充分大的正常数。当 xj" role="presentation" style="position: relative;">xj> 0时 yj" role="presentation" style="position: relative;">yj必须为 1;当 xj" role="presentation" style="position: relative;">xj = 0时只有 yj" role="presentation" style="position: relative;">yj为 0 时才有意义。
举个栗子:
Maxz=3x1−2x2+5x3{x1+2x2−x3≤2x1+4x2+x3≤4x1+x2≤34x2+x3≤6x1,x2,x3=0 or 1" role="presentation" style="position: relative;">Maxz=3x1−2x2+5x3⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪x1+2x2−x3≤2x1+4x2+x3≤4x1+x2≤34x2+x3≤6x1,x2,x3=0 or 1
4.编程实现
使用Python实现
InvestLP = pulp.LpProblem("0 −1型整数规划问题", sense=pulp.LpMaximize)
x1= pulp.LpVariable('x1', cat='Binary')
x2= pulp.LpVariable('x2', cat='Binary')
x3= pulp.LpVariable('x3', cat='Binary')
InvestLP += (3*x1 - 2*x2 + 5*x3 )
InvestLP += (x1 + 2*x2 - x3 <= 2)
InvestLP += (x1 + 4*x2 + x3 <= 4)
InvestLP += (x1 +x2 <= 3)
InvestLP += (4*x2 +x3 <= 6)
print("求解状态:", pulp.LpStatus[InvestLP.status])
for v in InvestLP.variables():
print(v.name, "=", v.varValue)
print("目标函数值 =", pulp.value(InvestLP.objective))
输出结果: