数学模型tricks | 大M法线性化注意事项
文章目录
数学模型tricks | 大M法线性化注意事项问题错误根源总结1.综上2.大M的用法详细介绍3.大M取值太小引发的错误4.Gurobi求解时精度引起的错误5.偷懒的解决方法
问题
有如下二次项:
g
x
gx
gx 其中
g
∈
{
0
,
1
}
,
−
10
≤
x
≤
0
g \in \{0,1\},-10 \leq x \leq 0
g∈{0,1},−10≤x≤0 用大M法线性化 令
y
=
g
x
y = gx
y=gx,转化为
y
≥
x
,
y
≥
−
M
g
,
y
≤
x
+
M
(
1
−
g
)
y \geq x,y \geq -Mg,y \leq x + M(1-g)
y≥x,y≥−Mg,y≤x+M(1−g) 即:
g
=
1
g =1
g=1时,
y
=
x
y=x
y=x;
g
=
0
g =0
g=0时,
y
=
0
y=0
y=0
为了检验大M法的效果,用Gurobi求解下面的问题
m
i
n
x
y
≥
x
y
≥
−
M
g
y
≤
x
+
M
(
1
−
g
)
g
∈
{
0
,
1
}
−
10
≤
y
≤
0
−
10
≤
x
≤
0
min \quad x\\ y \geq x\\ y \geq -Mg\\ y \leq x + M(1-g)\\ g \in \{0,1\}\\ -10\leq y \leq 0\\ -10 \leq x \leq 0
minxy≥xy≥−Mgy≤x+M(1−g)g∈{0,1}−10≤y≤0−10≤x≤0
from gurobipy import *
m= Model()
M = GRB.INFINITY
x = m.addVar(lb = -10,ub=0,vtype=GRB.CONTINUOUS,name='miu')
y = m.addVar(lb = -10,ub=0,vtype=GRB.CONTINUOUS,name='xi')
g = m.addVar(vtype=GRB.BINARY,name='g')
m.setObjective(x,GRB.MINIMIZE)
m.addConstr(y >= x)
m.addConstr(y >= -M * g)
m.addConstr(y |