一些注意
- 分值分为中局mg和残局eg,这里对于中局和残局会给予不同的评分。中局和残局的判断不在评估函数内进行(判断不是0/1的关系,中间插值处理),看到有方法是存储方式为((unsigned int)eg << 16) + mg
- 怀疑基础子力是直接存在表里的?
主要的分值
PawnValueMg = 188, PawnValueEg = 248,
KnightValueMg = 753, KnightValueEg = 832,
BishopValueMg = 826, BishopValueEg = 897,
RookValueMg = 1285, RookValueEg = 1371,
QueenValueMg = 2513, QueenValueEg = 2650,
bonus
- 每种棋子机动区域得分(可以移动到几个格子)
- NB被P保护的加分(NB是分值比较小的棋子所以在P的保护下只会被对方P威胁)
- NB下一步可以到被P保护区域的加分
- 车线上没有己方的兵(通路车)
- 被(受保护的/安全的)P攻击(因为这种情况下其他棋子只能躲避)
- 被更小的子力/被车攻击(可能因为车是直线攻击的子力最小的子)
- 被王攻击,分攻击多个和一个的情况,主要残局比较明显
- 通路兵和行号的关系,底线越近越高
- 通路兵和列号的关系,离两侧越近越安全
- 其他一堆
初始化需要
- 被攻击的所有棋子
- 被两颗棋子攻击(兵或者被两颗兵攻击不包括)
kingring也就是王的活动区域(王的位置范围加上前方的一行)
- 攻击kingRing的棋子数总和
- 攻击王的区域的棋子的加权和
- 攻击KingRing的棋子数之和(攻击多个格子则重复计算)
注
- 王的safety table,也就是对王KingRing的初始化,只需要在棋盘上子力比较大的时候进行。这里是自己棋盘上非兵的子力和大于后的时候。在子力少的时候王本身为战斗力。
- 这一些在evaluate_pieces中计算
具体计算顺序
hash table
查表
- 已有棋盘
- 已有兵形
Piece-Square Tables
棋子的价值随着时间变化
P
blockedPawns 前方有棋子或在23行的兵不参与机动性计算
evaluate_pieces
对于每个棋子计算攻击区域等
初始化被某粒棋子攻击的区域(Q要把被KBR保护的区域去掉)
这一块完成机动性的计算和对王的安全性的初始化
### B&N
1. 前哨
对于白色是456行,黑是543行
2. 在兵的后方的奖励
3. 对兵和象相同颜色的惩罚
4. 对于被关在兵前面的象的特殊处理 Chess960图案
R
- 和对方的兵在同一行/列的加分
- 全开/半开的列(应该是有/没有对方的兵?)
- 对于被王困住的罚分(特别是王不能易位)
Q
- 对后的潜在威胁的罚分
evaluate_king
王的相关计算,因为需要之前的计算来完善攻击星系来评估王的安全性
evaluate_threats
王的计算,计算王的威胁
evaluate_passed_pawns
评价过路兵,我们需要包括王在内的攻击信息
Unstoppable_pawn
如果双方只有兵,要评价可能升变的兵(unstoppable)
evaluate_space
只在开局的时候进行,尽快占据更大的空间
evaluate_initiative
要赢一边的位置潜力
evaluate_scale_factor