最优化方法-5-整数规划 - 教程
min cᵀx
s.t. Ax = b
x ≥ 0
整数向量)就是x ∈ Zⁿ (x必须
长成这样的成为整数规划
NP困难问题就是类似于只取一些点,
割平面法
先解线性规划松弛,如果不是整数解,就添加约束把非整数部分切掉,但保留所有整数解
将整数规划(IP₀)放松为线性规划(LP₀)
使用单纯形法求解(LP₀)
若得到整数最优解,计算结束
当线性规划松弛的最优解不是整数时,需要生成割平面条件
假如我们有
x₁ x₂ x₃ x₄ RHS
-z 0 0 1/4 5/4 12.75
x₁ 1 0 3/4 -1/4 2.25
x₂ 0 1 -1/2 1/2 1.5
线性规划最优解:x₁ = 2.25, x₂ = 1.5, z = 12.75
缘于x₂ = 1.5不是整数,选择x₂行,取小数部分:
x₂ - 0.5x₃ + 0.5x₄ = 1.5
0.5x₃ + 0.5x₄ ≥ 0.5
即:x₃ + x₄ ≥ 1
引入松弛变量x₅:-x₃ - x₄ + x₅ = -1
加入表得到
x₁ x₂ x₃ x₄ x₅ RHS
-z 0 0 1/4 5/4 0 12.75
x₁ 1 0 3/4 -1/4 0 2.25
x₂ 0 1 -1/2 1/2 0 1.5
x₅ 0 0 -1 -1 1 -1
再次求解循环往复直到得解
分枝定界法
只需要检查那些'可能有希望'的解
(1) 分枝(Branching)
把大问题分成小问题
例子:假设x₁ = 2.3不是整数
分枝1:x₁ ≤ 2
分枝2:x₁ ≥ 3
这样就得到了两个更小、更具体的问题。
(2) 定界(Bounding)
计算每个子问题的'潜力'
对于每个子障碍:
求解线性规划松弛(去掉整数约束)
得到的目标函数值就是该子问题的"潜力"
最小化问题:
线性规划松弛值 ≤ 真实最优值(下界)
当前最好整数解 ≥ 真实最优值(上界)
(3) 剪枝(Pruning)
放弃没有希望的子难题
三种剪枝情况:
无解剪枝:子问题没有可行解
整数解剪枝:找到了整数解
界限剪枝:子疑问的潜力比当前最好解还差
我们举一个例子
最小化:z = -(x₁ + x₂)
约束条件:
-4x₁ + 2x₂ ≤ -1
4x₁ + 2x₂ ≤ 11
x₂ ≥ 1/2
x₁, x₂ ≥ 0,且为整数
我们先看这张图来留下一个整体印象,然后一步步来
[原始问题]
z = -4 (x₁=1.5, x₂=2.5)
/ \
x₁ ≤ 1 x₁ ≥ 2
z = -2.5 z = -3.5
[剪枝] (x₁=2, x₂=1.5)
/ \
x₂ ≤ 1 x₂ ≥ 2
z = -3.25 [无解]
(x₁=2.25, x₂=1)
/ \
x₁ ≤ 2 x₁ ≥ 3
z = -3 [无解]
[整数解]
1:求解原始问题的线性规划松弛
去掉整数约束,求解线性规划:
最小化:z = -(x₁ + x₂)
约束条件:
-4x₁ + 2x₂ ≤ -1
4x₁ + 2x₂ ≤ 11
x₂ ≥ 1/2
x₁, x₂ ≥ 0
结果:
最优解:x₁ = 1.5, x₂ = 2.5
最优值:z = -4
这不是整数解,要求分枝。
选择分枝变量:x₁ = 1.5(不是整数)
创建两个子问题:
子问题1:原始挑战 + x₁ ≤ 1
子问题2:原始问题 + x₁ ≥ 2
2.处理子问题2(x₁ ≥ 2)
最小化:z = -(x₁ + x₂)
约束条件:
-4x₁ + 2x₂ ≤ -1
4x₁ + 2x₂ ≤ 11
x₂ ≥ 1/2
x₁ ≥ 2
x₁, x₂ ≥ 0
结果:
最优解:x₁ = 2, x₂ = 1.5
最优值:z = -3.5
不是整数解,要求继续分枝。
选择分枝变量:x₂ = 1.5(不是整数)
创建两个子子问题:
子问题2.1:子问题2 + x₂ ≤ 1
子问题2.2:子问题2 + x₂ ≥ 2
我们dfs一条路走到黑
3.处理子问题2.1(x₁ ≥ 2, x₂ ≤ 1)
最小化:z = -(x₁ + x₂)
约束条件:
-4x₁ + 2x₂ ≤ -1
4x₁ + 2x₂ ≤ 11
x₂ ≥ 1/2
x₁ ≥ 2
x₂ ≤ 1
x₁, x₂ ≥ 0
结果:
最优解:x₁ = 2.25, x₂ = 1
最优值:z = -3.25
不是整数解,需要继续分枝
选择分枝变量:x₁ = 2.25(不是整数)
创建两个子子子问题:
子问题2.1.1:子问题2.1 + x₁ ≤ 2
子问题2.1.2:子问题2.1 + x₁ ≥ 3
4:处理子难题2.1.1(x₁ ≥ 2, x₂ ≤ 1, x₁ ≤ 2)
最小化:z = -(x₁ + x₂)
约束条件:
-4x₁ + 2x₂ ≤ -1
4x₁ + 2x₂ ≤ 11
x₂ ≥ 1/2
x₁ = 2
x₂ ≤ 1
x₁, x₂ ≥ 0
结果:
最优解:x₁ = 2, x₂ = 1
最优值:z = -3
这是整数解!更新当前最好解:
当前最好解:x₁ = 2, x₂ = 1
当前最好值:z = -3
5:处理子问题2.1.2(x₁ ≥ 3, x₂ ≤ 1)
求解线性规划松弛:无可行解 →剪枝
6:处理子问题2.2(x₁ ≥ 2, x₂ ≥ 2)
求解线性规划松弛:无可行解 →剪枝
7:回到子问题1(x₁ ≤ 1)
最小化:z = -(x₁ + x₂)
约束条件:
-4x₁ + 2x₂ ≤ -1
4x₁ + 2x₂ ≤ 11
x₂ ≥ 1/2
x₁ ≤ 1
x₁, x₂ ≥ 0
最优解:x₁ = 1, x₂ = 1.5
最优值:z = -2.5
界限剪枝-3,而-2.5 > -3(对于最小化问题更差),所以这个子问题不可能找到比当前更好的解 →就是:对于最小化问题,任何子难题的整数解的目标值 ≥ 该子问题的线性规划松弛值。当前最好值剪枝
浙公网安备 33010602011771号