<!-- title: 魔方求解器进化论：IDA*逼近上帝之数 -->
<!-- domain: programming -->
<!-- video: https://www.youtube.com/watch?v=Eysf6-E3ino -->

# 魔方求解器进化论：IDA* 如何一步步逼近"上帝之数"

## 为什么这个视频值得每个程序员看一遍

如果你写过任何一个"暴力搜索"的程序——八皇后、走迷宫、解数独——你多半在某个瞬间撞上过同一堵墙：**状态空间大得离谱，遍历根本跑不完**。Sebastian Lague 这条 27 分钟的视频，把这个问题用全世界最熟悉的玩具——魔方——讲得透彻又漂亮。

魔方的难，不在于"转不动"，而在于**组合爆炸**：一个三阶魔方有约 **4.3×10¹⁹** 种状态（读作"四千三百亿亿"），这个数字比地球年龄换算成的秒数还要大近 7 亿倍。可偏偏数学家已经证明，**任意一个状态，最多 20 步就能复原**——这就是著名的"上帝之数（God's Number）"。于是矛盾就出现了：答案明明就在 20 步之内，但你怎么把那 20 步从 4 千亿亿种可能性里"找"出来？

这条视频记录的，正是 Sebastian 用三种思路（观众在上一期评论区里给他支的招）一步步把自己的求解器从"能解"推向"逼近最优"的过程。它本质上是一堂**用具体案例讲透组合搜索、启发式剪枝、问题约简**的算法课。无论你做的是路径规划、调度、推荐系统的 beam search，还是大模型推理时的 decoding，视频里的核心思想都能迁移。下面我来拆解。

## 视频背景卡片

| 项目 | 内容 |
|------|------|
| 视频标题 | Coding Adventure: Improving my Rubik's Cube Solver |
| 频道 | Sebastian Lague |
| 订阅数 | 140 万 |
| 时长 | 27 分 28 秒 |
| 发布日期 | 2026 年 6 月 3 日（解读时发布约 10 天） |
| 播放量 | 约 16 万（系列上一期"Coding Adventure: Rubik's Cube"约 33 万） |
| 核心主题 | 用 CFOP、Domino Reduction、IDA\* + 剪枝表改进魔方求解器，逼近最优解 |
| 源码 | github.com/SebLague/Rubiks-Cube |

> 一句话定位：这是"Coding Adventure"系列的最新一期——这个系列以极高制作水准（自研 3D 可视化、片尾 raytracing 渲染）著称，每期都用一个具体项目把某个算法或数学概念讲到让你"看见抽象"。

## 核心内容拆解

### 一、起手：先把"人类的方法"教给计算机——CFOP

视频开篇的四个章节（Cross、F2L、OLL、PLL）其实就是**人类速拧界统治级的方法 CFOP**。它把复原拆成四个阶段：

- **Cross（十字）**：先在底层把四个棱块摆成十字；
- **F2L（First Two Layers，前两层）**：把四个底层角块和对应棱块成对塞进去，一次搞定两层；
- **OLL（Orient Last Layer，定向最后一层）**：把顶层所有色块朝向转正；
- **PLL（Permute Last Layer，排列最后一层）**：把顶层块换到正确位置。

顶尖速拧选手用 CFOP 能在 **3 到 5 秒内**复原一个魔方，平均步数大约 **55 到 60 步**。Sebastian 在这里做了一件有意思的事：让程序"像人一样"按 CFOP 的阶段去求解。

这段的真正价值，不在于"程序学会了拧魔方"，而在于它点破了一个关键认知——**人类和计算机优化的目标根本不是同一个**。人类追求的是**速度**：CFOP 的力量来自模式识别 + 肌肉记忆 + 几百条背下来的公式（OLL/PLL 共 57+21 个 case），它牺牲了步数，换来了"看一眼就能动手"。而计算机要追求的，是**最少的步数**。CFOP 的 55 步，距离上帝之数 20 步，差着一整个数量级。这个落差，就是后面所有算法要填的坑。

> 我的延伸：这种"目标错配"在工程里随处可见。你给团队定的 KPI 是"上线快"，他们就会堆 CFOP 式的捷径；你定的是"代码精简/最优解"，他们就得去做 IDA\* 式的深度搜索。**算法的选择，本质上是被优化目标决定的，不是被"哪个更高级"决定的。**

### 二、关键转折：Domino Reduction——把大问题"约简"成小问题

真正硬核的部分从 **Domino Reduction（多米诺约简）** 这一章开始。这是整条视频最聪明的一步棋，也是 Kociemba 两阶段算法（two-phase algorithm）的灵魂。

所谓 Domino Reduction，是先把魔方**约简到一个受限的子群（subgroup）G₁**——在这个子群里，你只需要用 180° 的半转（U2、D2、L2、R2、F2、B2）就能继续操作，魔方此时表现得就像一个"多米诺骨牌"拼图。一旦进入这个"多米诺状态"，搜索空间会**断崖式地缩小**。

为什么要这么做？因为如果你直接对完整魔方做穷举搜索，4.3×10¹⁹ 个状态根本无解。但如果你把它拆成"先降到 G₁"+"在 G₁ 里求解"两个阶段，每个阶段的搜索深度都被压到了个位数到十几步，组合起来才变得可行。

这是一个**极其通用的工程思想：遇到一个爆炸的大问题，不要硬刚，先找到一个变换把它降维成一个结构更规整的小问题**。在通信网优化里（比如路由表的压缩、状态机合并）、在编译器里（把中间表示 lowering 到更窄的指令集）、在数据库里（先按索引过滤再做 join），你都能看到"先约简、再求解"的同款套路。

### 三、Kociemba 与"上帝之数 20"——理论的锚点

视频在 Resources 里直接挂了 `kociemba.org/cube.htm`，因为后面的 IDA\* + 剪枝表路线，走的正是 Herbert Kociemba 提出的**两阶段算法**的思路：

- **Phase 1**：把魔方约简到 G₁ 子群（所有棱块朝向正确、所有角块朝向正确、中间四个棱块归位）；
- **Phase 2**：在 G₁ 内部只用半转，把魔方彻底复原。

Kociemba 算法的厉害之处在于：它不追求"绝对最优"，而是用一个可控的搜索，在毫秒级时间里给出 **20 步左右**的解。而真正的理论下限——**上帝之数 = 20**——是在 2010 年由 Tomas Rokicki、Herbert Kociemba、Morley Davidson 和 John Dethridge 借助 Google 的算力完成的证明：**任何魔方状态，在半转度量（half-turn metric）下，最多 20 步必能复原**。

> 这是整条视频隐含的"北极星"：无论你怎么优化，你都不可能比 20 步更少。20 就是物理极限。所有求解器的目标，都是在"求解时间"和"逼近 20"之间找平衡点。

### 四、求解引擎：Iterative Deepening 与 IDA\*

约简之后，怎么真正"搜"出那串步数？答案是 **IDA\***（Iterative Deepening A\*，迭代加深 A\*）。视频专门用了两章（Iterative Deepening、IDA\*）讲它，这是理解整条视频的算法核心。

先说**为什么要迭代加深（Iterative Deepening）**。找最短解，最朴素的办法是 BFS——一层层往外搜。但 BFS 要把所有访问过的状态都记下来，对魔方这种规模，内存会先爆炸。迭代加深的思路是：**反复做深度受限的 DFS**，第 1 轮只找深度 ≤1 的解，找不到就把上限调到 2，再找不到调到 3……每轮都从根节点重新开始。听起来很"浪费"（重复搜索了大量节点），但实际上因为搜索树的节点数是指数增长的，**最底层那一轮的工作量占绝大多数，前面的重复根本可以忽略不计**，而它换来的好处是：内存开销只有 O(深度)，几乎可以忽略。

再说 **A\* 的那颗"星"**。纯 DFS/迭代加深是"瞎搜"，没有方向感。A\* 引入了一个**启发式函数 h(n)**：对每个状态 n，估计它"还差多少步能复原"。搜索时优先走 `g(n) + h(n)`（已走步数 + 估计剩余步数）最小的路径。当 h(n) 是**可采纳的（admissible，即永远不高估真实剩余步数）**时，A\* 能保证找到最优解。

**IDA\* 就是把这两者缝合**：用迭代加深的框架（省内存），用 A\* 的启发式剪枝（省时间）。当某个分支的 `g + h` 已经超过当前的深度上限，就直接砍掉，不再深挖。这就是"为什么程序能在合理时间里逼近 20 步"的引擎。

### 五、性能炸药：Prune Tables（剪枝表 / 模式数据库）

但光有 IDA\* 还不够——启发式 h(n) 如果太弱，剪枝几乎不发生，搜索还是跑不完。于是视频的关键一章来了：**Prune Tables（剪枝表）**。

剪枝表的本质，是**用空间换时间**的极致：把魔方的状态拆成几个相互"独立"的坐标（coordinate），对每个坐标，**预先算好"从任意取值到目标，至少需要多少步"**，存成一张查找表。搜索时，把这几张表查出来的值取一个**最大值**，作为 IDA\* 的启发式 h(n)。

魔方常用的几个坐标规模都不大，正好适合预计算：

- **角块朝向（Corner Orientation）**：3⁷ = **2187** 种（第 8 个由前 7 个决定）；
- **棱块朝向（Edge Orientation）**：2¹¹ = **2048** 种；
- **UD-slice 坐标**（中间四棱的位置）：C(12,4) = **495** 种；
- 各种**排列（permutation）**坐标。

把这些坐标的"最优剩余步数"用 BFS 从目标状态反向扫一遍就能填满一张表。搜索时，多张表取 max——因为每个坐标都是真实剩余步数的**下界**，max 之后仍是下界，依然 admissible，**且剪枝力度大幅增强**。这正是 Culberson & Schaeffer（1998）和 Richard Korf 把"模式数据库（pattern database）"发扬光大时确立的范式。

> 这一段给我的最大启发：**所谓"性能优化"，很多时候不是把算法写得更花，而是把一部分计算提前算好、存起来**。剪枝表就是"以 GB 级内存换毫秒级响应"的典型。你做缓存、做预聚合、做物化视图、做大模型的 KV-Cache，本质都是同一个招——**把昂贵的搜索/计算，换成便宜的查表**。

### 六、压榨最后一寸：Multi-Search

视频倒数第二章 **Multi-Search**，是在两阶段算法上做的高级优化，也是把求解器从"还不错"推向"逼近最优"的最后一把劲。

朴素的 Kociemba 两阶段有个毛病：**Phase 1 只取第一个找到的解，可能不是全局最优组合**。因为 Phase 1 的解越短，不代表"Phase 1 + Phase 2 总步数"越短——有时候 Phase 1 多走一步，反而把魔方送进一个 Phase 2 极短的子状态，总步数更优。

Multi-Search 的做法（也是工程界成熟的做法）是：**不要只搜一条 Phase 1 路径，而是保留多条候选**，对每条候选都跑一次 Phase 2，最后挑出"总步数最短"的那条。这本质上是把"贪心"升级成"带宽度的小型 beam search"。代价是计算量成倍上升，换来的是解的步数进一步逼近下限。

> 这是个很现实的工程权衡：**最优解几乎总是更贵的**。愿意花 10 倍算力，能把 22 步压到 20 步；想再往下，可能要 100 倍。视频用"最终结果对比"直观地呈现了这条收益递减曲线——这也是所有优化问题的宿命。

## 知识结构图

```mermaid
flowchart TD
    A["目标：用尽可能少的步数复原魔方<br/>理论下限 = 上帝之数 20（2010 证明）"] --> B{"求解路线分叉"}

    B -->|"人类路线：追求速度"| C["CFOP 人类速拧法<br/>Cross→F2L→OLL→PLL<br/>~55 步 / 3-5 秒<br/>靠模式识别+肌肉记忆"]
    B -->|"机器路线：追求步数"| D["组合搜索 + 启发式剪枝"]

    D --> E["① Domino Reduction<br/>约简到子群 G₁（多米诺状态）<br/>= Kociemba Phase 1"]
    E --> F["② 在 G₁ 内继续搜索<br/>= Kociemba Phase 2（仅半转）"]

    F --> G["③ IDA* 搜索引擎<br/>迭代加深（省内存）<br/>+ A* 启发式 h(n)（省时间）<br/>h 可采纳 ⇒ 保证最优"]
    G --> H["④ Prune Tables 剪枝表<br/>角块朝向 3^7=2187<br/>棱块朝向 2^11=2048<br/>UD-slice C(12,4)=495<br/>多表取 max ⇒ 剪枝力大增"]

    H --> I["⑤ Multi-Search<br/>保留多条 Phase 1 候选<br/>= 带 beam 的小型束搜索"]
    I --> J["最终解：20~22 步<br/>逼近上帝之数"]

    C -.->|"步数多但极快"| K["适用：实时、人机交互"]
    J -.->|"步数少但算力贵"| L["适用：离线、追求最优"]

    style A fill:#fef3c7,stroke:#d97706
    style J fill:#dcfce7,stroke:#16a34a
    style H fill:#dbeafe,stroke:#2563eb
    style G fill:#e0e7ff,stroke:#4f46e5
```

## 实战启示：普通开发者能拿走什么

**1. 把"问题约简"变成肌肉记忆。** Domino Reduction 给出了一个万能模板：**别正面硬刚指数爆炸的状态空间，先找一个变换把它降到一个结构更简单的子问题**。你做状态压缩、做张量分解、做索引下推、做问题归约（reduce to known problem），都是这一招。下次遇到一个搜索/优化跑不动，先问自己："能不能先把问题变小？"

**2. 学会用"可采纳的启发式"驱动搜索。** IDA\* 的精髓是：只要你的启发式 h(n) 永远**不高估**真实成本，就能既剪枝、又保证最优。这个"admissible 启发式"的思想，可以直接搬到大模型 decoding（beam search 的打分）、路径规划（A\*）、约束求解上。关键是找到一个"乐观但有用"的下界估计。

**3. 把昂贵的搜索，换成便宜的查表。** Prune Tables 是"空间换时间"的教科书案例：花几 GB 内存预计算，把指数级搜索压成毫秒级。现实工程里——Redis 缓存、物化视图、向量索引、LLM 的 KV-Cache、Prompt Cache——全是同构的思路：**能预算的，绝不运行时算**。

**4. 迭代加深：用"看似浪费"换"可扩展性"。** 重复搜索上层节点听起来很蠢，但因为树是指数增长的，最底层占了绝大部分工作量，重复成本可忽略，却换来 O(深度) 的极小内存。当你被"内存放不下"卡住时，记得有这个反直觉的选项。

**5. 接受"最优解几乎总是更贵"。** Multi-Search 揭示的收益递减曲线是所有优化的真相：花 10 倍算力换来几步的提升。工程上要清醒——**先定义"够好"的阈值，别为了最后一丝最优耗尽预算**。

**6. （元启示）开放你的代码，让观众帮你进化。** 视频开篇就明说：CFOP、Domino Reduction、剪枝表这三个关键改进，全是**上一期评论区观众给的灵感**。把项目开源（github.com/SebLague/Rubiks-Cube）、公开你的求解器，社区会把你自己想不到的优化路径送上门。这是 Sebastian 这条视频能持续进化的真正原因，也值得每个开发者借鉴。

## 延伸学习路径

1. **Herbert Kociemba 官网** —— [kociemba.org/cube.htm](https://www.kociemba.org/cube.htm)：两阶段算法的源头，有可交互的求解器和完整数学推导，是理解 Phase 1/Phase 2 的第一手资料。
2. **Wikipedia: Optimal solutions for Rubik's Cube** —— en.wikipedia.org：上帝之数 20 的证明过程、Korf 算法、模式数据库的综述，适合建立全局认知。
3. **Richard Korf: "Finding Optimal Solutions to Rubik's Cube Using Pattern Databases" (1997)** —— 把 pattern database 用于魔方最优求解的经典论文，IDA\* + 剪枝表的学术源头。
4. **Red Blob Games（Amit Patel）的 A\* 与启发式搜索教程** —— [redblobgames.com](https://www.redblobgames.com)：把 A\*、IDA\*、admissible heuristic 讲得最直观的交互式教程，看完你能立刻上手实现。
5. **Sebastian Lague 频道往期** —— 他的 "Coding Adventure" 全系列（ procedural generation、slime、双摆等）都是用具体项目讲算法的范本，配合本期的源码食用最佳。

## 一句话总结

> **它用一只魔方，把"组合搜索 → 问题约简 → 启发式剪枝 → 预计算查表"这条算法工程的完整武器链，讲成了一个让你看得见、摸得着、还想自己动手复刻的故事——而真正的彩蛋是：推动求解器进化的不是天才，是开源社区里那些热情的观众。**

## 参考来源

1. [Coding Adventure: Improving my Rubik's Cube Solver — Sebastian Lague（本文核心视频）](https://www.youtube.com/watch?v=Eysf6-E3ino)
2. [Herbert Kociemba — Two-Phase Algorithm 官方站点](https://www.kociemba.org/cube.htm)
4. [Rubik's Cube 求解器源码 — github.com/SebLague/Rubiks-Cube](https://github.com/SebLague/Rubiks-Cube)
5. [Coding Adventure: Rubik's Cube（系列上一期）](https://www.youtube.com/watch?v=fy0HRViXZnE)

---
> 本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵**爱卫生**（微信ID: gprshome201101）维护，聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。
> 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。

> [!tip] 51学通信知识星球
> **星主：爱卫生**（微信：gprshome201101）——公众号「51学通信」创办者，19 年通信行业运维与讲师经验，著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书（各大电商平台有售）。
> **星球定位**：深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域，主打运维岗位与信令分析。
> **当前规模**：5200 篇主题 / 990 个回答，198 元/年。
> **加入福利**：加入星球后请加爱卫生微信，拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题，另有群内分享。
> **AI 加持**：51学通信知识星球已作为 skill 接入 WorkBuddy，使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例，做总结、找文档和 PPT 等场景全覆盖。

![51学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
