当前位置: 首页 > 工具软件 > Stockfish > 使用案例 >

【国象AI】评估函数(二)StockFish 分值设定

丌官招
2023-12-01

一些注意

  1. 分值分为中局mg和残局eg,这里对于中局和残局会给予不同的评分。中局和残局的判断不在评估函数内进行(判断不是0/1的关系,中间插值处理),看到有方法是存储方式为((unsigned int)eg << 16) + mg
  2. 怀疑基础子力是直接存在表里的?

主要的分值

PawnValueMg = 188, PawnValueEg = 248,
KnightValueMg = 753, KnightValueEg = 832,
BishopValueMg = 826, BishopValueEg = 897,
RookValueMg = 1285, RookValueEg = 1371,
QueenValueMg = 2513, QueenValueEg = 2650,

bonus

  1. 每种棋子机动区域得分(可以移动到几个格子)
  2. NB被P保护的加分(NB是分值比较小的棋子所以在P的保护下只会被对方P威胁)
  3. NB下一步可以到被P保护区域的加分
  4. 车线上没有己方的兵(通路车)
  5. 被(受保护的/安全的)P攻击(因为这种情况下其他棋子只能躲避)
  6. 被更小的子力/被车攻击(可能因为车是直线攻击的子力最小的子)
  7. 被王攻击,分攻击多个和一个的情况,主要残局比较明显
  8. 通路兵和行号的关系,底线越近越高
  9. 通路兵和列号的关系,离两侧越近越安全
  10. 其他一堆

初始化需要

  1. 被攻击的所有棋子
  2. 被两颗棋子攻击(兵或者被两颗兵攻击不包括)
  3. 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

  1. 和对方的兵在同一行/列的加分
  2. 全开/半开的列(应该是有/没有对方的兵?)
  3. 对于被王困住的罚分(特别是王不能易位)

Q

  1. 对后的潜在威胁的罚分

evaluate_king

王的相关计算,因为需要之前的计算来完善攻击星系来评估王的安全性

evaluate_threats

王的计算,计算王的威胁

evaluate_passed_pawns

评价过路兵,我们需要包括王在内的攻击信息

Unstoppable_pawn

如果双方只有兵,要评价可能升变的兵(unstoppable)

evaluate_space

只在开局的时候进行,尽快占据更大的空间

evaluate_initiative

要赢一边的位置潜力

evaluate_scale_factor

 类似资料: