求解整数规划问题的利器,通过“分支-定界-剪枝”高效搜索最优解
一、算法核心思想
分支定界(Branch and Bound)是一种系统化的搜索算法,专门用于求解整数规划、组合优化等NP难问题。其核心思想可以概括为三步:
-
分支:将原问题分解成若干子问题
-
定界:计算每个子问题的上下界
-
剪枝:通过比较界限,剪掉不可能包含最优解的子问题
这种方法将指数级的搜索空间大幅缩小,是运筹学中最经典的精确算法之一。
二、算法基本步骤
以一个简单的整数规划为例:
text
min x1 + 2x2
s.t. x1 + x2 ≥ 3
x1, x2 ∈ {0,1,2}
2.1 初始化
-
设置当前最优解 $x^* = \infty$
-
设置上界 $UB = \infty$(最小化问题)
2.2 根节点求解
求解线性松弛(去掉整数约束),得到:
-
松弛解:$(x_1, x_2) = (1.5, 1.5)$
-
目标值:4.5 → 这是下界 $LB = 4.5$
通过启发式找到一个整数可行解 $(2, 1)$,目标值4 → 更新上界 $UB = 4$
2.3 分支
选择变量 $x_1$ 进行分支:
-
子问题1:$x_1 \le 1$,松弛解得 $(1, 2)$,目标值5 → $LB = 5 \ge UB = 4$,剪枝
-
子问题2:$x_1 \ge 2$,松弛解得 $(2, 1)$,目标值4 → 整数解,更新 $UB = 4$,剪枝
2.4 算法结束
最优解为 $(2, 1)$,目标值4
三、最大化与最小化的界定义
理解上下界的定义是掌握分支定界的关键:
| 问题类型 | 下界 | 上界 |
|---|---|---|
| 最大化 | 可行解(我们能做到的) | 松弛解(理论上可能的上限) |
| 最小化 | 松弛解(理论上可能的下限) | 可行解(我们能做到的) |
关系:$下界 \le 最优值 \le 上界$
四、核心策略详解
4.1 分支策略
① 最不可行分支
选择离整数最远的变量进行分支(分数部分最接近0.5)
python
# 计算分数部分 fraction = min(x - floor(x), ceil(x) - x) # 选择fraction最大的变量
② 伪成本分支
维护每个变量向上/向下分支的历史改进信息,用于估计未来分支效果
-
$\psi_j^+$:向上分支的单位改进
-
$\psi_j^-$:向下分支的单位改进
③ 强分支
临时对候选变量进行分支并求解,选择改进最大的变量(精确但计算量大)
④ 可靠性分支(现代求解器默认)
-
信息不足时使用强分支
-
信息充足后使用伪成本估计
4.2 节点选择策略
| 策略 | 特点 | 适用场景 |
|---|---|---|
| 深度优先(DFS) | 内存小,快速找可行解 | 内存受限,或作为初始阶段 |
| 广度优先(BFS) | ||
| 最佳优先(Best Bound) | 快速提升全局界 | 内存充足,追求快速收敛 |
| 混合策略 | 先DFS找可行解,再Best Bound | 实际求解器默认方式 |
4.3 定界方法
| 方法 | 界紧度 | 速度 | 适用场景 |
|---|---|---|---|
| 线性规划松弛 | 较松 | 快 | 通用基础 |
| 拉格朗日松弛 | 较紧 | 中 | 可分解结构 |
| 切割平面 | 动态收紧 | 中 | 通用,常与LP结合 |
| 启发式 | 提供可行解 | 快 | 更新全局界 |
4.4 剪枝技巧
剪枝时机
-
节点生成后:边界检查、可行性检查
-
节点求解后:界比较、整数性、不可行性、支配性
-
全局界更新后:回溯检查、批量剪枝
特殊剪枝
-
对称性剪枝(如TSP中固定起点)
-
支配性剪枝(如路径比较:在旅行商问题中,假设有两条部分路径都访问了相同的城市集合,但一条路径长度更短,则另一条路径被支配,可以剪枝。)
-
整数性剪枝:线性松弛之后,得到的解已经是整数可行解了,可以更新问题的全局上/下界,并回溯将节点剪枝
4.5 数值稳定性
设置容忍度避免浮点误差误判:
-
整数性容忍度:$10^{-6}$
-
最优性容忍度:$10^{-6}$
五、算法流程图
text
开始
↓
求解根节点松弛
↓
初始化全局界
↓
┌─────────────────┐
│ 选择节点 │
│ (DFS/Best Bound)│
└────────┬────────┘
↓
┌─────────────────┐
│ 分支 │
│ (选择变量) │
└────────┬────────┘
↓
┌─────────────────┐
│ 定界 │
│ (求解松弛) │
└────────┬────────┘
↓
是否可剪枝?
↙ ↘
是 否
↓ ↓
剪枝 加入待探索列表
↓ ↓
└─────────────┘
↓
待探索列表空?
↓ 是
输出最优解
六、总结
分支定界算法的成功依赖于四个关键要素:
-
紧的界:好的松弛方法 + 高效的启发式
-
聪明的分支策略:平衡计算与树大小
-
高效的节点管理:控制内存与速度
-
利用问题特性:定制化剪枝
实际应用中,现代求解器(如CPLEX、Gurobi、SCIP)通常采用分支切割法,结合分支定界与割平面,并配合可靠性分支、混合节点选择等策略,实现高效求解。

1006

被折叠的 条评论
为什么被折叠?



