0-1型整数规划
1.介绍:0-1型整数规划是整数规划中的特殊情况,通过引入0-1变量 x j x_j xj来描述约束条件,一般用于指派选择问题这一类的具有相互排斥的约束条件的规划问题,其中 x j x_j xj取1表示起作用或者被选择,取0反之。
比如有两种运输方式可供选择,但只能选其一。车运输约束条件为
5
x
1
+
4
x
2
≤
24
5x_1+4x_2\leq 24
5x1+4x2≤24,船运输的约束条件为
7
x
1
+
3
x
2
≤
45
7x_1+3x_2\leq 45
7x1+3x2≤45。这两种约束条件是互相排斥的,所以我们引入一个0-1变量:
y
=
{
1
,
采
取
船
运
,
0
,
采
取
车
运
.
y=\begin{cases} 1,采取船运,\\ 0,采取车运. \end{cases}
y={1,采取船运,0,采取车运.
那么就可以改写约束条件为:
{
5
x
1
+
4
x
2
≤
24
+
y
M
,
7
x
1
+
3
x
2
≤
45
+
(
1
−
y
)
M
,
y
=
0
或
1.
式
中
M
为
充
分
大
的
数
\begin{cases} 5x_1+4x_2\leq 24 +yM,\\ 7x_1+3x_2\leq 45 + (1-y)M,\\ y=0或1. \end{cases}\\ 式中M为充分大的数
⎩⎪⎨⎪⎧5x1+4x2≤24+yM,7x1+3x2≤45+(1−y)M,y=0或1.式中M为充分大的数
而如果有m个互相排斥的约束条件:
a
i
1
x
1
+
⋯
+
a
i
n
x
n
≤
b
i
,
i
=
1
,
2
,
⋯
,
m
。
a_{i1}x_1 + \cdots+a_{in}x_n\leq b_i,i=1,2,\cdots,m。
ai1x1+⋯+ainxn≤bi,i=1,2,⋯,m。
那么将引入m个0-1变量:
y
i
=
{
1
,
第
i
个
约
束
起
作
用
,
0
,
第
i
个
约
束
不
起
作
用
.
y_i=\begin{cases} 1,第i个约束起作用,\\ 0,第i个约束不起作用. \end{cases}
yi={1,第i个约束起作用,0,第i个约束不起作用.
则可以得出:
a
i
1
x
1
+
⋯
+
a
i
n
x
n
≤
b
i
+
(
1
−
y
i
)
M
,
i
=
1
,
2
,
⋯
,
m
,
y
1
+
⋯
+
y
m
=
1
,
a_{i1}x_1+\cdots+a_{in}x_n\leq b_i+(1-y_i)M,i=1,2,\cdots,m,\\ y_1+\cdots+y_m=1,
ai1x1+⋯+ainxn≤bi+(1−yi)M,i=1,2,⋯,m,y1+⋯+ym=1,
这样就实现了多取一的情况,有点像学数电里的选择器。
某工厂为了生产某种产品,有几种不同的生产方式可供选择,如选定的生产方式投资高(选购自动化程度高的设备),由于产量大,因而分配到每件产品的变动成本就降低;反之,如选定的生产方式投资低,将来分配到每件产品的变动成本可能增加。所以必须全面考虑。设有三种方式可供选择,令
j = 1 , 2 , 3 分 别 表 示 三 种 方 式 ; x j 表 示 采 用 第 j 种 方 式 时 的 产 量 ; c j 表 示 采 用 第 j 种 方 式 时 每 件 产 品 的 变 动 成 本 ; k j 表 示 采 用 第 j 种 方 式 时 的 固 定 成 本 j=1,2,3分别表示三种方式;\\x_j表示采用第j种方式时的产量;\\c_j表示采用第j种方式时每件产品的变动成本;\\k_j表示采用第j种方式时的固定成本 j=1,2,3分别表示三种方式;xj表示采用第j种方式时的产量;cj表示采用第j种方式时每件产品的变动成本;kj表示采用第j种方式时的固定成本
所以采用各种生产方式的总成本分别为:
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_jx_j,当x_j>0,\\ 0,当x_j=0,j=1,2,3 \end{cases}
Pj={kj+cjxj,当xj>0,0,当xj=0,j=1,2,3
再引入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,当采用第j种生产方式,即xj>0时0,当不采用第j种生产方式,即xj=0时
于是目标函数可以表示为:
m
i
n
z
=
(
k
1
y
1
+
c
1
x
1
)
+
(
k
2
x
2
+
c
2
x
2
)
+
(
k
3
y
3
+
c
3
x
3
)
s
.
t
.
y
j
ε
≤
x
j
M
,
j
=
1
,
2
,
3
,
式
中
:
ε
为
充
分
小
的
常
数
;
M
为
充
分
大
的
常
数
min\quad z=(k_1y_1+c_1x_1)+(k_2x_2+c_2x_2)+(k_3y_3+c_3x_3)\\ s.t.\quad y_j\varepsilon\leq x_jM,j=1,2,3,\\ 式中:\varepsilon为充分小的常数;M为充分大的常数
minz=(k1y1+c1x1)+(k2x2+c2x2)+(k3y3+c3x3)s.t.yjε≤xjM,j=1,2,3,式中:ε为充分小的常数;M为充分大的常数
PS:其实可以理解取了充分大充分小的常数之后,这个约束条件便会失去约束作用,自然不被选择。比如小于充分大后,其最大值就等于没有设限
拟分配n人去做n项工作,每人做且仅做一项工作,若分配第i人去做第j项工作,需花费 c i j c_{ij} cij单位时间,问应如何分配工作才能使工人花费的总时间最少?给出指派问题的系数矩阵C=( c i j c_{ij} 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,第i人做第j项工作0,第i人不做第j项工作
所以可得出模型为:
m
i
n
∑
i
−
1
n
∑
j
=
1
n
c
i
j
x
i
j
,
s
.
t
.
{
∑
j
=
1
n
x
i
j
=
1
,
∑
i
=
1
n
x
i
j
=
1
,
x
i
j
=
0
或
1
min\quad \sum_{i-1}^n\sum_{j=1}^nc_{ij}x_{ij},\\ s.t.\begin{cases}\sum_{j=1}^nx_{ij}=1,\\ \sum_{i=1}^nx_{ij}=1,\\ x_{ij}=0或1\end{cases}
mini−1∑nj=1∑ncijxij,s.t.⎩⎪⎨⎪⎧∑j=1nxij=1,∑i=1nxij=1,xij=0或1
例1.投资问题:有600万元投资5个项目,如下表:
项目 | 投资额 | 项目收益 | 约束条件 |
---|---|---|---|
一 | 210 | 160 | 1.项目一、二、三中选一项 |
二 | 300 | 210 | 2.项目三、四中选一项 |
三 | 150 | 60 | 3.项目五以项目一为先验条件 |
四 | 130 | 80 | |
五 | 260 | 180 |
即可求得模型:
m
a
x
z
=
160
x
1
+
210
x
2
+
60
x
3
+
80
x
4
+
180
x
5
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
max\quad z=160x_1+210x_2+60x_3+80x_4+180x_5\\ s.t.\begin{cases} 210x_1+300x_2+150x_3+130x_4+260x_5\leq 600,\\ x_1+x_2+x_3=1,\\ x_3+x_4=1,\\ x_5\leq x_1\\ x_1,x_2,x_3,x_4,x_5=0或1 \end{cases}
maxz=160x1+210x2+60x3+80x4+180x5s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧210x1+300x2+150x3+130x4+260x5≤600,x1+x2+x3=1,x3+x4=1,x5≤x1x1,x2,x3,x4,x5=0或1
非标准型的指派模型
1.如果是最大化指派问题,则需要先把指派矩阵中的最大值m- c i j c_{ij} cij形成新的指派系数。
2.如果人数和工作数不等,则哪个少就增加哪个的虚拟对象,并设代价为0
3.如果一个人可做多分工作,则多创造几个相同的人
4.某工作不能某人做,则将代价设置为足够大
第一步:从指派矩阵c中的每一行减去当前行的最小元素,再从每一列减去当前列的最小元素
第二步:进行试指派,寻求最优解。从只有一个0的行(列)开始,标记当前0,划去当前0所在的列(行)的所有0,反复进行直到尽可能多的0被标记。若仍有未被标记或者划掉的0,且同行(列)至少有两个0,则从0最少的行(列)开始,比较这与行所有0元素的列中0元素的数量,标记该行0元素最少的列对应的0,划掉同行同列的0,直到所有0都被标记或者划掉,若标记0的数目等于阶数,则找到了最优解,否则进行第三步,但是第三步老折腾了,所以如果需要进行第三步,建议放弃改用MATLAB求解。
Matlab求解混合整数线性规划的命令为:
标准数学模型如下:
m
i
n
f
T
x
,
s
.
t
.
{
x
(
i
n
t
c
o
n
)
为
整
数
A
x
≤
b
,
A
e
q
≤
b
e
q
,
l
b
≤
x
≤
u
b
.
其
中
i
n
t
c
o
n
的
意
义
为
整
数
约
束
变
量
的
位
置
,
基
本
上
有
n
个
决
策
变
量
则
取
[
1
,
2
,
⋯
,
n
]
minf^Tx,\\ s.t.\begin{cases}x(intcon)为整数\\ Ax\leq b,\\ Aeq\leq beq,\\ lb\leq x\leq ub. \end{cases}\\ 其中intcon的意义为整数约束变量的位置,基本上有n个决策变量则取[1,2,\cdots,n]
minfTx,s.t.⎩⎪⎪⎪⎨⎪⎪⎪⎧x(intcon)为整数Ax≤b,Aeq≤beq,lb≤x≤ub.其中intcon的意义为整数约束变量的位置,基本上有n个决策变量则取[1,2,⋯,n]
例2.求解下列指派问题,已知指派矩阵为:
[
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
]
\begin{bmatrix} 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{bmatrix}
⎣⎢⎢⎢⎢⎡3868987441022226109739375510⎦⎥⎥⎥⎥⎤
解:这里需要把二维决策变量
x
i
j
(
i
,
j
=
1
,
⋯
,
5
)
x_{ij}(i,j=1,\cdots,5)
xij(i,j=1,⋯,5)变为一维决策变量
y
k
(
k
=
1
,
⋯
,
25
)
y_k(k=1,\cdots,25)
yk(k=1,⋯,25)
然后依据[x,fval] = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)抽取参数:
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
]
i
n
t
c
o
n
=
[
1
,
2
,
⋯
,
25
]
A
e
q
=
[
0
⋯
25
行
⋯
0
⋅
⋅
10
列
⋅
⋅
⋅
0
⋯
0
]
b
e
q
=
[
1
,
⋯
10
列
⋯
,
1
]
T
l
b
为
25
行
1
列
的
0
u
b
为
25
行
1
列
的
1
c=\begin{bmatrix} 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{bmatrix}\\ intcon=[1,2,\cdots,25]\\ Aeq=\begin{bmatrix} 0&\cdots25行\cdots&0\\ \cdot&&\cdot\\ 10列&&\cdot\\ \cdot&&\cdot\\ 0&\cdots&0 \end{bmatrix}\\ beq=[1,\cdots10列\cdots,1]^T\\ lb为25行1列的0\\ ub为25行1列的1
c=⎣⎢⎢⎢⎢⎡3868987441022226109739375510⎦⎥⎥⎥⎥⎤intcon=[1,2,⋯,25]Aeq=⎣⎢⎢⎢⎢⎡0⋅10列⋅0⋯25行⋯⋯0⋅⋅⋅0⎦⎥⎥⎥⎥⎤beq=[1,⋯10列⋯,1]Tlb为25行1列的0ub为25行1列的1
转化为代码如下:
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);%这里a取十行是指行有五个加上列有五个
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 = intlinprog(c,intcon,[],[],a,b,lb,ub);
x = reshape(x,[5,5])
结果如下图: