原理介绍
0
−
1
0-1
0−1 规划是一种特殊的整形规划,其中变量
x
i
x_i
xi 要么取值为
0
0
0,要么取值为
1
1
1,这里的
x
i
x_i
xi 也称为
0
−
1
0-1
0−1 规划变量。
0
−
1
0-1
0−1 规划问题可以归纳为如下形式:
m
i
n
∑
j
=
1
n
c
j
x
j
s
.
t
.
∑
j
=
1
n
a
i
j
x
i
j
≤
b
i
,
i
=
1
,
2
,
.
.
.
,
m
∑
j
=
1
n
a
i
j
1
x
j
≤
b
i
1
,
i
=
1
,
2
,
.
.
.
,
m
x
j
=
0
或
x
j
=
1
,
j
=
1
,
2
,
.
.
.
,
n
min \sum_{j=1}^{n} c_j x_j \\ \\ s.t. \sum_{j=1}^{n} a_{ij} x_{ij} \leq b_i,\quad i=1,2,...,m \\ \sum_{j=1}^{n} a_{ij}^{1} x_j \leq b_{i}^{1},\quad i=1,2,...,m \\ x_j=0或x_j=1,\quad j=1,2,...,n
minj=1∑ncjxjs.t.j=1∑naijxij≤bi,i=1,2,...,mj=1∑naij1xj≤bi1,i=1,2,...,mxj=0或xj=1,j=1,2,...,n
MATLAB提供了函数intlinprog
求解
0
−
1
0-1
0−1 规划问题,其调用格式如下所示:
x = intlinprog(f,intcon,A,b)
x = intlinprog(f,intcon,A,b,Aeq,beq)
x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)
x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub,x0)
x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub,x0,options)
x = intlinprog(problem)
[x,fval,exitflag,output] = intlinprog(...)
intlinprog
是混合整数线性规划(MILP
)求解器。其中,
f
,
x
,
i
n
t
c
o
n
,
b
,
b
e
q
,
l
b
,
u
b
f,x,intcon,b,beq,lb,ub
f,x,intcon,b,beq,lb,ub 是向量,
A
,
A
e
q
A,Aeq
A,Aeq 是矩阵。下面分别对上述七种调用格式进行说明。
第一种调用格式表示求解整数规划的 min x f T x \min_{x} f^{T}x minxfTx 问题,使得 A ∗ x ≤ b A*x \leq b A∗x≤b 成立;
第二种调用格式表示求解整数规划的问题 min x f T x \min_{x} f^{T}x minxfTx,使得 A ∗ x ≤ b , A e q ∗ x ≤ b e q A*x \leq b, Aeq*x\leq beq A∗x≤b,Aeq∗x≤beq 成立;
第三种调用格式表示在 l b ≤ x ≤ u b lb \leq x \leq ub lb≤x≤ub 范围内求解整数规划的问题 min x f T x \min_{x} f^{T}x minxfTx,使得 A ∗ x ≤ b , A e q ∗ x ≤ b e q A*x \leq b, Aeq*x\leq beq A∗x≤b,Aeq∗x≤beq 成立;
第四种调用格式表示在 l b ≤ x ≤ u b lb \leq x \leq ub lb≤x≤ub 范围内并且给定 x 0 x_0 x0 为初始值的条件下,求解整数规划的问题 min x f T x \min_{x} f^{T}x minxfTx,使得 A ∗ x ≤ b , A e q ∗ x ≤ b e q A*x \leq b, Aeq*x\leq beq A∗x≤b,Aeq∗x≤beq 成立,如果此时以 x 0 x_0 x0 为初始值找不到解,则以默认的初始值求解;
第五种调用格式表示利用 o p t i m s e t optimset optimset 函数制定的优化参数 o p t i o n s options options 以 x 0 x_0 x0 为初始值求解整数规划问题 min x f T x \min_{x} f^{T}x minxfTx,使得 A ∗ x ≤ b , A e q ∗ x ≤ b e q A*x \leq b, Aeq*x\leq beq A∗x≤b,Aeq∗x≤beq 成立;
第六种调用格式表示求解由问题 p r o b l e m problem problem 指定的整数规划问题;
第七种调用格式表示在求解整数规划问题时返回最小值点 x x x、目标函数 f T x f^Tx fTx 在最小值点 x x x 处的函数值 f v a l fval fval、函数退出信息 e x i t f l a g exitflag exitflag,以及一个包含优化信息的结构体 o u t p u t output output。
示例
某生产车间有四位工人,现要安排他们完成四项工作,每人各项工作所消耗的时间参见下表所示:
- | A | B | C | D |
---|---|---|---|---|
甲 | 15 | 18 | 21 | 24 |
乙 | 19 | 23 | 22 | 18 |
丙 | 26 | 17 | 16 | 19 |
丁 | 19 | 21 | 23 | 17 |
请问安排哪位工人完成哪项工作,可使总的消耗工时最少?
解析
根据题意,要将上述问题转换为线性规划问题。首先引进变量
x
i
j
,
i
=
1
,
2
,
3
,
4
,
j
=
1
,
2
,
3
,
4
x_{ij},i=1,2,3,4,j=1,2,3,4
xij,i=1,2,3,4,j=1,2,3,4,其值要么为
0
0
0,要么为
1
1
1。令
x
i
j
=
1
x_{ij}=1
xij=1,当指派第
i
i
i 个工人去完成第
j
j
j 项工作;否则
x
i
j
=
0
,
i
,
j
=
1
,
2
,
3
,
4
x_{ij}=0,i,j=1,2,3,4
xij=0,i,j=1,2,3,4。同时,用
c
i
j
c_{ij}
cij 表示第
i
i
i 个工人做第
j
j
j 项工作所需的时间。则上述的
0
−
1
0-1
0−1 规划问题可以表示为
m
i
n
∑
i
=
1
4
∑
j
=
1
4
c
i
j
x
i
j
s
.
t
.
∑
j
=
1
4
x
i
j
=
1
,
i
=
1
,
.
.
.
,
4
∑
i
=
1
4
x
i
j
=
1
,
j
=
1
,
.
.
.
,
4
x
i
j
=
{
1
,
指
派
第
i
个
工
人
去
完
成
第
j
项
工
作
0
,
e
l
s
e
(
i
,
j
=
1
,
.
.
.
,
4
)
min \sum_{i=1}^{4} \sum_{j=1}^{4}c_{ij}x_{ij} \\ s.t. \sum_{j=1}^{4}x_{ij}=1,\quad i=1,...,4 \\ \sum_{i=1}^{4}x_{ij}=1,\quad j=1,...,4 \\ x_{ij}=\left\{\begin{matrix} 1, \quad 指派第 i 个工人去完成第 j 项工作 \\0, \quad else\end{matrix}\right.\quad (i,j=1,...,4)
mini=1∑4j=1∑4cijxijs.t.j=1∑4xij=1,i=1,...,4i=1∑4xij=1,j=1,...,4xij={1,指派第i个工人去完成第j项工作0,else(i,j=1,...,4)
在这里,设
x
=
(
x
11
,
x
12
,
.
.
.
,
x
14
,
x
21
,
.
.
.
,
x
24
,
.
.
.
x
41
,
.
.
.
,
x
44
)
T
x=(x_{11},x_{12},...,x_{14},x_{21},...,x_{24},...x_{41},...,x_{44})^T
x=(x11,x12,...,x14,x21,...,x24,...x41,...,x44)T 。
创建 M 程序文件,写入下述代码:
f = [15;18;21;24;19;23;22;18;26;17;16;19;19;21;23;17];
intcon=1:16;
Aeq = [1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0;
0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0;
0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1;
1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0;
0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0;
0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0;
0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1];
beq = ones(8,1);
lb=zeros(16,1);
[x,fval] = intlinprog(f,intcon,[],[],Aeq,beq,lb,[])
运行之后,输出下述结果:
LP: Optimal objective value is 70.000000.
Optimal solution found.
Intlinprog stopped at the root node because the objective value is within a gap tolerance of the optimal value, options.AbsoluteGapTolerance = 0 (the default value). The intcon variables are
integer within tolerance, options.IntegerTolerance = 1e-05 (the default value).
x =
0
1
0
0
1
0
0
0
0
0
1
0
0
0
0
1
fval =
70