最优化方法-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)

放弃没有希望的子难题

三种剪枝情况:

  1. 无解剪枝:子问题没有可行解

  2. 整数解剪枝:找到了整数解

  3. 界限剪枝:子疑问的潜力比当前最好解还差

我们举一个例子

最小化: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(对于最小化问题更差),所以这个子问题不可能找到比当前更好的解 →就是:对于最小化问题,任何子难题的整数解的目标值 ≥ 该子问题的线性规划松弛值。当前最好值剪枝

posted @ 2025-12-09 17:24  clnchanpin  阅读(2)  评论(0)    收藏  举报