割平面法的理解
1. 简介
割平面法(Cutting Plane Method)用于求解整数规划问题,通过逐步添加线性约束(割平面)逼近整数解。本文以Gomory割平面法为例,结合简单示例拆解核心步骤。
2. 示例详解
问题描述
考虑整数规划问题:
max
3
x
1
+
2
x
2
s.t.
2
x
1
+
x
2
≤
6
2
x
1
+
3
x
2
≤
9
x
1
,
x
2
≥
0
,
且为整数
\begin{align*} \max \quad & 3x_1 + 2x_2 \\ \text{s.t.} \quad & 2x_1 + x_2 \leq 6 \\ & 2x_1 + 3x_2 \leq 9 \\ & x_1, x_2 \geq 0, \text{且为整数} \end{align*}
maxs.t.3x1+2x22x1+x2≤62x1+3x2≤9x1,x2≥0,且为整数
步骤1:求解松弛问题
引入松弛变量
x
3
,
x
4
≥
0
x_3, x_4 \geq 0
x3,x4≥0,转化为标准LP问题:
max
3
x
1
+
2
x
2
s.t.
2
x
1
+
x
2
+
x
3
=
6
2
x
1
+
3
x
2
+
x
4
=
9
x
1
,
x
2
,
x
3
,
x
4
≥
0
\begin{align*} \max \quad & 3x_1 + 2x_2 \\ \text{s.t.} \quad & 2x_1 + x_2 + x_3 = 6 \\ & 2x_1 + 3x_2 + x_4 = 9 \\ & x_1, x_2, x_3, x_4 \geq 0 \end{align*}
maxs.t.3x1+2x22x1+x2+x3=62x1+3x2+x4=9x1,x2,x3,x4≥0
用单纯形法求解得:
x
1
=
1.5
,
x
2
=
2
,
x
3
=
0
,
x
4
=
0
x_1=1.5, x_2=2, x_3=0, x_4=0
x1=1.5,x2=2,x3=0,x4=0,目标值8.5。
步骤2:选择非整数基变量
- 基变量: x 1 , x 2 x_1, x_2 x1,x2(非整数解)。
- 约束方程:选择非整数基变量(如
x
1
x_1
x1)对应的约束方程。
单纯形表中, x 1 x_1 x1 的约束方程为:
x 1 + 0.5 x 3 − 0.5 x 4 = 1.5 (来自行变换后的约束1,由非基变量表示基变量的变换而得) x_1 + 0.5x_3 - 0.5x_4 = 1.5 \quad \text{(来自行变换后的约束1,由非基变量表示基变量的变换而得)} x1+0.5x3−0.5x4=1.5(来自行变换后的约束1,由非基变量表示基变量的变换而得)
步骤3:构造割平面
-
分解系数和常数项
将系数和常数项分解为整数部分(向下取整)和小数部分(小数部分 f ∈ [ 0 , 1 ) f \in [0,1) f∈[0,1)):
0.5 = 0 + 0.5 (系数 x 3 ) − 0.5 = − 1 + 0.5 (系数 x 4 ) 1.5 = 1 + 0.5 (常数项) \begin{align*} 0.5 &= 0 + 0.5 \quad &\text{(系数}~x_3\text{)} \\ -0.5 &= -1 + 0.5 \quad &\text{(系数}~x_4\text{)} \\ 1.5 &= 1 + 0.5 \quad &\text{(常数项)} \end{align*} 0.5−0.51.5=0+0.5=−1+0.5=1+0.5(系数 x3)(系数 x4)(常数项) -
分离整数与小数部分
原方程改写为:
x 1 − x 4 − 1 ⏟ 整数部分 + 0.5 x 3 + 0.5 x 4 = 0.5 ⏟ 小数部分 \underbrace{x_1 - x_4 - 1}_{\text{整数部分}} + \underbrace{0.5x_3 + 0.5x_4 = 0.5}_{\text{小数部分}} 整数部分 x1−x4−1+小数部分 0.5x3+0.5x4=0.5 -
生成割平面约束
由于左边小数部分必须补偿右边的0.5,且变量非负:
0.5 x 3 + 0.5 x 4 ≥ 0.5 ⇒ x 3 + x 4 ≥ 1 0.5x_3 + 0.5x_4 \geq 0.5 \quad \Rightarrow \quad x_3 + x_4 \geq 1 0.5x3+0.5x4≥0.5⇒x3+x4≥1- 每个系数的小数部分 < 1 <1 <1,导致它们的线性组合可以 ≥1,不过并不影响上述不等式的成立。
步骤4:添加割平面并重新求解
将新约束转换为等式(引入松弛变量
x
5
≥
0
x_5 \geq 0
x5≥0):
x
3
+
x
4
−
x
5
=
1
x_3 + x_4 - x_5 = 1
x3+x4−x5=1
重新求解LP,得到整数解:
x
1
=
1
,
x
2
=
2
x_1=1, x_2=2
x1=1,x2=2,目标值7。
3. 泛化公式
对任意整数规划问题,假设松弛问题最优解中某基变量
x
i
x_i
xi 非整数,其约束方程为:
x
i
+
∑
j
∈
N
a
ˉ
i
j
x
j
=
b
ˉ
i
x_i + \sum_{j \in N} \bar{a}_{ij}x_j = \bar{b}_i
xi+j∈N∑aˉijxj=bˉi
其中
N
N
N 为非基变量集合,
b
ˉ
i
\bar{b}_i
bˉi 非整数。
割平面构造流程
-
分解系数:
a ˉ i j = ⌊ a ˉ i j ⌋ + f i j , b ˉ i = ⌊ b ˉ i ⌋ + f i \bar{a}_{ij} = \lfloor \bar{a}_{ij} \rfloor + f_{ij}, \quad \bar{b}_i = \lfloor \bar{b}_i \rfloor + f_i aˉij=⌊aˉij⌋+fij,bˉi=⌊bˉi⌋+fi
其中 0 ≤ f i j < 1 0 \leq f_{ij} < 1 0≤fij<1, 0 < f i < 1 0 < f_i < 1 0<fi<1。 -
分离方程:
x i + ∑ j ∈ N ⌊ a ˉ i j ⌋ x j − ⌊ b ˉ i ⌋ ⏟ 整数部分 + ∑ j ∈ N f i j x j − f i = 0 ⏟ 小数部分 \underbrace{x_i + \sum_{j \in N} \lfloor \bar{a}_{ij} \rfloor x_j - \lfloor \bar{b}_i \rfloor}_{\text{整数部分}} + \underbrace{\sum_{j \in N} f_{ij}x_j - f_i = 0}_{\text{小数部分}} 整数部分 xi+j∈N∑⌊aˉij⌋xj−⌊bˉi⌋+小数部分 j∈N∑fijxj−fi=0 -
生成割平面:
由于小数部分必须非负:
∑ j ∈ N f i j x j ≥ f i \sum_{j \in N} f_{ij}x_j \geq f_i j∈N∑fijxj≥fi
4. 关键细节
为什么割平面不切割整数解?
对任意整数可行解 x j x_j xj(包括松弛变量):
- 变量非负性: x j ≥ 0 x_j \geq 0 xj≥0 且为整数。
- 系数分解规则: f i j ∈ [ 0 , 1 ) f_{ij} \in [0,1) fij∈[0,1), f i ∈ ( 0 , 1 ) f_i \in (0,1) fi∈(0,1)。
假设存在整数解不满足割平面约束:
∑
f
i
j
x
j
<
f
i
\sum f_{ij}x_j < f_i
∑fijxj<fi
根据原约束方程分解形式:
整数部分
+
∑
f
i
j
x
j
=
f
i
\text{整数部分} + \sum f_{ij}x_j = f_i
整数部分+∑fijxj=fi
左边整数部分必须为整数,右边
f
i
∈
(
0
,
1
)
f_i \in (0,1)
fi∈(0,1)。若
∑
f
i
j
x
j
<
f
i
\sum f_{ij}x_j < f_i
∑fijxj<fi,则:
∑
f
i
j
x
j
=
f
i
−
k
(
k
为正整数
)
\sum f_{ij}x_j = f_i - k \quad (k \text{为正整数})
∑fijxj=fi−k(k为正整数)
又因为
f
i
∈
(
0
,
1
)
f_i \in (0,1)
fi∈(0,1):
∑
f
i
j
x
j
=
f
i
−
k
<
0
\sum f_{ij}x_j = f_i - k < 0
∑fijxj=fi−k<0
与
x
j
≥
0
x_j \geq 0
xj≥0 和
f
i
j
≥
0
f_{ij} \geq 0
fij≥0 矛盾!因此,任何整数解必须满足:
∑
f
i
j
x
j
≥
f
i
\sum f_{ij}x_j \geq f_i
∑fijxj≥fi
收敛性
- 每次割平面至少切割当前非整数解,理论上有限步收敛,但实际中可能较慢,可嵌入分支定界法提升效率。