栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

优化 | 线性化:两个0-1变量相乘的线性化

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

优化 | 线性化:两个0-1变量相乘的线性化

优化 | 线性化:两个0-1变量相乘的线性化

非线性整数规划模型

Gurobi求解代码 线性化

作者:刘兴禄, 清华大学

清华-伯克利深圳学院,博士在读

欢迎关注我们的微信公众号 运小筹

非线性整数规划模型

考虑下面的非线性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 } win {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

可见结果是一致的。


欢迎关注我们的微信公众号 运小筹

公众号往期推文如下




转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/744812.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号