文章目录
乘积式
(1) y = x 1 ∗ x 2 y = x_{1}*x_{2} y=x1∗x2, x 1 , x 2 x_{1},x_{2} x1,x2 ∈ \in ∈ {0,1}
当 x 1 = 0 x_{1} = 0 x1=0, 则 y ≤ M x 1 = x 1 y\leq Mx_{1}=x_{1} y≤Mx1=x1
当 x 2 = 0 x_{2} = 0 x2=0, 则 y ≤ M x 2 = x 2 y\leq Mx_{2}=x_{2} y≤Mx2=x2
当 x 1 = 1 x_{1} = 1 x1=1, 则 y ≤ x 1 ∗ x 2 = x 2 y\leq x_{1}*x_{2}=x_{2} y≤x1∗x2=x2, x 2 − y ≤ M ( 1 − x 1 ) = ( 1 − x 1 ) x_{2} - y \leq M(1-x_{1})=(1-x_{1}) x2−y≤M(1−x1)=(1−x1),即 x 1 + x 2 − 1 ≤ y x_{1}+x_{2}-1\leq y x1+x2−1≤y
(2) y = x 1 ∗ x 2 y = x_{1}*x_{2} y=x1∗x2, x 1 x_{1} x1 ∈ \in ∈ {0,1}, x 2 ∈ [ 0 , u ] x_{2}\in [0,u] x2∈[0,u]
当 x 1 = 0 x_{1} = 0 x1=0, 则 y ≤ M x 1 = x 1 y\leq Mx_{1}=x_{1} y≤Mx1=x1
当 x 2 ∈ [ 0 , u ] x_{2} \in [0,u] x2∈[0,u], 则 0 ≤ y ≤ M x 2 = u ∗ x 2 0 \leq y\leq Mx_{2}=u*x_{2} 0≤y≤Mx2=u∗x2
当 x 1 = 1 x_{1} = 1 x1=1, 则 y ≤ x 1 ∗ x 2 = x 2 y\leq x_{1}*x_{2}=x_{2} y≤x1∗x2=x2, x 2 − y ≤ M ( 1 − x 1 ) = u ( 1 − x 1 ) x_{2} - y \leq M(1-x_{1})=u(1-x_{1}) x2−y≤M(1−x1)=u(1−x1),即 x 2 − u ( 1 − x 1 ) ≤ y x_{2}-u(1-x_{1})\leq y x2−u(1−x1)≤y
(3) y = x 1 ∗ x 2 y = x_{1}*x_{2} y=x1∗x2, x 1 x_{1} x1 ∈ \in ∈ {0,1}, x 2 ∈ [ l , u ] , 0 ≤ l x_{2}\in [l,u],0 \leq l x2∈[l,u],0≤l
当 m ∗ x 1 ≤ x 1 ∗ x 2 ≤ M ∗ x 1 m*x_{1} \leq x_{1}*x_{2} \leq M*x_{1} m∗x1≤x1∗x2≤M∗x1, 则 l x 1 ≤ y ≤ u ∗ x 1 lx_{1} \leq y\leq u*x_{1} lx1≤y≤u∗x1
当 m ∗ x 2 ≤ y ≤ M ∗ x 2 m*x_{2} \leq y\leq M*x_{2} m∗x2≤y≤M∗x2, 则 0 ≤ y ≤ x 2 0 \leq y\leq x_{2} 0≤y≤x2
当 x 1 = 1 x_{1} = 1 x1=1, 则 y ≤ x 1 ∗ x 2 = x 2 y\leq x_{1}*x_{2}=x_{2} y≤x1∗x2=x2, x 2 − y ≤ M ( 1 − x 1 ) = u ( 1 − x 1 ) x_{2} - y \leq M(1-x_{1})=u(1-x_{1}) x2−y≤M(1−x1)=u(1−x1),即 x 2 − u ( 1 − x 1 ) ≤ y x_{2}-u(1-x_{1})\leq y x2−u(1−x1)≤y
绝对值
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")