首页 › programming › 写一个下棋AI:搜索与评估

当代码第一次“看懂”棋局:《Coding Adventure: Chess》深度解读

概述

在所有“从零造一个AI”的编程选题里,国际象棋是被讲得最多、也最容易被讲糊涂的一个。独立开发者 Sebastian Lague 的这期《Coding Adventure: Chess》用不到三十分钟的篇幅,把“计算机为什么会下棋”这个71年的老问题,从最笨的穷举一路推到剪枝与局面评估,并且全部用可视化呈现——你在别处需要读三篇论文才能建立直觉的东西,这期视频用动画讲透了。本文按视频的叙事顺序拆解其核心内容,追溯每一步背后的真实理论与工程史,指出视频为了节奏而简化掉的部分,最后给出三条可以立刻上手实践的启示。无论你是否看过原视频,读完都能比“看过”多懂一层。

视频基本信息

一、这期视频讲了什么:五个要点按叙事顺序拆解

要点1:先把“棋”本身造出来——合法走法的坑比想象中深

视频没有一上来就谈AI,而是先老老实实实现棋盘、棋子和走法规则。这里藏着全片第一个精彩的工程洞察:国际象棋规则里最麻烦的不是“马怎么走”,而是“合法性”——兵能不能吃过路兵、王翼车翼能不能易位、走完这步自己的王会不会被将军。大多数教科书做法是在生成走法时写一堆特判:模拟走子→检查己方王是否被攻击→回退。

Sebastian Lague 用了一个更优雅的技巧:干脆允许“吃王”。也就是说,程序不做将军特判,如果一方走出送王的着法,另一方下一手直接把王吃掉,这局就结束了。“能不能吃到对方的王”本身就成为合法性的裁判——特例消失了,规则从十几条特判坍缩成一条。这个技巧在真正的棋类引擎社区里是知名做法,但很少有人把它讲得这么直观。

要点2:最直观的AI——穷举,以及它为什么必然失败

有了规则,最朴素的AI就是暴力搜索:从当前局面出发,枚举我所有走法、对手所有应法、我再所有走法……走到终局或固定深度,挑必胜分支。视频用动画展示了这棵“博弈树”的生长速度:国际象棋平均每步约35种合法走法,往下看6层(双方各三轮)就是3500万个局面,往下看20层则超过10的19次方量级。而据 Shannon 在1950年的经典估算,国际象棋完整博弈树的复杂度约为 10^120——这个数字比可观测宇宙中的原子数(约10^80)还大几十个数量级。穷举在数学上就死了。

要点3:极小化极大(Minimax)——把“对手也想赢”写进代码

视频接下来引入了本片真正的理论主角:Minimax 搜索。它的思想只有一句话:我在第n层选让己方评分最大的走法时,必须假设对手在第n+1层会选让己方评分最小的应法。搜索树因此分层交替取最大值和最小值,最终把“未来所有可能对抗的最坏情况中的最好结果”回传给根节点。

这个框架来自冯·诺依曼1928年证明的极小化极大定理(后收入1944年《博弈论与经济行为》),它证明了在零和、完全信息的双人游戏中,“理性双方”的博弈存在确定值。视频用逐层动画把回传过程画得非常清楚——这是全片第一个“哦,原来如此”的时刻。

要点4:Alpha-Beta 剪枝——不看那些注定没用分支

Minimax 的问题是即使有了评估函数,节点数依然指数爆炸。视频随后引出第二个理论主角:Alpha-Beta 剪枝。其核心观察是:在极小层,只要发现某个子分支的评分已经低于已知上界,这个分支剩下的兄弟节点根本不需要再看——对手绝不会让你走到那里去。

视频用树状动画演示了剪枝过程,并点出了工程上最关键的实践经验:剪枝效率极度依赖走法排序。如果先检查强的走法(比如吃子、将军),树会被剪得干花乱坠;如果顺序随机,剪枝几乎失效。按 Knuth 与 Moore 1975年的经典分析,理想排序下 Alpha-Beta 能把需要访问的节点数从 O(b^d) 降到约 O(b^(d/2))——对国际象棋来说,等效于把每层的分支因子从35压到6左右。这不是10%的优化,是“不可能”与“可行”之间的距离。

要点5:评估函数——让机器在看不到终局的地方“有感觉”

搜索深度终究有限(视频实现的版本大概搜到若干层),深度截断时遇到的中间局面需要打分。视频实现了一个典型的手工评估函数:子力价值(兵1分、马3分、象3分、车5分、后9分)加上棋子位置表(piece-square tables:处于中心和关键格的棋子加分、 tucked 在原地的子减分)。两个分数相加,就是一个机器对局面的“直觉”。

视频最有感染力的段落,是展示这个由“搜索×评估”组成的朴素AI随着深度增加逐步变强——从乱走子到会设陷阱、会算杀。它距离顶级引擎还很远,但已经能击败绝大多数没受过训练的人类玩家。这个“一下午代码=一个俱乐部棋手”的结果,是对搜索树理论最直观的致敬。

二、知识溯源:这条视频背后71年的真实历史

1. Shannon 的蓝图(1950)。 信息论之父 Claude Shannon 1950年发表论文《Programming a Computer for Playing Chess》,第一次系统提出了走法生成、评估函数、搜索深度的完整框架,并区分了“全宽搜索的A型策略”与“选择性搜索的B型策略”。视频里“评估函数+有限深度搜索”的整体架构,正是 Shannon 方案的直接实现。论文中给出的10^120估算(后世称“Shannon数”)也出自此文。

2. 冯·诺依曼的定理(1928)。 极小化极大定理出自冯·诺依曼1928年的德文论文《Zur Theorie der Gesellschaftsspiele》,是博弈论的公理化起点。Minimax 算法只是这个定理的计算投影。

3. Alpha-Beta 的发现权之谜(1956–1975)。 剪枝思想由包括 John McCarthy 在内的多位研究者于1950年代独立提出;1975年 Donald Knuth 与 Ronald Moore 发表《An Analysis of Alpha-Beta Pruning》,给出了严格的复杂度分析,从此成为教科书标准内容。视频没有展开这段历史,但“先试好走法”这一工程经验,正是 Knuth–Moore 分析的直接推论(α-β 在理想排序下才达到平方根级复杂度)。

4. Deep Blue 时刻(1997)。 1997年5月,IBM 的专用超级计算机 Deep Blue 以 3.5:2.5 击败时任世界冠军卡斯帕罗夫。它本质上正是“深度Alpha-Beta搜索+手工评估+海量开局库”路线的工程极限——每秒约2亿个局面的评估。视频中那个朴素AI,就是沿着这条路的前几步。

5. Stockfish 与 NNUE(2008–2020)。 开源引擎 Stockfish 自2008年起步,长期霸榜 TCEC 计算机国际象棋赛事;2020年它引入了源自日本工程师相庭悠的 NNUE(Efficiently Updatable Neural Network,2018年提出)技术,用小型神经网络替换手工评估函数,同时保留 Alpha-Beta 搜索骨架,棋力再上一个台阶。这验证了视频中“搜索是骨架、评估是灵魂”的结构判断:现代强引擎换了灵魂,但骨架未变。

6. AlphaZero 的范式冲击(2017–2018)。 DeepMind 的 AlphaZero(David Silver 等,2017年arXiv预印本,2018年刊于《Science》)用纯自我博弈的深度强化学习+蒙特卡洛树搜索(MCTS,Coulom 与 Kocsis–Szepesvári 2006年奠基),从零训练数小时即超越人类千年棋理,广义版本还同时拿下将棋和围棋。它证明评估函数可以完全由学习得到——这是对“手工位置表”路线的降维打击,也是视频这类“从手工评估出发”的教学叙事最好的续集。

三、批判性审查:哪些站得住,哪些被简化了

证据充分的部分。 视频的主干——合法走法生成、Minimax、Alpha-Beta、子力+位置表评估——每一环都有扎实理论与数十年工程实践背书,本文溯源部分可交叉验证。“走法排序决定剪枝效率”“深度增加棋力提升”的演示也与文献一致(棋力与搜索深度的正相关在引擎评测中反复被证实,直至收益递减)。“允许吃王”处理合法性也是引擎社区的真实做法,可在 Chess Programming Wiki 查到。

被简化或略过的部分。 朴素Minimax+评估到引擎之间还隔着几道关键工程,视频为节奏全部略去:一是静态搜索(quiescence search)——深度截断会遇到“水平线效应”(看到吃车却看不到下一步被反杀),必须在对局面“平稳”前继续延伸搜索;二是置换表(transposition table)——用 Zobrist 哈希缓存见过的局面,同一局面从不同顺序到达时不必重算;三是开局库与残局表库(Nalimov/Syzygy tablebases)——人类千年开局智慧直接查表,残局可用完美解。此外,视频中手工调整的位置表在现代引擎里已被自对弈数据自动调参的表(如 PeSTO)取代;子力价值3/3/5/9也只是民间近似,真实引擎用的是经过数百万局校准的厘兵级数值。

有争议的外围叙事。 如果观众顺着视频去了解 AlphaZero,需要注意:2017年那次“AlphaZero 1000局中155胜6负大胜 Stockfish 8”的结果,据 Stockfish 团队当时的公开声明,比赛条件(哈希表大小、无开局库适配、时间控制)对 Stockfish 不利,存在争议;后来的复赛在更公平条件下差距明显缩小。“深度学习秒杀传统搜索”是流行叙事,但棋类引擎界的现状是两者融合——Stockfish 至今仍是 Alpha-Beta 骨架+神经网络评估的混合体,并长期位居等级分榜首。

四、认知提升:三条可以立刻带走的实操建议

1. 用一个下午亲手写井字棋Minimax。 这是把本片知识“长进肌肉”的最低成本路径:井字棋状态空间不到25万,无需求助任何库。写完你会同时内化三件事——递归的信任结构、评估函数如何塑造“性格”(评估偏进攻的AI会自杀式抢攻)、以及为什么博弈树天然适合自顶向下分解。进阶:给井字棋加Alpha-Beta,再用“先角后边”的走法排序观察剪枝数变化。

2. 学“允许吃王”的问题表示思维。 这是全片最可迁移的工程智慧:当你发现代码里堆满特判(“如果是将军则……”“如果已易位则……”),往往不是规则复杂,而是问题的表示方式让特例存在。换一种表示,特例会整体消失。同类手法:链表加哨兵头节点消灭“头节点为空”分支;用虚拟时钟统一超时与定时任务;用“任何写操作都产生新版本”简化并发控制。动手前先问一句:这个特判,是不是我建模方式制造出来的?

3. 给自己的任何技能建立“Elo式”客观反馈。 视频里AI每改一版都要和旧版对打、和更强引擎对打来量化进步——这个方法论适用于人。学习任何技能时,构造可重复的“对局”(限时编程题、模拟答辩、复盘记分),并刻意寻找比自己高约50–100分(Elo思维下的“学习区”)的对手或标准。比胜率更重要的是用统一的量化标尺追踪长期趋势,这正是卡斯帕罗夫输给机器之前,机器先教给人类的功课。

五、全片论证结构图

flowchart TD
    A[目标:让计算机下棋] --> B[第一步:实现棋规<br/>允许吃王→合法性特判消失]
    B --> C[第二步:暴力穷举博弈树]
    C -->|Shannon数≈10^120| D[结论:穷举数学上不可行]
    D --> E[第三步:Minimax<br/>假设对手永远选对我最差的应法]
    E --> F[第四步:Alpha-Beta剪枝<br/>理想排序下节点数≈开平方]
    F --> G[工程关键:走法排序决定剪枝效率]
    E --> H[第五步:评估函数<br/>子力价值+棋子位置表]
    H --> I[结果:半天代码≈俱乐部棋手]
    G --> I
    I --> J[视频之外的工业级补全<br/>静态搜索/置换表/开局库/残局表]
    J --> K[Stockfish:Alpha-Beta骨架+NNUE神经评估]
    K --> L[AlphaZero:自博弈+MCTS,评估可完全习得]
    I --> M[核心启示:搜索×评估=一切对抗性决策的通用框架]
    L --> M

延伸阅读

  1. Sebastian Lague《Coding Adventure: Ant and Slime Simulations》— 同频道姊妹篇,用群智能模拟讲“简单规则+局部交互=涌现”,与本文的“搜索+评估”构成算法之美另一极(据频道公开视频列表)。
  2. Claude Shannon《Programming a Computer for Playing Chess》(1950)— 本文溯源的原始论文,PDF可在 Chess Programming Wiki 与计算机历史博物馆网站公开获取,读完你会发现2023年的教学视频仍在严格执行它75年前的提纲。

参考来源

本文由「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学通信知识星球海报-扫码加入