3.4 传统手工评估函数
搜索负责往前看,评估负责看懂眼前。国象因为搜不到终局,评估几乎就是棋力的全部。这一节写国象的“棋感”——它比五子棋的棋型更复杂,但骨架很清晰:先算子力,再算位置,最后加几样讲究。写完你也会看到它的天花板,这正好引出下一节的 NNUE。
一、评估的两大支柱:子力价值 + 位置表
第一支柱是子力(material)——这是国象独有、五子棋没有的维度。每种棋子值多少,有一套公认的近似分:
兵 = 1 马 = 3 象 = 3 车 = 5 后 = 9 王 = ∞(丢了就输)
把“我方子力总和 − 对方子力总和”一算,就有了评估的大头。光这一项,引擎就已经懂得“别白丢子、能吃就吃赚的”。
第二支柱是位置——子力位置表(Piece-Square Table, PST)。同样一个子,待在不同格子价值不同:马跳到棋盘中心能控制 8 个方向(好),缩在角落只能控制 2 个(差);兵越靠近升变底线越值钱。于是给每种棋子配一张 64 格的位置分表,查表即可。两者合起来就是评估骨架:
PIECE_VALUE = {PAWN: 100, KNIGHT: 320, BISHOP: 330, ROOK: 500, QUEEN: 900}
def evaluate(board):
score = 0
for sq, piece in board.pieces():
v = PIECE_VALUE[piece.type] + PST[piece.type][sq] # 子力 + 位置分
score += v if piece.is_white else -v # 我方加、对方减
return score # 正=白占优,负=黑占优(和前两章 ±1 编码一脉相承)
注意末尾的正负号约定——和前两章 ±1 编码一个道理:白占优为正、黑占优为负,正好喂给 α-β 的极大/极小。一套思想,三个棋种通用。
二、再加几样“讲究”:王安全、兵形、机动性
子力 + 位置已经能下得有模有样,但离“懂棋”还差一些只有内行才在意的东西。强引擎的手工评估通常还会加上:
- 王安全(king safety):开局中局里,王周围有没有己方兵保护、有没有被对方火力笼罩。王不安全,分要扣。
- 兵形(pawn structure):叠兵、孤兵、过路兵……兵的结构是国象的“地形”,深刻影响局势。
- 机动性(mobility):你的子整体能走的合法步数——子力活跃、四通八达,通常就占优。
每加一项,就给总分添一个加权的修正。你会发现这越来越像 2.3 五子棋评估的思路:把“懂棋的人在意什么”一条条量化成分数,加权求和。区别只在国象要量化的东西多得多、也微妙得多。
三、反思:手工评估的天花板,和那个老问题
写到这儿你大概也累了——而这正是手工评估的痛点:项越加越多,权重越调越玄。王安全该给多少分?它和子力怎么平衡?这些权重之间相互纠缠,靠人手调既费劲又很难调到最优;而且我们想不到的棋理,引擎永远学不会。
这个困境,是不是很耳熟?它和第二章 2.6 末尾一模一样:手工评估的上限,被人类的认知死死卡住。当年五子棋我们的出路是 AlphaZero;国象这边,主流引擎给出了另一个更适合“评估 + α-β”框架的答案——NNUE:用一个能高速增量更新的神经网络,把评估函数整个学出来。它正是当今最强引擎 Stockfish 的核心。
四、小结与下一节
- 子力:兵1/马象3/车5/后9,子力差是评估大头(国象独有维度)。
- 位置表 PST:同一子在不同格价值不同,查 64 格表累加。
- 讲究项:王安全、兵形、机动性,加权修正——本质同 2.3 的“量化棋理、加权求和”。
- 天花板:手工权重难调、受限于人类认知 → 引出 NNUE。
下一节 3.5 NNUE 神经网络评估(进阶),我们看 Stockfish 怎么用一个“快到能塞进 CPU α-β”的神经网络,把这个手工评估彻底取代——并在你的 5070 Ti 上训练它。