整数规划
概论
整数规划的定义
当数学规划问题中的变量限制为整数的时候,就称为整数规划。若在线性规划模型中,变量限制为整数,则称为整数线性规划。目前流行的求解整数规划的方法往往只适用于整数线性规划,
整数规划的分类
整数线性规划模型一般可以分为两类:
- 变量全部限制为整数时,称为完全整数规划
- 变量部分限制为整数时,称为混合整数规划
整数规划的求解方法
- 分支定界法——可以求完全和混合整数线性规划
- 割平面法——可以求完全和混合整数线性规划
- 隐枚举法——可以求“0-1”整数规划
- 过滤隐枚举法
- 分枝隐枚举法
- 匈牙利法——解决指派问题(“0-1”规划的特殊形式)
- 蒙特卡洛法——求解各种类型的规划问题
0-1整数规划
相互排斥的约束条件
当问题中有
m
m
m个相互排斥的约束条件的时候
{
a
11
x
1
+
⋯
+
a
1
n
x
n
≤
b
1
⋮
a
m
1
x
1
+
⋯
+
a
m
n
x
n
≤
b
n
\begin{cases} a_{11}x_1+\cdots+a_{1n}x_n \leq b_1 \\ \quad \quad \quad \quad \quad \vdots \\ a_{m1}x_1+\cdots+a_{mn}x_n \leq b_n \end{cases}
⎩⎪⎪⎨⎪⎪⎧a11x1+⋯+a1nxn≤b1⋮am1x1+⋯+amnxn≤bn
为了保证这些限制条件相互排斥,引入
m
m
m个0-1变量
y
i
(
i
=
1
,
⋯
,
m
)
y_i(i=1,\cdots,m)
yi(i=1,⋯,m)和一个充分大的数
M
M
M
y
i
=
{
1
,
第
i
个
约
束
条
件
起
作
用
0
,
第
i
个
约
束
条
件
不
起
作
用
y_i= \begin{cases} 1,第i个约束条件起作用\\ 0,第i个约束条件不起作用\\ \end{cases}
yi={1,第i个约束条件起作用0,第i个约束条件不起作用
此时之前的
m
m
m个相互排斥的限制条件就转化为
{
a
11
x
1
+
⋯
+
a
1
n
x
n
≤
b
1
+
(
1
−
y
1
)
M
⋮
a
m
1
x
1
+
⋯
+
a
m
n
x
n
≤
b
m
+
(
1
−
y
m
)
M
∑
i
=
1
m
y
i
=
1
\begin{cases} a_{11}x_1+\cdots+a_{1n}x_n \leq b_1+(1-y_1)M \\ \quad \quad \quad \quad \quad \quad \quad \vdots \\ a_{m1}x_1+\cdots+a_{mn}x_n \leq b_m+(1-y_m)M \\ \sum\limits_{i=1}^{m}y_i=1 \end{cases}
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧a11x1+⋯+a1nxn≤b1+(1−y1)M⋮am1x1+⋯+amnxn≤bm+(1−ym)Mi=1∑myi=1
这个限制条件表明,这
m
m
m个0-1变量
y
i
y_i
yi只能由一个是1,也就是上面的
m
m
m个不等限制条件,只有1个真正有意义,其余的都是小于一个充分大的数,可以认为其永远成立
固定费用的问题
在讨论线性规划的时候,有些问题是要求使成本最小。那么,就可以固定成本为一个常数,并在线性规划的模型中不必明显列出。但是有些固定费用的问题不能用一般的线性规划来描述,而可以改变为混合整数规划来解决
某个工厂为了生产某种产品,有几种不同的生产方式可以选择,如选定的生产方式投资高,由于产量大,因而分配到每件产品的变动成本反而降低;反之,如果选定的生产方式投资低,将来分配到每件产品的变动成本可能增加。所以必须全面考虑,设有三种可供选择,令
j = 1 , 2 , 3 j=1,2,3 j=1,2,3 分别表示三种生产方式
x j x_j xj 表示采用第 j j j 种生产方式时的产量
c j c_j cj 表示采用第 j j j 种生产方式时每件产品的变动成本
k j k_j kj 表示采用第 j j j 种生产方式时的固定成本
为了说明成本的特点,暂不考虑其他约束因素。采用各种生产方式的总成本分别为
P i = { k j + c j x j , 当 x j > 0 0 , 当 x j = 0 P_i= \begin{cases} k_j+c_jx_j,&当x_j>0 \\ 0,&当x_j=0 \end{cases} Pi={kj+cjxj,0,当xj>0当xj=0
为了表示某种生产方式是否投资,引入0-1变量
y
j
y_j
yj ,令
y
j
=
{
1
,
当
采
用
第
j
种
生
产
方
式
,
即
x
j
>
0
0
,
当
不
采
用
第
j
种
生
产
方
式
,
即
x
j
=
0
y_j= \begin{cases} 1,&当采用第j种生产方式,&即x_j>0\\ 0,&当不采用第j种生产方式,&即x_j=0\\ \end{cases}
yj={1,0,当采用第j种生产方式,当不采用第j种生产方式,即xj>0即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
)
s
.
t
.
{
y
1
ε
≤
x
1
≤
y
1
M
y
2
ε
≤
x
2
≤
y
2
M
y
3
ε
≤
x
3
≤
y
3
M
其
中
ε
是
一
个
充
分
小
的
正
常
数
,
M
是
一
个
充
分
大
的
正
常
数
\min z=(k_1y_1+c_1x_1)+(k_2y_2+c_2x_2)+(k_3y_3+c_3x_3) \\ s.t. \begin{cases} y_1\varepsilon\leq x_1 \leq y_1M \\ y_2\varepsilon\leq x_2 \leq y_2M \\ y_3\varepsilon\leq x_3 \leq y_3M \\ \end{cases} {\quad 其中\varepsilon是一个充分小的正常数, M是一个充分大的正常数}
minz=(k1y1+c1x1)+(k2y2+c2x2)+(k3y3+c3x3)s.t.⎩⎪⎨⎪⎧y1ε≤x1≤y1My2ε≤x2≤y2My3ε≤x3≤y3M其中ε是一个充分小的正常数,M是一个充分大的正常数
在限制条件中,当
x
j
>
0
x_j>0
xj>0 时,
y
j
=
1
y_j=1
yj=1 ,当
x
j
=
0
x_j=0
xj=0 时,
y
j
=
0
y_j=0
yj=0。
指派问题的数学模型
拟分配 n n n 人去做 n n n 项工作,每人做且仅做一项工作,若分配第 i i i 人去做第 j j j 项工作,需要花费 c i j c_{ij} cij 单位时间,问应该如何分配工作,才能使工人花费的总时间最少。
容易看出,要给出一个指派问题的实例,只需要给出矩阵
C
=
(
c
i
j
)
C=(c_{ij})
C=(cij),称为指派问题的系数矩阵
。
引入0-1变量
x
i
j
=
{
1
,
第
i
人
做
第
j
项
工
作
0
,
第
i
人
不
做
第
j
项
工
作
x_{ij}= \begin{cases} 1,&第i人做第j项工作 \\ 0,&第i人不做第j项工作 \\ \end{cases}
xij={1,0,第i人做第j项工作第i人不做第j项工作
上述指派问题的数学模型为
min
∑
i
=
1
n
∑
j
=
1
n
c
i
j
x
i
j
s
.
t
.
{
∑
j
=
1
n
x
i
j
=
1
,
i
=
1
,
2
,
⋯
,
n
∑
i
=
1
n
x
i
j
=
1
,
j
=
1
,
2
,
⋯
,
n
x
i
j
=
0
o
r
1
,
i
,
j
=
1
,
2
,
⋯
,
n
\min \quad \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}c_{ij}x_{ij} \\ s.t. \begin{cases} \sum \limits _{j=1}^{n}x_{ij}=1, &i=1,2,\cdots,n\\ \sum \limits _{i=1}^{n}x_{ij}=1, &j=1,2,\cdots,n\\ x_{ij}=0or1,&i,j=1,2,\cdots,n \end{cases}
mini=1∑nj=1∑ncijxijs.t.⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧j=1∑nxij=1,i=1∑nxij=1,xij=0or1,i=1,2,⋯,nj=1,2,⋯,ni,j=1,2,⋯,n
蒙特卡洛法(Monte Carlo)
蒙特卡洛方法也成为计算机随机模拟方法,他是机遇对大量事件的统计结果来实现一些确定性问题的计算。使用蒙特卡洛方法必须使用计算机生成相关分布的随机数。
例: y = x 2 , y = 12 − x y=x^2,y=12-x y=x2,y=12−x 与 x x x 轴在第一象限内围成一个曲边三角形,设计一个随机试验,求该三角形面积的近似值
设计随机试验的思想如下,在矩形区域 [ 0 , 12 ] × [ 0 , 9 ] [0,12]\times [0,9] [0,12]×[0,9] 上产生服从均匀分布的 1 0 7 10^7 107 个测试点,统计随机点落在曲边三角形内的频数,则曲边三角形的面积近似为上述矩形的面积乘以频率
x=unifrnd(0,12,[1,10000000])
y=unifrnd(0,9,[1,10000000])
p=(sum(y<x.^2&x<=3)+sum(y<12-x&x>=3))*(10^-7)
S=12*9*p
尽管整数规划由于限制变量为整数增加了难度,但是由于整数解是有限个,于是为枚举法提供了方便。当然,在自变量维数很大和取值范围和宽泛的时候,显枚举法计算出最优解是不太现实的,但是应用概率理论可以证明,在一定的计算量的情况下,用蒙特卡洛法完全可以得到一个满意解
求解非线性整数规划
max z = x 1 2 + x 2 2 + 3 x 3 2 + 4 x 4 2 + 2 x 5 2 − 8 x 1 − 2 x 2 − 3 x 3 − x 4 − 2 x 5 s . t . { 0 ≤ x i ≤ 99 , i = 1 , ⋯ , 5 x 1 + x 2 + x 3 + x 4 + x 5 ≤ 400 x 1 + 2 x 2 + 2 x 3 + x 4 + 6 x 5 ≤ 800 2 x 1 + x 2 + 6 x 3 ≤ 200 x 3 + x 4 + 5 x 5 ≤ 200 \max z=x_1^2+x_2^2+3x_3^2+4x_4^2+2x_5^2-8x_1-2x_2-3x_3-x_4-2x_5 \\ s.t. \begin{cases} 0 \leq x_i \leq 99,i=1,\cdots ,5\\ x_1+x_2+x_3+x_4+x_5\leq400\\ x_1+2x_2+2x_3+x_4+6x_5\leq800\\ 2x_1+x_2+6x_3\leq200\\ x_3+x_4+5x_5\leq200 \end{cases} maxz=x12+x22+3x32+4x42+2x52−8x1−2x2−3x3−x4−2x5s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧0≤xi≤99,i=1,⋯,5x1+x2+x3+x4+x5≤400x1+2x2+2x3+x4+6x5≤8002x1+x2+6x3≤200x3+x4+5x5≤200
如果用显枚举法进行试探,显然其计算量是非常大的,操作起来不太现实。然而应用蒙特卡洛法去随机计算 1 0 6 10^6 106 个点,便可以找到满意的解。
先编写.m文件来定义目标函数 f f f 和约束向量函数 g g g 。
function[f,g]=mengte(x);
f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)^2-8*x(1)-2*x(2)-3*x(3)-x(4)-2*x(5);
g=[sum(x)-400
x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-600
2*x(1)+x(2)+6*x(3)-200
x(3)+x(4)+5*x(5)-200];
在编写Matlab程序求解问题
rand('state',sum(clock)) %初始化随机数生成器
z=0
tic %计时开始
for i=1:10^6
x=randi([0,99],1,5) %生成一个每个元素都在0~99之间的1行5列的矩阵
[f,g]=mengte(x)
if all(g<=0)
if f>z
x0=x,z=f
end
end
end
x0
z
toc %计时结束
整数线性规划的计算机求解
整数规划问题的求解可以使用Matlab中的intlinprog
函数进行求解,但是使用Matlab进行求解的时候要注意:需要把所有的决策变量化为一维决策向量,实际上对于多维变量的数学规划问题需要做一个变量替换,把多维决策变量化为一维决策向量。而当使用Lingo求解数学规划问题的时候不需要进行变换,使用起来相对比较容易
Matlab求解混合整数线性规划的命令为
[
x
,
f
v
a
l
]
=
i
n
t
l
i
n
p
r
o
g
(
f
,
i
n
t
c
o
n
,
A
,
b
,
A
e
q
,
b
e
q
,
l
b
,
u
b
)
[x,fval]=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)
[x,fval]=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)
其中,
f
,
x
,
i
n
t
c
o
n
,
b
,
b
e
q
,
l
b
,
u
b
f,x,intcon,b,b_{eq},lb,ub
f,x,intcon,b,beq,lb,ub 均为列向量,
A
,
A
e
q
A,A_{eq}
A,Aeq 均为矩阵
f f f :表示价值向量
i n t c o n intcon intcon :表示整数参数的位置
A A A :表示不等关系约束矩阵
b b b :表示不等关系约束资源向量
A e q A_{eq} Aeq :表示等式关系约束矩阵
b e q b_{eq} beq :表示等式关系资源向量
l b , u b lb,ub lb,ub :表示变量约束的上下限
其对应的标准模型为
min
x
f
T
x
s
.
t
.
{
x
(
i
n
t
c
o
n
)
为
整
数
A
⋅
x
≤
b
A
e
q
⋅
x
=
b
e
q
l
b
≤
x
≤
b
u
\min \limits _x f^Tx \\ s.t. \begin{cases} x(intcon)为整数 \\ A\cdot x \leq b \\ A_{eq}\cdot x = beq \\ lb \leq x \leq bu \end{cases}
xminfTxs.t.⎩⎪⎪⎪⎨⎪⎪⎪⎧x(intcon)为整数A⋅x≤bAeq⋅x=beqlb≤x≤bu
例:求解下列指派问题,已知指派系数矩阵
[ 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 ] \left[ \begin{matrix} 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{matrix} \right] ⎣⎢⎢⎢⎢⎡3868987441022226109739375510⎦⎥⎥⎥⎥⎤
解:A=[3 8 2 10 3 8 7 2 9 7 6 4 2 7 5 8 4 2 3 4 9 10 6 9 10] A=A(:) a=zeros(10,25) intcon=1: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) lb=zeros(25,1) ub=ones(25,1) [x,fval]=intlinprog(A,intcon,[],[],a,b,lb,ub) x=reshape(x,[5,5]) fval
结果如下
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 ] f v a l = 21 x= \left[\begin{matrix} 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{matrix}\right]\\ fval=21 x=⎣⎢⎢⎢⎢⎡0000100100010000001010000⎦⎥⎥⎥⎥⎤fval=21
下面看一个混合整数规划问题
例:求解下列混合整数规划问题
min z = − 3 x 1 − 2 x 2 − x 3 s . t . { x 1 + x 2 + x 3 ≤ 7 4 x 1 + 2 x 2 + x 3 = 12 x 1 , x 2 ≥ 0 x 3 = 0 o r 1 \min z=-3x_1-2x_2-x_3\\ s.t. \begin{cases} x_1+x_2+x_3\leq7\\ 4x_1+2x_2+x_3=12\\ x_1,x_2\geq0\\ x_3=0or1 \end{cases} minz=−3x1−2x2−x3s.t.⎩⎪⎪⎪⎨⎪⎪⎪⎧x1+x2+x3≤74x1+2x2+x3=12x1,x2≥0x3=0or1
解f=[-3;-2;-1] intcon=3 A=[1,1,1] b=7 Aeq=[4,2,1] beq=12 lb=[0;0;0] ub=[inf;inf;1] [x,fval]=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)
结果如下
x = [ 0 5.5 1 ] z = − 12 x= \left[ \begin{matrix} 0\\5.5\\1 \end{matrix} \right]\\ z=-12 x=⎣⎡05.51⎦⎤z=−12