割平面法的理解
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
收敛性
- 每次割平面至少切割当前非整数解,理论上有限步收敛,但实际中可能较慢,可嵌入分支定界法提升效率。