偶尔在 Gurobi 的讲座中听到了这个技巧,假如两个 0-1 变量 x i x_i xi, x j x_j xj,它们的乘积
z i j = x i x j z_{ij}=x_ix_j zij=xixj
这是一个非线性表达式,但可以通过下面的约束条件线性化:
z
i
j
≤
x
i
z
i
j
≤
x
j
z
i
j
≥
x
i
+
x
j
−
1
z
i
,
j
,
x
i
,
x
j
∈
{
0
,
1
}
\begin{aligned} &z_{ij}\leq x_i\\ &z_{ij}\leq x_j\\ &z_{ij}\geq x_i+x_j-1\\ &z_{i,j}, x_i, x_j\in\{0, 1\} \end{aligned}
zij≤xizij≤xjzij≥xi+xj−1zi,j,xi,xj∈{0,1}
若是一个 0-1 变量与连续变量的乘积,也可转化,例如
y
=
z
x
y=zx
y=zx
其中,
z
z
z 为 0-1 变量,而
x
x
x 为连续变量,则可以通过下面的约束条件线性化:
y
≥
x
−
(
1
−
z
)
M
y
≤
x
y
≤
z
M
y
≥
−
z
M
\begin{aligned} y&\geq x-(1-z)M\\ y&\leq x\\ y&\leq zM\\ y&\geq -zM \end{aligned}
yyyy≥x−(1−z)M≤x≤zM≥−zM
其中, M M M 为一个足够大的数(可以取值为 x x x 的上界)。