文章目录
乘积式
(1)
y
=
x
1
∗
x
2
,
x
1
,
x
2
∈
{
0
,
1
}
y=x_{1} * x_{2}, x_{1}, x_{2} \in\{0,1\}
y=x1∗x2,x1,x2∈{0,1}
{
y
≤
x
1
y
≤
x
2
y
≥
x
1
+
x
2
−
1
y
∈
{
0
,
1
}
\left\{\begin{array}{l} y \leq x_{1} \\ y \leq x_{2} \\ y \geq x_{1}+x_{2}-1 \\ y \in\{0,1\} \end{array}\right.
⎩⎪⎪⎨⎪⎪⎧y≤x1y≤x2y≥x1+x2−1y∈{0,1}
(2)
y
=
x
1
∗
x
2
,
x
1
∈
{
0
,
1
}
,
x
2
∈
[
0
,
u
]
y=x_{1} * x_{2}, x_{1} \in\{0,1\}, x_{2} \in[0, u]
y=x1∗x2,x1∈{0,1},x2∈[0,u]
{
y
≤
u
x
1
y
≤
x
2
y
≥
x
2
−
u
(
1
−
x
1
)
y
∈
[
0
,
u
]
\left\{\begin{array}{l} y \leq u x_{1} \\ y \leq x_{2} \\ y \geq x_{2}-u\left(1-x_{1}\right) \\ y \in[0, u] \end{array}\right.
⎩⎪⎪⎨⎪⎪⎧y≤ux1y≤x2y≥x2−u(1−x1)y∈[0,u]
(3)
y
=
x
1
∗
x
2
,
x
1
∈
{
0
,
1
}
,
x
2
∈
[
l
,
u
]
,
l
≥
0
y=x_{1} * x_{2}, x_{1} \in\{0,1\}, x_{2} \in[l, u], l \geq 0
y=x1∗x2,x1∈{0,1},x2∈[l,u],l≥0
{
y
≤
x
2
y
≥
x
2
−
u
(
1
−
x
1
)
l
x
1
≤
y
≤
u
x
1
\left\{\begin{array}{l} y \leq x_{2} \\ y \geq x_{2}-u\left(1-x_{1}\right) \\ l x_{1} \leq y \leq u x_{1} \end{array}\right.
⎩⎨⎧y≤x2y≥x2−u(1−x1)lx1≤y≤ux1
绝对值
max ∣ x ∣ \max |x| max∣x∣, big-M
max z z = x p + x n max ∣ x ∣ ⟶ x = x p − x n x p ≤ M y x n ≤ M ( 1 − y ) y ∈ { 0 , 1 } , 0 ≤ x p , x n \begin{array}{ll} &\max z \\ & z=x_{p}+x_{n} \\ \max |x| \quad \longrightarrow \quad & x=x_{p}-x_{n} \\ & x_{p} \leq M y \\ & x_{n} \leq M(1-y) \\ & y \in\{0,1\}, 0 \leq x_{p}, x_{n} \end{array} max∣x∣⟶maxzz=xp+xnx=xp−xnxp≤Myxn≤M(1−y)y∈{0,1},0≤xp,xn
- 优点:LP relaxation更紧,当M较小时表现会更好;
- 缺点:当x可以为无穷大/没有约束时,big-M不能取到。
max ∣ x ∣ \max |x| max∣x∣, SOS-1约束
max z z = x p + x n max ∣ x ∣ ⟶ x = x p − x n x p , x n ∈ S O S − 1 \begin{array}{ll} &\max z \\ & z=x_{p}+x_{n} \\ \max |x| \quad \longrightarrow \quad& x=x_{p}-x_{n} \\ & x_{p}, x_{n} \in SOS-1 \end{array} max∣x∣⟶maxzz=xp+xnx=xp−xnxp,xn∈SOS−1
- 优点:不需要big-M,且总是成立的。
- SOS(special ordered sets,特殊顺序集)是指一组有序集合里,顶多有一个非零值(SOS1 型),或顶多有两个非零值(SOS2 型)
Note: gurobi在presolve的时候往往会将SOS约束转换成Big-M的约束
addGenConstrAbs(y, x)
分段线性函数
SOS2表示法
假设
(
x
i
,
y
i
)
(x_{i},y_{i})
(xi,yi)是第
i
t
h
i^{th}
ith的端点,当
y
=
f
(
x
)
y=f(x)
y=f(x)是凸函数时,则SOS-2约束时冗余的。
x
=
∑
i
λ
i
x
i
y
=
∑
i
λ
i
y
i
∑
i
λ
i
=
1
λ
i
≥
0
,
SOS2
\begin{array}{c} x=\sum_{i} \lambda_{i} x_{i} \\ y=\sum_{i} \lambda_{i} y_{i} \\ \sum_{i} \lambda_{i}=1 \\ \lambda_{i} \geq 0, \text { SOS2 } \end{array}
x=∑iλixiy=∑iλiyi∑iλi=1λi≥0, SOS2
0-1变量表示法
z 1 ⩽ y 1 z 2 ⩽ y 1 + y 2 z 3 ⩽ y 2 + y 3 … z n − 1 ⩽ y n − 2 + y n − 1 z n ⩽ y n − 1 y 1 + y 2 + … + y n − 1 = 1 z 1 + z 2 + … + z n = 1 x = z 1 x 1 + z 2 x 2 + … + z n x n y = z 1 y 1 + z 2 y 2 + … + z n y n y i ∈ { 0 , 1 } ∀ i = 1 , 2 , ⋯ , n − 1 z i ⩾ 0 , ∀ i = 1 , 2 , ⋯ , n \begin{aligned} &z_{1} \leqslant y_{1}\\ &z_{2} \leqslant y_{1}+y_{2}\\ &z_{3} \leqslant y_{2}+y_{3}\\ &\ldots\\ &z_{n-1} \leqslant y_{n-2}+y_{n-1}\\ &z_{n} \leqslant y_{n-1}\\ &y_{1}+y_{2}+\ldots+y_{n-1}=1\\ &z_{1}+z_{2}+\ldots+z_{n}=1\\ &x=z_{1} x_{1}+z_{2} x_{2}+\ldots+z_{n} x_{n}\\ &y=z_{1} y_{1}+z_{2} y_{2}+\ldots+z_{n} y_{n}\\ &y_{i} \in\{0,1\}\\ &\forall i=1,2, \cdots, n-1\\ &z_{i} \geqslant 0, \quad \forall i=1,2, \cdots, n \end{aligned} z1⩽y1z2⩽y1+y2z3⩽y2+y3…zn−1⩽yn−2+yn−1zn⩽yn−1y1+y2+…+yn−1=1z1+z2+…+zn=1x=z1x1+z2x2+…+znxny=z1y1+z2y2+…+znynyi∈{0,1}∀i=1,2,⋯,n−1zi⩾0,∀i=1,2,⋯,n
min \min min/ max \max max
min \min min max \max max
min { max i x i } ⟶ min z z ≥ x i ∀ i \min \left\{\max _{i} x_{i}\right\}\longrightarrow\begin{array}{l} \min z \\ z \geq x_{i} \forall i \end{array} min{imaxxi}⟶minzz≥xi∀i
min \min min min \min min
min z min { min i x i } ⟶ z ≥ x i − M ( 1 − y i ) ∑ i y i = 1 y i ∈ { 0 , 1 } \begin{array}{l} & \min _{z} \\ \min \left\{\min _{i} x_{i}\right\}\longrightarrow& z \geq x_{i}-M\left(1-y_{i}\right) \\ & \sum_{i} y_{i}=1 \\ & y_{i} \in\{0,1\} \end{array} min{minixi}⟶minzz≥xi−M(1−yi)∑iyi=1yi∈{0,1}
变量-逻辑表达式
注意,以下 y y y ∈ \in ∈ {0,1}
与
x
1
=
1
∧
x
2
=
1
x
1
+
x
2
=
2
x_{1}=1 \wedge x_{2}=1 \quad x_{1}+x_{2}=2
x1=1∧x2=1x1+x2=2
y
=
(
x
1
=
1
∧
x
2
=
1
)
⟶
y
≤
x
1
y
≤
x
2
y
≥
x
1
+
x
2
−
1
\begin{aligned} y=\left(x_{1}=1 \wedge x_{2}=1\right) & \longrightarrow &y & \leq x_{1} \\ && y& \leq x_{2} \\ && y & \geq x_{1}+x_{2}-1 \end{aligned}
y=(x1=1∧x2=1)⟶yyy≤x1≤x2≥x1+x2−1
addGenConstrAnd(y, [x1,x2])
或
x
1
=
1
∨
x
2
=
1
,
x
1
+
x
2
≥
1
x_{1}=1 \vee x_{2}=1,x_{1}+x_{2} \geq 1
x1=1∨x2=1,x1+x2≥1
y
=
(
x
1
=
1
∨
x
2
=
1
)
⟶
y
≥
x
1
y
≥
x
2
y
≤
x
1
+
x
2
\begin{aligned} y=\left(x_{1}=1 \vee x_{2}=1\right) & \longrightarrow &y & \geq x_{1} \\ && y& \geq x_{2} \\ && y & \leq x_{1}+x_{2} \end{aligned}
y=(x1=1∨x2=1)⟶yyy≥x1≥x2≤x1+x2
addGenConstrOr(y, [x1,x2])
异或
x
1
=
1
xor
x
2
=
1
x
1
+
x
2
=
1
x_{1}=1 \text { xor } x_{2}=1 \quad x_{1}+x_{2}=1
x1=1 xor x2=1x1+x2=1
y
=
(
x
1
=
1
xor
x
2
=
1
)
⟶
y
≥
x
1
−
x
2
y
≥
x
2
−
x
1
y
≤
x
1
+
x
2
y
≤
2
−
x
1
−
x
2
\begin{aligned} y=\left(x_{1}=1 \text { xor } x_{2}=1\right) & \longrightarrow&y & \geq x_{1}-x_{2} \\ && y& \geq x_{2}-x_{1} \\ && y & \leq x_{1}+x_{2} \\ && y & \leq 2-x_{1}-x_{2} \end{aligned}
y=(x1=1 xor x2=1)⟶yyyy≥x1−x2≥x2−x1≤x1+x2≤2−x1−x2
If-then条件
- if x 1 = 1 x_{1}=1 x1=1 then x 2 = 1 x_{2}=1 x2=1,则 x 1 ≤ x 2 x_{1} \leq x_{2} x1≤x2
- if z = 1 z=1 z=1, then x 1 + 2 ∗ x 2 − x 3 ≥ 2 x_{1}+2*x_{2}-x_{3} \geq 2 x1+2∗x2−x3≥2
addGenConstrIndicator(z, 1, x1+2*x2-x3 >= 2)
半连续变量
半连续变量的表示
x
=
0
∨
40
≤
x
≤
100
x=0 \vee 40 \leq x \leq 100
x=0∨40≤x≤100
⟶
\quad \longrightarrow \quad
⟶
40
y
≤
x
≤
100
y
40y \leq x \leq 100y
40y≤x≤100y,
y
y
y
∈
\in
∈{0,1}
x = model.addVar(vtype=GRB.SEMICONT, lb=40, ub=100, name="x")
x = model.addVar(vtype=GRB.SEMIINT, lb=40, ub=100, name="x")
限制半连续变量的数量
40 y i ≤ x i ≤ 100 y i 40y_{i} \leq x_{i} \leq 100y_{i} 40yi≤xi≤100yi, y i y_{i} yi ∈ \in ∈{0,1}, ∑ i y i ≤ 30 \sum_{i}y_{i} \leq 30 ∑iyi≤30
大M的取值选择
x 1 + x 2 ≤ 10 + M y if x 1 , x 2 ≤ 100 , then M = 190 \begin{array}{c} x_{1}+x_{2} \leq 10+M y \\ \text { if } x_{1}, x_{2} \leq 100,\text { then } M=190 \end{array} x1+x2≤10+My if x1,x2≤100, then M=190
约束-逻辑不等式(或)
约束-逻辑等式(或)
至少(at least)
至少m个约束满足,则 ∑ i = 1 k y i ≥ m \sum _{i=1}^{k}y_{i} \geq m ∑i=1kyi≥m
max_(), min_(), abs_(), and_(), or_(), any_()
model.addConstr(x == abs_(y))
model.addConstr(x == or_(y,z,w))
X, Y, Gcons =
model.addVars(10),model.addVars(10), {}
for i in X:
Gcons[i] = model.addGenConstrMin(X[i], [Y[i], 10], name="Gc")