资讯详情

计算机博弈入门:从博弈树搜索到评估函数的设计

📅 2026/10/17 23:35:12 | 华诺云谱 👁 阅读
计算机博弈入门:从博弈树搜索到评估函数的设计
简介一份聚焦计算机博弈竞赛的辅导课件适合参加博弈类竞赛的学生、指导教师以及入门研究者使用。内容来自东北大学机器博弈研究室围绕棋类介绍与分类、计算机博弈基本原理、软件构成、棋局评估、博弈树展开与分析、基于搜索的方法学特点及学科关系展开并具体讲解中国象棋、国际象棋、围棋、五子棋、六子棋以及一字棋、二虎棋、三通棋、点格棋、苏拉卡尔塔、亚马逊、华容道等棋类的棋盘规格、行棋规则和博弈特点能够帮助读者快速建立计算机博弈的整体知识框架。资源共1个文件为PPT演示文稿压缩包约2.57MB便于直接浏览或在课堂讲解中引用。目前已有329人学习下载尤其适合作为赛前系统辅导、课程入门教学和自学梳理的轻量资料。1. 计算机博弈到底是什么不是“电脑下棋”是让程序学会做决策很多人第一次听到“计算机博弈”这个词脑子里浮现的画面是“电脑下棋特别厉害能赢世界冠军”。这个印象没错但把计算机博弈等同于“会下棋的软件”就把一件很有意思的事说小了。打个比方你教一个新人下棋如果只告诉他“马走日、象走田”他顶多算是知道规则计算机博弈研究的也不是规则本身而是更深一层——怎么让程序在“规则明确、信息全透明、每一步都有多种选择”的游戏里自己找到好棋甚至形成一套通用的决策方法。棋类只是它的试验场真正研究的是决策。通俗地说计算机博弈研究的是“在一个完全公平、没有运气成分的对局里程序凭什么赢”。这正是它吸引人的地方规则越简单背后的搜索与计算越复杂棋盘越小博弈树的规模越惊人。看懂计算机博弈不只是看懂一个程序而是看懂人工智能最基础、最经典的一种思考方式。2. 博弈树与搜索程序“想棋”的底层原理2.1 完全信息动态博弈为什么棋和牌不是一回事一句话概括棋类博弈的特点棋盘上所有信息对双方完全可见你走一步、我走一步胜负只取决于决策不取决于运气。这就是“完全信息动态博弈”的含义。“完全信息”指双方都能看到当前全部局面没有暗牌、没有随机性“动态”指轮流走子、局面不断变化。牌类就不一样你手里的牌别人看不到还要靠运气摸牌属于“不完全信息动态博弈”。这个区别决定了程序的设计思路。下棋程序可以从当前局面出发把所有可能的变化列出来再计算打牌程序则必须猜测对方手里有什么还要做概率估计。所以棋类博弈被当作人工智能研究的“干净实验场”——规则简单、状态明确问题全集中在“怎么搜索、怎么评估”上。棋类自己的差别也很大。中国象棋棋盘9×10、每方7个兵种16个棋子国际象棋棋盘8×8兵第一步能走两格、王车易位、兵升变规则细节多但逻辑仍是清晰的围棋19×19规则几乎简单到一句话就能讲完棋盘却大到无法穷举五子棋15×15已经被证明先手必胜所以竞赛里要加禁手、换手这些规则来平衡。这个谱系本身就是在告诉你计算机博弈研究的是“方法”不是某一个棋种。2.2 博弈树把一盘棋拆成一棵决策树假设你是程序面对一个棋局怎么决定下一步最简单粗暴的思路把所有可能的走法都列出来再把对手所有可能的回应也列出来然后评估每个结果的好坏。这种“如果……那么……”层层展开的结构就是博弈树。博弈树的根节点是当前局面每个分支是一种合法走法走完之后轮到对手再分叉再轮到程序……就像一棵不断长高长宽的树。叶子节点是终局赢、输、和程序要做的是从叶子往回推判断根部哪个分支最优。这棵树有多大国际象棋平均每个局面约有30种合法走法每走一步双方数量就翻一次围棋平均每个局面有200多种选择。想全遍历计算量是指数级爆炸于是就有了搜索算法和剪枝技术。2.3 搜索与剪枝程序是怎么“想”的搜索算法的核心是“深度优先遍历博弈树”先沿一条分支走到底评估叶子节点再回溯换另一条分支。配上极小极大minimax逻辑程序走棋时取最大值对自己最有利对手回应时取最小值对程序最不利交替向下。这个逻辑保证了“如果双方都下最优着法程序至少不输”。但光靠极小极大树太大根本搜不完。于是出现了alpha-beta剪枝搜索过程中发现某条分支已经不可能比当前已知结果更优就直接剪掉不再深入。# alpha-beta 剪枝的核心逻辑伪代码 def alphabeta(node, depth, alpha, beta, maximizing): if depth 0 or node.is_terminal(): return evaluate(node) if maximizing: # 轮到程序走取最大值 value -infinity for move in node.moves(): value max(value, alphabeta(node.play(move), depth-1, alpha, beta, False)) alpha max(alpha, value) # 更新已知最优 if beta alpha: # 对手不可能接受这个结果 break # 剪掉剩下的分支 return value else: # 轮到对手走取最小值 value infinity for move in node.moves(): value min(value, alphabeta(node.play(move), depth-1, alpha, beta, True)) beta min(beta, value) if beta alpha: break return value这段伪代码背后是“剪枝不改变结果只省时间”。alpha记录程序方已经保证的下限beta记录对手已经保证的上限当两者交叉时再怎么搜也改变不了结论。搜索顺序很关键好的排序能先找到强分支剪枝效果显著相同的搜索时间下能多看好几层棋。2.4 为什么“基于搜索”是方法学的主旋律计算机博弈的方法学特点就是“基于搜索”。不是说机器学习没用而是搜索构成了博弈程序的基本骨架无论评估函数多高级、开局库多丰富最终决策都落在搜索上。为什么棋类特别适合搜索因为它满足三个条件规则封闭、状态可枚举、胜负标准明确。这三个条件让“暴力穷举 聪明剪枝”成为可行策略。相比之下真实世界的决策问题往往信息不全、规则开放很难直接套用博弈树。这也是计算机博弈“看起来简单、做起来有深度的”的原因——它是纯决策问题的理想模型。3. 软件四件套一个博弈程序是怎样搭起来的3.1 界面层最不“智能”的部分一个完整的计算机博弈软件不只有“会想棋”的核心摆在最外面的是用户界面。对于竞赛和学术研究来说界面不是重点但却是必要的地基没有界面你没法直观看到程序怎么走棋、也没法手动摆局测试。界面层通常包含棋盘绘制、棋子渲染、走子交互、棋局回放这类功能。在竞赛程序里界面层应该尽量轻量——把资源留给搜索和评估。很多参赛作品的失误就出在这界面做得花哨核心搜索却浅得可怜一上场比赛就被打穿。界面和核心的分离很重要。成熟的博弈程序会把“棋局状态表示”和“界面显示”解耦界面只管画逻辑只管算。让你可以随时换一套皮肤、改一个棋盘样式而不影响走棋引擎。3.2 棋局表示棋盘在内存里长什么样程序要“想棋”首先得把棋盘存进内存。最常用的办法是数组中国象棋用9×10的二维数组国际象棋8×8围棋19×19。每个格子存一个值——空、本方棋子、对方棋子。# 棋盘表示的简化示例0空1本方2对方 board [ [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 0, 0], # 本方的棋子 [0, 0, 2, 0, 0], # 对方的棋子 [0, 0, 0, 0, 0], ]这种表示看起来很简单但要注意走的不是“棋子”而是“棋子在棋盘上的坐标变换”。每次走子都要完成三步判断目标格是否合法、更新源格和目标格的值、更新棋盘状态。性能敏感的程序还会用位棋盘把一个棋子的所有可能位置编码成一个整数来加速判断但对学习者来说二维数组已经足够建立认知。棋局表示之所以重要是因为它决定了搜索的速度。搜索要反复模拟走子、撤销走子每次都要读写棋盘数据。表示方式越高效单位时间内能搜索的局面越多棋力也就越高。3.3 搜索与评估程序的大脑搜索和评估是博弈程序的真正核心前面的界面和棋盘表示都是后勤。搜索模块负责“看多远”从当前局面出发向下计算若干步的所有变化。评估模块负责“看得准”对一个搜到的局面打分判断谁占优势、优势有多大。二者配合程序才能回答“下一步走什么”。可以这样理解搜索是广度上的扩张评估是深度上的判断。没有搜索程序只能看见眼前一步没有评估搜到再深的局面也不知道好坏。竞赛中常见的胜负手也常在这两个模块的平衡上——搜索深度提高了评估太粗糙会导致“看得远但看错”评估精细了搜索来不及展开又会“看得准但不够远”。3.4 从走子到填子不同棋类的编程差异前面提到棋类按走法分三类走子类开局前摆好开局后轮流走动、填子类开局前盘面无子开局后轮流放子、混合类先放后走。这个分类直接影响程序的结构。走子类的代表是象棋、国际象棋核心在生成合法走法——每个棋子按规则能往哪里走填子类的代表是围棋、五子棋、点格棋核心在判断落子合法性——哪些格子还能放子混合类的代表是五道棋、日本将棋既要点位又要考虑移动状态转换复杂得多。竞赛辅导资料里之所以花大量篇幅讲棋类分类不是因为要你学会下每一种棋而是让人意识到换一个棋种程序要改的不只是规则还有整套数据结构的设计思路。比如写五子棋程序你不需要复杂的走法生成但要处理好“禁手”判定写点格棋程序你得关注“死格”“双环”“长链”这些局部结构它们直接影响搜索策略的选择。4. 评估与展开程序如何判断“这步值不值得走”4.1 评估函数让程序知道“现在谁占优”搜索负责“展开”评估负责“打分”。评估函数是博弈程序的“直觉”它接收一个棋局状态输出一个数值正数代表程序占优负数代表对方占优零代表均势。评估函数不是玄学而是把人类经验翻译成数值规则。以国际象棋为例一个经典的评估方式是把子力值相加兵1马3象3车5后9。程序数一数双方剩余棋子的分数就能大致判断谁有物质优势。棋子国际象棋子力值说明兵1价值基准马3短距离跳跃攻击象3长距离斜线攻击车5横竖长距离攻击后9车象威力最大但只算子力远远不够。同样是两个车一个在角落、一个控制了中心线实际价值差很远。所以评估函数还会加上位置分、机动性分、兵形结构分等。真正的评估函数通常是“加权求和”总得分 子力分 × 权重 位置分 × 权重 其他。4.2 棋局评估的层次从数棋子到看结构评估不是越复杂越好。初学者常犯的错是把几十个特征全塞进去结果程序“想得太多反而糊涂”。好的评估函数讲层次第一层是物质分数棋子永远是最稳定的指标第二层是位置分判断棋子的活跃程度比如马在棋盘中心比在角落更有价值第三层是结构分判断兵形、控制力、威胁关系这层最接近人类棋感也最难计算。对中国象棋来说评估还要加上规则约束60步不吃子判和——如果程序发现走向和棋对自己不利就要避免对围棋来说贴目规则先手要贴5到7目直接影响评估的基准值——程序必须知道“执黑几目算赢”。评估函数在竞赛里决定了程序的下限。搜索深度决定上限但前提是评估不瞎打分。血泪经验是一个简单可靠的评估函数永远好过一个复杂但不可控的评估函数。你的程序可以看得很远但如果每一层的判断都偏差一点叠加起来就是灾难性的。4.3 博弈树展开深度、宽度与时间的博弈博弈树展开就是“模拟未来”。每展开一层局面数量按分支因子倍增计算时间也在加倍。这时候必须做取舍搜得深看到的未来更远但每层都有大量局面要评估搜得宽同层考虑的变化更多样但深度必然受限。实际程序里通常会设一个搜索深度上限比如8层然后用迭代加深的方式控制时间先在1层深度搜索接着2层、4层、8层时间不够就返回上一层结果。这样做的好处是程序在任意时间点停止都能给出当前最深的搜索结果——就像考试时间快结束时即使没做完也要把已做的部分交上去。还有一个细节是“水平线效应“。搜索固定深度时程序可能看不到深度线之后的威胁比如“再走两步就会被将军”发生在搜索深度之外。缓解方法包括扩展关键分支的搜索深度或者牺牲一点速度换取关键线路上的更深入探索。4.4 剪枝之外开局库和残局库竞赛程序不完全是“现场思考”还会做预计算。开局库和残局库就是两种“记忆型”加速。开局库储存常见开局变化和推荐走法程序开局阶段直接查表不经搜索——既省时间又避开前几步的海量展开。残局库储存残局局面的精确结果利用预先计算的结论直接判定胜、负、和。二者都体现同一个思想把计算和预判分开能背的先背下来到比赛时只算真正需要算的部分。这也能解释为什么计算机博弈“基于搜索而不是全用搜索”——搜索是发动机但燃料里掺了知识。5. 常见误区与易混概念这些说法别再搞混了5.1 误区一计算机博弈 深度学习深度学习确实是如今AI的明星但计算机博弈的经典方法——博弈树搜索、alpha-beta剪枝、评估函数——跟深度学习是两个路线。前者依靠显式的搜索和规则评估每一步都可解释后者依靠神经网络从大量对局数据里学“直觉”。为什么容易混因为媒体报道中“AI下棋赢了人类”常把不同技术混在一起说。实际上传统搜索在规则明确、变化可控的棋类里依然高效深度神经网络只是后来在围棋等超大搜索空间的场景里才成为主角。竞赛中很多强队用的还是“搜索 良好评估”而不是非得上深度学习。区分方法很简单看程序回答“为什么走这步”的方式。搜索型程序能展开出候选变化供人检查学习型程序则像一个黑匣子给个局面直接吐出一个走法。前者讲道理后者讲经验。5.2 误区二评估函数越复杂越好评估函数要覆盖局面特征但复杂不等于精准。评估项目太多会引入噪声权重难调程序运行也变慢。而且特征之间容易互相抵消——加了大量相关性高的特征评估效果不升反降。为什么有人会这么想因为人下棋时考虑的因素确实很多感觉“想得全面”才能赢。但程序不是人它靠搜索多纵深地看局面。一个简洁而稳定的评估函数配合更深的搜索往往比花哨的复杂评估更可靠。竞赛里常见这种情况队伍花大量时间设计几十个评估特征比赛时却被一个评估特征只有五六个的对手按在地上磨。因为对方用省下的算力搜索更深看到了更远的胜负手。判断评估函数好坏的标准不是“特征多”而是“对棋局的反映准不准”。5.3 误区三搜索深度越深棋力一定越强搜索深度加深看的变化更多棋力通常上升但这不是无条件的。评估函数有误差时搜索越深、误差累积越多反而可能把好棋判成坏棋。更隐蔽的问题是“视野变窄”。深度优先搜索会沿一条线走到底深度加深意味着把更多算力集中在这条线的前端对分支较宽的局面的覆盖反而可能下降。像围棋这种分支因子大的棋单纯加深搜索深度走不远必须配合评估质量的提升。正确理解是搜索深度和评估精度是跷跷板的两端要按棋种特性找平衡点。对国际象棋这种分支因子约30的棋加深深度很划算对围棋这种分支因子200的棋搜索深度提升很慢评估模块的改进才是关键。5.4 误区四计算机博弈就是“背棋谱”有些初学者以为强的博弈程序是靠记住大量大师棋谱获胜的。实际上开局库只是辅助程序在中盘和后盘几乎全靠即时搜索——它每一步都在现场计算而不是从记忆里调取。为什么会有这种印象因为人类棋手确实靠打谱学棋而且程序在开局阶段看起来走得和大师棋谱一样。但程序这样做只是因为开局库告诉它“这些变化已经被验证过不需要重新算”一旦出了开局它的思路立刻切换到搜索模式。围棋程序那种“看似灵机一动”的着法尤其让人误以为它是从棋谱中学来的。其实对超大规模搜索空间棋谱覆盖不了亿万种变化程序必须原创——它靠的是评估函数给局面的打分和搜索从深处返回的胜负判断。5.5 误区五竞赛就是比谁的硬件跑得快硬件确实影响搜索速度但不是决定因素。竞赛里真正拉开差距的是算法效率和工程质量剪枝是否充分、走法排序是否合理、评估函数是否有区分度、代码有没有冗余计算。见过不少队伍用着高端设备程序却因为评估函数写得低效或者剪枝顺序混乱速度被翻倍碾压。反观一些作品代码精简、搜索顺序经过精心设计普通电脑上就能打出很深的搜索层数。硬件只是赛道算法才是发动机工程是把发动机装好的手艺。这也是为什么某高校机器博弈研究室的教学讲义会把“软件构成”和“棋局评估”放在和“搜索算法”同样重要的位置——因为竞赛比的不是单点能力而是整套体系的配合。6. 什么时候学、什么时候别用这份资料的适用边界6.1 适合谁、什么时候学如果你是计算机专业的在校生还没碰过博弈编程这门课很适合作为“人工智能入门的第一站”。它不需要高深的数学基础理解博弈树和评估函数只需要基本的编程能力做完一个简单的棋类程序你对“搜索”“状态空间”“评估设计”都会有直观感受这些能力能平移到很多AI方向上。它尤其适合准备参加博弈竞赛的人。竞赛的节奏和小项目不一样规则要背熟、程序要在有限时间内跑完、要研究对手可能的局型。这份资料里的棋类介绍章节相当于一张“对手图鉴”——每种棋的特性、复杂度、常见规则细节都列出来你就可以按比赛项目选重点去突破。6.2 什么时候别急着用如果你已经有深度学习基础想要快速做一个“会自学的棋类AI”这套资料的搜索与评估内容可能不够前沿你得去补强化学习相关的路数。这份资料的定位是“方法学基础”不是“最新算法手册”。如果你想做牌类AI比如扑克、麻将也别指望直接套用这里的思路。牌类是不完全信息博弈需要的是概率推理和对手建模和棋类的完全信息搜索是两套方法论。入门阶段最忌两头都不扎实搜索没学透就急着上深度学习评估函数没调好就抱怨“玄学”。建议跟着资料把流程走一遍——先手写一个简单的评估搜索程序哪怕棋力很弱也能理解整个体系是怎么运转的。6.3 一份资料怎么带你跑通完整流程这套辅导资料的编排顺序暗含一条完整路径先从棋类分类看懂研究对象再理解博弈树和搜索的原理接着拆分软件结构最后落到评估和展开这两个核心技术点上。跟着这个顺序走你能形成一条清晰的认知链目标是什么在完全信息博弈里做决策、手段是什么博弈树搜索评估、怎么组织成一个软件界面、表示、搜索、评估四大模块、比赛中靠什么赢搜索深度、评估质量、剪枝效率三者的平衡。我当时第一次接触竞赛辅导资料时以为难点在算法本身结果最卡的反而是“把棋局正确地表示出来”——棋盘数据结构没设计好后面一切都像是用漏水的桶装水。从那以后我每次被新的博弈问题困扰都强制自己回到棋盘表示和评估函数这两个地基上先把它们做扎实再谈搜索优化。希望这份资料的“原理→方法→实践”结构也能让你少走一圈弯路直接站在一个能看清全局的位置上把每一局棋里的决策逻辑真正看懂。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑