优化 | 线性化:两个0-1变量相乘的线性化
作者:刘兴禄, 清华大学
清华-伯克利深圳学院,博士在读
欢迎关注我们的微信公众号 运小筹
非线性整数规划模型
考虑下面的非线性0-1整数规划
max y + x z s . t . 2 x + 3 y ⩽ 3 y + z ⩽ 1 x , y , z ∈ { 0 , 1 } \begin{aligned} \max \quad & y + xz \\ s.t. \quad & 2x + 3y \leqslant 3 \\ & y + z \leqslant 1 \\ & x, y, z \in \{0, 1\} \end{aligned} maxs.t.y+xz2x+3y⩽3y+z⩽1x,y,z∈{0,1}
Gurobi求解代码
from gurobipy import *
model = Model('non-linear model')
x = model.addVar(lb=0, ub=1, vtype=GRB.BINARY, name='x')
y = model.addVar(lb=0, ub=1, vtype=GRB.BINARY, name='y')
z = model.addVar(lb=0, ub=1, vtype=GRB.BINARY, name='z')
model.setObjective(y + x*z, GRB.MAXIMIZE)
model.addConstr(2 * x + 3*y <= 3)
model.addConstr(y + z <= 1)
model.optimize()
print('x:', x.x)
print('y:', y.x)
print('z:', z.x)
求解结果
Optimal solution found (tolerance 1.00e-04)
Best objective 1.000000000000e+00, best bound 1.000000000000e+00, gap 0.0000%
x: 0.0
y: 1.0
z: 0.0
线性化
- 令 w = x z w=xz w=xz,且 w ∈ { 0 , 1 } w\in \{0, 1\} w∈{0,1}
- 引入下面的辅助约束
w ⩽ x w ⩽ z w ⩾ x + z − 1 \begin{aligned} &w \leqslant x \\ &w \leqslant z \\ &w \geqslant x + z - 1 \end{aligned} w⩽xw⩽zw⩾x+z−1
原模型等价为
max y + w s . t . 2 x + 3 y ⩽ 3 y + z ⩽ 1 w ⩽ x w ⩽ z w ⩾ x + z − 1 x , y , z , w ∈ { 0 , 1 } \begin{aligned} \max \quad &y + w \\ s.t. \quad &2x + 3y \leqslant 3 \\ &y + z \leqslant 1 \\ &w \leqslant x \\ &w \leqslant z \\ &w \geqslant x + z - 1 \\ &x, y, z, w \in \{0, 1\} \end{aligned} maxs.t.y+w2x+3y⩽3y+z⩽1w⩽xw⩽zw⩾x+z−1x,y,z,w∈{0,1}
具体推导见视频详解。
from gurobipy import *
model = Model('non-linear model')
x = model.addVar(lb=0, ub=1, vtype=GRB.BINARY, name='x')
y = model.addVar(lb=0, ub=1, vtype=GRB.BINARY, name='y')
z = model.addVar(lb=0, ub=1, vtype=GRB.BINARY, name='z')
w = model.addVar(lb=0, ub=1, vtype=GRB.BINARY, name='w')
model.setObjective(y + w, GRB.MAXIMIZE)
model.addConstr(2 * x + 3*y <= 3)
model.addConstr(y + z <= 1)
model.addConstr(w <= x)
model.addConstr(w <= z)
model.addConstr(w >= x + z - 1)
model.optimize()
print('x:', x.x)
print('y:', y.x)
print('z:', z.x)
print('w:', z.x)
求解结果为
Optimal solution found (tolerance 1.00e-04)
Best objective 1.000000000000e+00, best bound 1.000000000000e+00, gap 0.0000%
x: 0.0
y: 1.0
z: 0.0
w: 0.0
可见结果是一致的。
欢迎关注我们的微信公众号 运小筹
公众号往期推文如下