评估函数:怎么判断局势
搜索会在半路停下,剩下那一半靠评估函数。这篇讲清局面评估在做什么、五子棋棋形怎么打分、启发式评分什么时候会骗人,以及怎么把引擎的判断用成自己的直觉。
局面评估函数回答的是一个搜索答不上来的问题:棋局还没结束,现在谁占优?alpha-beta 剪枝负责决定读哪些变化,评估函数负责给读到的局面定价。如果你读过浏览器里的搜索是怎么跑的,这就是同一个程序的另一半。
搜索为什么必须停在半路
15 路棋盘有 225 个交叉点,完整博弈树的规模远超一个浏览器标签页能走完的量。搜索只能切在一个固定深度上,而那个深度的局面几乎从来不是胜负已分的状态,它是一盘有三四个方向同时在铺的乱局。必须有东西把这份乱局压成一个数字。
这个东西就是评估函数。它只看一条变化的终点局面,不看这条线是怎么走过来的,所以它必须便宜。一个耗时 1 毫秒的函数,在 500 毫秒预算里能被调用几十万次;耗时 10 毫秒的只能调用五万次,搜索反而变浅。这里的速度不是优化项,它直接决定引擎能想多深。
棋形打分:一份能照抄的评分表
评估函数不看局面「好不好看」,它数棋形。下面这组分值是我们五子棋引擎内部量级的简化版,单位不重要,相对大小才重要。
- 活四(两端皆空):100000。防不住,直接按胜处理。
- 活三(三子同线,两端皆空):10000。再走一步就是活四。
- 眠三(一端被堵):1000。仍是威胁,但对方来得及应。
- 活二(两端皆空):100。原材料,单独存在几乎没价值。
- 眠二(一端被堵):10。
- 交叉点:把两条线同时计分,分数通常在这里跳一档,这也是双威胁比单威胁贵得多的原因。
- 对手的棋形用同一套分值扣掉;开局阶段防守的权重会比进攻略高一点。
一个能写出来的五子棋评估函数
真正跑着的五子棋评估函数是「扫描棋形 + 求和」两件事。扫描沿四个方向(横、竖、两条斜线)滑过每一个长度为五的窗口,把窗口里的黑白子分布归类成上面那些棋形;求和把归类结果按权重加起来,再减去对手的。最后加上一个先手补偿,因为轮到谁走本身就值一点分。
写成一行就是:分数 = 我方棋形加权和 − 对方棋形加权和 + 先手补偿。它不预测未来,也不理解意图,只是把当前这盘棋上能看到的东西称一遍重量。听起来朴素,但配上足够深的搜索,它已经能在 500 毫秒内下出很难缠的棋。
启发式评分什么时候会骗人
启发式游戏评分有三个固定的失效点,知道它们比知道分值更有用。
- 地平线效应:引擎把一个输棋推到搜索深度之外,看起来暂时安全。它会选择慢输而不是立刻输,分数在深度边缘是最好看的,过了那条线就崩。
- 重复计数:一颗同时属于两条线的子会被数两次。紧凑的棋团因此比散开的棋团得分高,多数时候这个偏差是对的,但被对手从外侧封住时它就错了。
- 读不出意图:一个只有在对手漏看时才成立的棋形,会被打满分。评估函数默认对手看得见一切,也默认自己看得见一切,两边都不真。
怎么用局面分析,又不全信它
500 毫秒跑出来的局面分析是第二意见,不是判决。最有用的用法是拿它验证一个你已经有的感觉:你觉得这手不行,看分数是不是也掉了;如果分数和你相反,先找出是哪条线被算进去了,再决定听谁的。
- 先下你本来想下的那手,再看分数怎么变。反过来做,你会变成在抄答案。
- 盯住分数跳变的那一手,而不是盯着最终数字。跳变说明某个棋形成立了。
- 每局只复盘一到两个转折。全盘看分数,你什么也记不住。
FAQ
什么是局面评估函数?
引擎里负责给局面打分的那一部分。搜索在固定深度停下之后,它读取终点局面并返回一个数字,用来比较不同变化的优劣。
为什么不直接搜到分出胜负?
博弈树太大。15 路五子棋有 225 个交叉点,完整搜索的规模超过一个浏览器标签页的预算,所以只能在固定深度截断,再靠评估函数补齐。
引擎的评分能帮我提高棋力吗?
能,前提是你用它检验判断而不是替代判断。先落你自己的那一手,再在对战页上看分数变化,找出让数字跳变的那个棋形。
引擎不会告诉你为什么输,它只会告诉你数字是从哪一手开始转向的。把这个数字和你自己的判断对上,靠的是对局量:打开在线对战,不用注册,看着分数随棋形跳动。基础规则在玩法页,搜索那一半写在浏览器里的引擎里。
Related
- 开源棋盘引擎生态
2026-09-12
- 分享对局:一局棋也是一张名片
2026-08-13
- 真段位 vs 青铜白银:段位制到底在衡量什么
2026-08-12