Skip to content

第五章 组合搜索——如何系统地探索解空间

开篇:为什么需要组合搜索?

三个看似简单的问题

问题 1:八皇后 在 8×8 棋盘上放置 8 个皇后,使其互不攻击。

  • 看起来简单:"放 8 个棋子而已"
  • 实际困难:前 7 步都对,第 8 步无路可走
  • 困惑:问题出在哪里?

问题 2:Sudoku 填满部分填充的棋盘,满足规则。

  • 看起来简单:"填数字而已"
  • 实际困难:朴素方法需要百万步
  • 困惑:为什么差距这么大?

问题 3:TSP 找一条访问所有城市的最短回路。

  • 看起来简单:"选路线而已"
  • 实际困难:城市数增加,时间爆炸
  • 困惑:如何高效求解?

这三个问题的共同特征:解空间巨大,但合法解稀疏

学习目标

完成本章学习后,你将能够:

  1. 实现回溯框架:系统枚举解空间,保证不遗漏合法解
  2. 设计剪枝策略:将百万步优化到几十步,理解约束的作用
  3. 应用 A 算法*:用启发函数指导搜索,保证最优性
  4. 理解启发式搜索:在最优性和效率之间权衡
  5. 连接 LLM 推理:理解搜索策略与推理策略的同构性

关键洞察:组合搜索的核心问题是"如何高效地探索巨大空间"——算法的效率取决于约束强度启发质量


核心叙事:搜索策略与 LLM 推理的同构性

一个令人惊讶的发现

2023 年,研究者发现:大语言模型(LLM)在推理时遇到的困难,与经典搜索算法的局限性惊人地相似

搜索策略LLM 推理对应局限性转移
贪心解码每步最高概率重复陷阱
思维链(CoT)线性推理一步错全错
思维树(ToT)多候选探索评估依赖
思维图(GoT)思想聚合启发依赖

这不是类比,而是同构——同一计算思想的不同实例化。

为什么这个对应关系重要?

  1. 诊断 LLM 失败:看到重复输出 → 知道是贪心陷阱 → 用 sampling 解决
  2. 设计改进策略:搜索策略的改进技术 → 直接迁移到 LLM
  3. 评估复杂度:ToT 的计算成本 = 回溯的搜索树规模

章节结构

本章遵循标准认知规律:

问题情境 → 直观思路 → 规范定义 → 算法实现 → 正确性分析 → 复杂度分析 → 变式练习

各节要点

5.1 回溯框架(~450 行)

  • 问题情境:八皇后的困境——前 7 步都对,第 8 步无路可走
  • 直观思路:从暴力枚举 → DFS → 回溯的演化
  • 核心内容:五子程序框架、正确性保证、复杂度分析
  • 关键代码:八皇后求解器
  • 思考题:为什么回溯保证正确但不保证效率?

5.2 剪枝策略(~500 行)

  • 问题情境:Sudoku 的速度差距——百万步 vs 48 步
  • 直观思路:提前发现死胡同、先填候选最少的位置
  • 核心内容:前瞻剪枝、最受约束优先、约束传播
  • 关键代码:完整剪枝 Sudoku 求解器
  • 思考题:剪枝会不会删掉合法解?

5.3 A 搜索*(~450 行)

  • 问题情境:同样的最优解,效率差距百倍
  • 直观思路:用松弛问题求下界
  • 核心内容:可容许性、启发函数设计、IDA*
  • 关键代码:TSP 的 A* 求解器
  • 思考题:为什么启发函数质量这么关键?

5.4 启发式搜索(~350 行)

  • 问题情境:复杂启发反而更差(顶点覆盖)
  • 直观思路:允许"错误"转移,跳出局部最优
  • 核心内容:爬山法、模拟退火、代价函数设计
  • 关键代码:TSP 的 SA 求解器
  • 思考题:为什么模拟退火需要温度调度?

5.5 LLM 推理同构性(~400 行)

  • 问题情境:LLM 卡在重复输出
  • 直观思路:搜索策略 → LLM 推理的映射
  • 核心内容:四对策略映射、ToT/GoT 框架、局限性转移
  • 思考题:理解搜索策略能帮助理解 LLM 推理吗?

综合练习(~350 行)

  • 问题情境与直觉建立(5 题)
  • 方法应用与实现(5 题)
  • 错误诊断与反例(5 题)
  • 方案比较与权衡(5 题)
  • 变式与边界条件(5 题)
  • 开放设计(5 题)
  • 综合应用(5 题)
  • 思考题(5 题)
  • LLM 协同实验(5 题)

阅读路径建议

路径一:循序渐进(推荐)

5.1 → 5.2 → 5.3 → 5.4 → 5.5 → 练习

适合:希望系统掌握组合搜索的读者

路径二:LLM 导向

5.5 → 遇到概念回查前置章节 → 练习

适合:主要关注 LLM 推理应用的读者

路径三:快速入门

5.1(回溯框架) → 5.5(LLM 连接) → 练习

适合:希望快速建立核心概念的读者


关键概念预告

三个"为什么"

  1. 为什么回溯保证正确但不保证效率?

    • 正确性:系统枚举保证不遗漏
    • 效率:解空间可能巨大(取决于约束强度)
  2. 为什么剪枝不会删掉合法解?

    • 剪枝条件基于"必然无解"的逻辑
    • 删掉的是无效分支,不是"可能无解"的分支
  3. 为什么 LLM 会"卡住"?

    • 贪心解码困在局部最优(重复模式)
    • 类似爬山法困在局部山峰

三个"如何"

  1. 如何将百万步优化到几十步?

    • 前瞻剪枝:提前发现死胡同
    • 约束传播:实时更新候选集
  2. 如何保证 A 的最优性?*

    • 可容许启发函数(不高估)
    • 下界紧度影响效率
  3. 如何设计好的 LLM 推理策略?

    • 从搜索策略迁移经验
    • 引入外部验证(类似剪枝的规则检查)

写作风格说明

本章遵循教材设计哲学的七大特征:

  1. 问题驱动:先让学生感受到"为什么需要",再给出定义
  2. 展示推理过程:从朴素方案到优化方案的演化
  3. 直觉先于形式:先描述直觉图景,再形式化
  4. 解释难点:回答"为什么这样定义""这个方法是怎么想到的"
  5. 例子多样化:最简单的例子、反例、变式、综合应用
  6. 练习多样化:不只是三层,包括错误诊断、方案比较、开放设计
  7. 终极目标:让读者面对新题时知道从哪里开始想

写在前面:本章的每一节都以"问题情境"开场——先感受到困难,再理解解决思路。因为理解"为什么需要",比理解"怎么做"更重要。


参考文献

  • Skiena S S. The Algorithm Design Manual[M]. 3rd ed. Springer, 2020.
  • Yao S, Yu D, Zhao J, et al. Tree of Thoughts[C]//NeurIPS. 2023.
  • Besta M, et al. Graph of Thoughts[C]//AAAI. 2024.
  • Huang J, et al. LLMs Cannot Self-Correct Reasoning[C]//ICLR. 2024.
  • Snell C, et al. Scaling LLM Test-Time Compute[J]. 2024.

新时代的算法课程