游戏AI—纸牌游戏的求解策略
2026-08-04 更新:随着实验继续推进,问题已经从“怎样把 Beam Search 调得更强”,转变为“在不同信息边界下,什么搜索范式才合理”。本文保留原来的算法讨论,同时用最新对照结果修正早期结论。
一、引言:Klondike 的“信息迷雾”
Klondike(接龙)看似简单,实则是一个极好的算法实验场。它没有对手,却同时容纳了两种性质截然不同的问题:
| 信息世界 | AI 知道什么 | 本质问题 |
|---|---|---|
| 全信息(thoughtful / perfect information) | 从开局就知道所有暗牌与牌库顺序 | 在确定但巨大的状态空间中寻找完整解 |
| 可见信息(human-visible / imperfect information) | 只记住真正看过的牌,未翻暗牌保持未知 | 在多个可能世界之间持续决策 |
这里有一个重要区别:知道暗牌是什么,不等于可以提前移动暗牌。 全信息 AI 仍然必须遵守正常规则,只是它能提前规划“为了释放那张关键牌,现在应该先搬动什么”。
这条信息边界会彻底改变算法的任务。全信息 AI 面对的是组合搜索;可见信息 AI 面对的则是信念更新、信息价值和风险控制。两者共享同一副牌,却生活在不同的世界里。
二、算法炼金术:从 12% 到两种独立 AI
项目早期的目标很直接:让 AI 每一步都选一个“看起来更好”的动作。随着实验深入,算法逐渐分化成四种思路:
| 方法 | 信息条件 | 核心逻辑 | 实验表现 | 结论 |
|---|---|---|---|---|
| 固定优先级贪心 | 可见局面 | 只看当前一步的收益 | 极低 | 容易陷入局部最优与动作循环 |
| 基础 Beam Search | 早期项目环境 | 保留少量高分候选并向前看 | 12/100 | 比贪心更强,但会过早丢弃长线解 |
| 全信息启发式 DFS | 全部牌已知 | 沿最有希望的路径深入,失败后回溯 | 26/30(86.7%) | 适合离线寻找完整获胜路径 |
| 可见信息 ISMCTS | 只读玩家可见信息 | 采样多个可能牌局,再在线选择动作 | 19/30(63.3%) | 能处理未知,但需要为错误信念付出代价 |
Beam Search 的 12% 来自早期 100 局历史测试,与后两项的规则实现、样本和预算并不完全一致,不能直接当作严格倍数比较。真正具有可比性的是最后两项:它们在相同的 30 个发牌种子上独立运行。
这组对照给出了一个比“哪个算法更强”更有意思的结论:
知道暗牌带来的价值,不只是少走几步,而是把一个不完全信息决策问题,重新变成了确定性的路径搜索问题。
三、理论纵深:Beam Search 为什么会错过真正的解?
1. 分数并不单调
Klondike 中的“好局面”很难用单一分数描述。真正的获胜路径可能从一次短期退让开始:暂时不归组、先腾出空列、反复穿过牌库,甚至撤回一张 foundation 牌,只为几步之后翻开被压住的关键牌。
如果评价函数只奖励当前 foundation 数量、空列或已翻开的暗牌,那么某些必要的中间状态反而会得到低分。Beam Search 会在浅层就剪掉这些分支,此后再大的搜索深度也无法把它们找回来。
2. 宽度更大,不一定更好
Beam Search 用宽度换取时间与内存,但“扩大 beam 就会稳定变强”并不成立。Lemons 等人在 Beam Search: Faster and Monotonic 中专门讨论了这种非单调性,并提出结合 distance-to-go 估计的 Monobeam。
这对 Klondike 的启示是:搜索资源的多少,与搜索资源是否被投入正确方向,是两个问题。 如果评价函数无法识别真正的阻塞关系,更宽的 beam 可能只是更充分地搜索一批相似的错误路线。
3. 回溯是 Beam Search 缺失的记忆
Zhou 与 Hansen 的 Beam-Stack Search 把系统回溯重新引入 Beam Search:算法先快速找到次优解,再回到被剪掉的区间继续改进,最终可以收敛到最优解。
它解释了原始方案最想补上的能力——“如果眼前所有高分路线都失败,允许回头尝试当时的次优选择”。不过当前项目最终没有采用 Beam-Stack,而是直接选择更贴合全信息 Klondike 的启发式 DFS。
4. 从 NLP 借来的不是公式,而是警觉
在序列生成领域,Google 的 GNMT 技术报告 使用长度归一化与 coverage penalty,避免 Beam Search 偏爱过短输出,或遗漏输入中的关键信息。Meister、Vieira 与 Cotterell 的 Best-First Beam Search 则继续讨论单调评分、提前剪枝和搜索顺序。
这些方法不能直接移植到纸牌游戏,但它们提供了一种有价值的类比:
- 路径短,不代表离胜利更近;
- 当前得分高,不代表覆盖了所有关键目标;
- 一个好的启发式,必须同时表达“进度”和“尚未解决的依赖”。
四、从表面进度到阻塞关系
全信息 Klondike 最终更适合 DFS,不是因为 DFS 天生“更聪明”,而是因为它允许算法沿一条很长的假设链推进,并在失败后完整回溯。
Solvitaire 的研究表明,高性能纸牌求解器通常依赖四类思想:论文 · 源码
- Transposition table: 不重复搜索已经见过的局面;
- Symmetry breaking: 把空列、空槽位等对称状态折叠起来;
- Dominance: 对不会损害未来选择的动作直接做出判断;
- Streamliner: 主动排除理论上合法、实际上很少有价值的路线。
这类方法的共同点不是“算得更深”,而是让同样的预算只用于实质上不同的局面。
最新一轮实验还暴露了另一个细节:只统计暗牌总数是不够的。同样剩下 6 张暗牌,4+1+1 与 2+1+1+1+1 的难度完全不同。前者把风险集中在一条很深的依赖链上;后者给了算法更多并行释放的机会。
因此,评价函数应从“还有多少暗牌”继续追问:
- 暗牌集中在哪些列?
- 最深的阻塞链有多长?
- 哪个动作能创造真正有用的空列?
- 下一张被释放的牌能否立刻参与归组或构建?
这次更新把全信息 AI 从 25/30 提升到 26/30。数字只增加了一局,但它验证了一个更一般的判断:评价函数不应只描述局面有多好,还应该描述局面为什么被卡住。
五、另一种智能:在不知道答案时行动
全信息求解器回答的是“如果我知道所有牌,这副牌怎么解”。可见信息 AI 面对的问题更接近真实玩家:它只能记住已经看过的牌,再推断暗牌可能是什么。
| 比较维度 | 全信息搜索 | 可见信息搜索 |
|---|---|---|
| 搜索对象 | 一个确定状态图 | 一组与观察一致的可能世界 |
| 主要困难 | 组合爆炸 | 组合爆炸 + 身份不确定性 |
| 决策方式 | 离线寻找完整路径 | 每一步重新观察与规划 |
| 失败来源 | 搜索预算耗尽或排序不佳 | 错误信念、探索不足、循环或预算耗尽 |
| 核心价值 | 回溯与状态压缩 | 信念更新与信息价值 |
ISMCTS(Information Set Monte Carlo Tree Search)的基本思想,是多次采样与当前观察相容的牌局,在这些“可能世界”中模拟后续动作,再选择整体表现更稳健的一步。
它最大的风险是信息泄漏:如果搜索节点、评价函数或动作排序不小心使用了采样世界中的暗牌身份,算法表面上是在处理未知,实际上仍然在偷看答案。真正可信的对比,必须让未知牌始终停留在信念层,而不是悄悄进入决策状态。
这也解释了为什么“信息更少的算法偶尔赢过全信息算法”并不矛盾。有限预算下,搜索结果不仅取决于信息量,也取决于分支排序和随机探索。更多信息扩大了可利用的决策空间,但不会自动保证某一次有限搜索更成功。
六、当前结果:不要只看两个百分比
当前严格对照使用固定 deal seeds 0..29、独立算法随机种子、相同规则和每局步数上限;全信息搜索的状态预算固定为 20,000。两套 AI 分别从同一初始牌局开始,彼此不回退,也不合并胜局。
| 指标 | 全信息 AI | 可见信息 AI |
|---|---|---|
| 获胜局数 | 26 / 30 | 19 / 30 |
| 经验胜率 | 86.7% | 63.3% |
| 95% Wilson 区间 | 70.3%–94.7% | 45.5%–78.1% |
成对结果比单独的胜率更有解释力:
| 成对结果 | 局数 |
|---|---|
| 两者都赢 | 19 |
| 仅全信息 AI 赢 | 7 |
| 仅可见信息 AI 赢 | 0 |
| 两者都未赢 | 4 |
当前差值是 7 局、23.4 个百分点。它说明暗牌信息在这组牌局中确实产生了明显价值,但 30 局仍然是很小的样本;两个 Wilson 区间都相当宽,远不足以得出稳定的总体胜率。
同样需要注意:全信息 AI 的失败只代表“在 20,000 个状态内没有找到完整解”,不代表已经证明牌局无解;可见信息 AI 的失败也可能来自信念采样和在线策略,而不是牌局本身不可解。
七、上限的三种口径
原文中的 43%、82% 与当前 86.7%,分别来自不同规则、信息条件和实验方法。把它们排列在一条“算法越来越强”的直线上,会得到错误结论。
1. 当前有限预算实测
本项目的 86.7% / 63.3%,是当前实现对 30 个固定种子的经验结果。它会随搜索预算、启发式、采样次数和样本规模变化。
2. 全信息可解率估计
Blake 与 Gent 使用 Solvitaire 报告 thoughtful Klondike 的可解率为 81.945 ± 0.084%。CP 2025 的 Constraint Models for Klondike 进一步区分规则,将 Deal Three 更新为 81.942 ± 0.080%,将 Deal One 更新为 90.454 ± 0.090%。
本项目讨论的是 Draw One,因此 90.454% 是更接近的研究参照。但它仍然是大规模实验对“牌局是否可解”的估计,不保证任意有限预算求解器都能达到。
3. 可见策略的胜率下界与上限
Jupiter Scientific 曾在 Draw Three、无限回收规则下进行 442 局“human Monte Carlo”,其中赢了 189 局,得到约 43%。原报告把它解释为良好人类策略的经验下界,而不是所有玩家的期望胜率。原始报告
可见信息策略的真正上限仍未确定。它取决于允许的记忆、思考时间、随机策略、撤回规则和发牌方式。这里不存在一个可以脱离规则直接引用的“人类理论上限”。
八、下一步:两条不同的研究路线
全信息方向的核心问题,是怎样更准确地表达隐藏牌之间的依赖关系。比起继续调大搜索宽度,更值得探索的是依赖图、anytime search,以及 DFS 与 SAT / CP 约束模型的混合。
可见信息方向的核心问题,则是怎样让信念跨动作保持一致。持续粒子信念、POMCP / ISMCTS、信息价值评分,都比“每一步重新猜一副牌”更接近真正的不完全信息推理。
实验方法也需要同步升级:先扩大到 100,再到 1,000 副固定牌局;既报告状态预算,也报告相同 wall-time;同时给出 Wilson 区间和成对胜负,而不是只展示一个最好看的百分比。
九、结语:从纸牌看架构思维
Klondike 的求解过程,本质上是在有限资源(算力与内存)、**状态依赖(被压住的关键牌)和信息不确定性(暗牌)**之间寻找平衡。
这种带回溯的搜索,与复杂交易链路仍然有相似之处:
- 当前路径失败时,需要退回稳定状态并尝试替代路线;
- 搜索启发式像业务分级路由,决定有限资源先投向哪里;
- 状态去重与幂等控制一样,避免系统反复处理同一个局面;
- 最重要的是,规则、事实与推断必须分层,不能把“猜测”伪装成“已知”。
纸牌游戏给我的最终提醒是:搜索之前,先定义参与者能看见什么;优化之前,先定义我们测量的究竟是什么。
附录:核心文献
下面保留原文中的主要参考文献,并按用途区分:
- Klondike 求解与可解率: Blake & Gent(Solvitaire)、Dang 等(约束模型);
- Beam Search 理论: Beam-Stack Search、Best-First Beam Search、Monobeam;
- 跨领域启发: GNMT 的长度归一化与覆盖惩罚;
- 历史经验数据: Jupiter Scientific 报告。它不是同行评审论文,且采用 Draw Three,应与本项目结果分开理解。
@article{blake2026winnability,
title={The Winnability of Klondike Solitaire and Many Other Patience Games},
author={Blake, Charlie and Gent, Ian P.},
journal={Journal of Artificial Intelligence Research},
volume={85},
year={2026},
doi={10.1613/jair.1.17167}
}
@inproceedings{dang2025constraint,
title={Constraint Models for Klondike},
author={Dang, Nguyen and Gent, Ian P. and Nightingale, Peter and
Ulrich-Oltean, Felix and Waller, Jack},
booktitle={31st International Conference on Principles and Practice of
Constraint Programming (CP 2025)},
series={Leibniz International Proceedings in Informatics (LIPIcs)},
volume={340},
pages={9:1--9:20},
year={2025},
doi={10.4230/LIPIcs.CP.2025.9}
}
@software{blake2019solvitaire,
title={Solvitaire},
author={Blake, Charlie and Gent, Ian P.},
year={2019},
doi={10.5281/zenodo.3529524},
url={https://github.com/thecharlesblake/Solvitaire}
}
@inproceedings{zhou2005beamstack,
title={Beam-Stack Search: Integrating Backtracking with Beam Search},
author={Zhou, Rong and Hansen, Eric A.},
booktitle={Proceedings of the Fifteenth International Conference on
Automated Planning and Scheduling},
pages={90--98},
publisher={AAAI Press},
year={2005}
}
@article{meister2020bestfirst,
title={Best-First Beam Search},
author={Meister, Clara and Vieira, Tim and Cotterell, Ryan},
journal={Transactions of the Association for Computational Linguistics},
volume={8},
pages={795--809},
year={2020},
doi={10.1162/tacl_a_00346}
}
@inproceedings{lemons2022monobeam,
title={Beam Search: Faster and Monotonic},
author={Lemons, Sofia and Linares L{\'o}pez, Carlos and
Holte, Robert C. and Ruml, Wheeler},
booktitle={Proceedings of the Thirty-Second International Conference on
Automated Planning and Scheduling},
volume={32},
pages={222--230},
year={2022},
doi={10.1609/icaps.v32i1.19805}
}
@article{wu2016gnmt,
title={Google's Neural Machine Translation System: Bridging the Gap
between Human and Machine Translation},
author={Wu, Yonghui and Schuster, Mike and Chen, Zhifeng and others},
journal={CoRR},
volume={abs/1609.08144},
year={2016},
url={https://arxiv.org/abs/1609.08144}
}
@techreport{jupiter2013winning,
title={Winning Chances for Klondike Solitaire},
author={{Jupiter Scientific Staff}},
institution={Jupiter Scientific},
year={2013},
url={https://www.jupiterscientific.org/sciinfo/KlondikeSolitaireReport.html},
note={Historical human Monte Carlo report using Draw Three; not peer reviewed}
}
与 AI 的讨论
最后修改于 2026-05-02