国际象棋AI(三)---评估

国际象棋评估函数设计

该 AI 主要是靠「搜索」算法来找到最优的走法,每次搜索到叶节点都需要借助评估函数来量化每个走法对我们而言的优势,从而在众多可能的走法中选择一个对自己而言最优的走法,所以评估函数直接决定了AI 着子的策略,是决定 AI 智能性的关键。

通过对国际象棋的规则以及常见的战术的研究,在项目中我们主要加入了子力评估,机动性评估,藐视因子三个方面。

子力评估

子力价值评估是指对棋盘上的其中一方的每一个棋子考虑其种类和位置,根据棋子种类的重要性与位置的优劣决定它的评估值,然后将棋盘上该方所有棋子的评估值直接累加。此类方法仅考虑每个棋子本身的属性,不关心棋子周围形势,是整个评估体系中权重最大的。

其中固定子力价值指棋子本身的存在价值,反映一种棋子的综合子力。对王设定特殊的价值——无穷大,以表明其不可失去的重要性。子力位置价值反映棋子在棋盘特定位置的攻击能力。对于同一棋子处于棋盘不同位置施加不同的奖励值或惩罚值可使局面向占据有利位置的方向发展。

本 AI 对子力评估部分的处理主要在 boardset.py 脚本中,根据传入的指示着子的 SAN 参数,剥离出着子的起点 square_src 和终点 square_dst,利用Pythonchess 库的相关方法获得起点棋子类型和终点棋子类型(如果终点有棋子)。

为了节省计算评估价值的资源,我们将当前的分值存储在字典board_info 中,在后续着子后对棋面的评估,则可以直接在前一次的棋面的基础上直接进行加-减操作,有效提高了评估的速度。

本 AI 对棋子类型对应的分值情况如下:
这里写图片描述
棋子类型对应具体位置的分值矩阵见博客底部附录1。

机动性评估

机动性反映一方所有棋子所有可行着法数目及重要性, 其计算方法是统计待评估方每个棋子的可行着法种数,乘以其着法价值,然后对所有棋子的计算值累加。

将死的特征之一是没有合理的着法。因此我们加入机动性评估,使 AI在选择着子的时候倾向于能够使着子余地更大的着子方案。但是,考虑到不惜代价试图限制对手的机动性,会让程序进行一系列漫无目的的将军,同时摧毁自己的防线。

因此需要严格控制其在评估体系中的比重,利用自博模式+互博模式的棋力测试,我们经过严谨的参数调整,最终确定了“机动性因子” 为 0.1,即在较权威的机动性奖励的基础上,取其 0.1 比重加入最终的评估价值中。

本 AI 使用的机动性奖励矩阵如下:

扫描二维码关注公众号,回复: 5046494 查看本文章
MobilityBonus =
{
"Knights": (-75, -57, -9, -2, 6, 14, 22, 29, 36),
"Bishops": (-48, -20, 16, 26, 38, 51, 55, 63, 63, 68, 81, 81, 91, 98),"Rooks": (-58, -27, -15, -10, -5, -2, 9, 16, 30, 29, 32, 38, 46
"Queens": (-39, -21, 3, 3, 14, 22, 28, 41, 43, 48, 56, 60, 60, 66, 67, 70,
71, 73, 79,88,88, 99, 102, 102, 106, 109, 113,116)
}

藐视因子

藐视因子反映国际象棋 AI 下棋的风格,如保守,均衡或冒进。利用自博模式进行严谨的测试以有效的调整该参数,在本 AI 在我方的评估价值的基础上乘以值为 0.98 的藐视因子,确定了本 AI 相对均衡的下棋风格。

附录1


POSITION_WHITE_PAWN = [\
0, 0, 0, 0, 0, 0, 0, 0,\
5, 10, 10,-20,-20, 10, 10, 5,\
5, -5,-10, 0, 0,-10, -5, 5,\
0, 0, 0, 20, 20, 0, 0, 0,\
5, 5, 10, 25, 25, 10, 5, 5,\
10, 10, 20, 30, 30, 20, 10, 10,\
50, 50, 50, 50, 50, 50, 50, 50,\
0, 0, 0, 0, 0, 0, 0, 0]

POSITION_WHITE_KNIGHT = [\
-50,-40,-30,-30,-30,-30,-40,-50,\
-40,-20, 0, 5, 5, 0,-20,-40,\
-30, 5, 10, 15, 15, 10, 5,-30,\
-30, 0, 15, 20, 20, 15, 0,-30,\
-30, 5, 15, 20, 20, 15, 5,-30,\
-30, 0, 10, 15, 15, 10, 0,-30,\
-40,-20, 0, 0, 0, 0,-20,-40,\
-50,-40,-30,-30,-30,-30,-40,-50]

POSITION_WHITE_BISHOP = [\
-20,-10,-10,-10,-10,-10,-10,-20,\
-10, 5, 0, 0, 0, 0, 5,-10,\
-10, 10, 10, 10, 10, 10, 10,-10,\
-10, 0, 10, 10, 10, 10, 0,-10,\
-10, 5, 5, 10, 10, 5, 5,-10,\
-10, 0, 5, 10, 10, 5, 0,-10,\
-10, 0, 0, 0, 0, 0, 0,-10,\
-20,-10,-10,-10,-10,-10,-10,-20]

POSITION_WHITE_ROOK = [\
0, 0, 0, 5, 5, 0, 0, 0,\
-5, 0, 0, 0, 0, 0, 0, -5,\
-5, 0, 0, 0, 0, 0, 0, -5,\
-5, 0, 0, 0, 0, 0, 0, -5,\
-5, 0, 0, 0, 0, 0, 0, -5,\
-5, 0, 0, 0, 0, 0, 0, -5,\
5, 10, 10, 10, 10, 10, 10, 5,\
0, 0, 0, 0, 0, 0, 0, 0]

POSITION_WHITE_QUEEN = [\
-20,-10,-10, -5, -5,-10,-10,-20,\
-10, 0, 5, 0, 0, 0, 0,-10,\
-10, 5, 5, 5, 5, 5, 0,-10,\
0, 0, 5, 5, 5, 5, 0, -5,\
-5, 0, 5, 5, 5, 5, 0, -5,\
-10, 0, 5, 5, 5, 5, 0,-10,\
-10, 0, 0, 0, 0, 0, 0,-10,\
-20,-10,-10, -5, -5,-10,-10,-20]

POSITION_WHITE_KING = [\
20, 30, 10, 0, 0, 10, 30, 20,\
20, 20, 0, 0, 0, 0, 20, 20,\
-10,-20,-20,-20,-20,-20,-20,-10,\
-20,-30,-30,-40,-40,-30,-30,-20,\
-30,-40,-40,-50,-50,-40,-40,-30,\
-30,-40,-40,-50,-50,-40,-40,-30,\
-30,-40,-40,-50,-50,-40,-40,-30,\
-30,-40,-40,-50,-50,-40,-40,-30]

POSITION_BLACK_PAWN = [\
0, 0, 0, 0, 0, 0, 0, 0,\
50, 50, 50, 50, 50, 50, 50, 50,\
10, 10, 20, 30, 30, 20, 10, 10,\
5, 5, 10, 25, 25, 10, 5, 5,\
0, 0, 0, 20, 20, 0, 0, 0,\
5, -5,-10, 0, 0,-10, -5, 5,\
5, 10, 10,-20,-20, 10, 10, 5,\
0, 0, 0, 0, 0, 0, 0, 0]

POSITION_BLACK_KNIGHT = [\
-50,-40,-30,-30,-30,-30,-40,-50,\
-40,-20, 0, 0, 0, 0,-20,-40,\
-30, 0, 10, 15, 15, 10, 0,-30,\
-30, 5, 15, 20, 20, 15, 5,-30,\
-30, 0, 15, 20, 20, 15, 0,-30,\
-30, 5, 10, 15, 15, 10, 5,-30,\
-40,-20, 0, 5, 5, 0,-20,-40,\
-50,-40,-30,-30,-30,-30,-40,-50]

POSITION_BLACK_BISHOP = [\
-20,-10,-10,-10,-10,-10,-10,-20,\
-10, 0, 0, 0, 0, 0, 0,-10,\-10, 0, 5, 10, 10, 5, 0,-10,\
-10, 5, 5, 10, 10, 5, 5,-10,\
-10, 0, 10, 10, 10, 10, 0,-10,\
-10, 10, 10, 10, 10, 10, 10,-10,\
-10, 5, 0, 0, 0, 0, 5,-10,\
-20,-10,-10,-10,-10,-10,-10,-20]

POSITION_BLACK_ROOK = [\
0, 0, 0, 0, 0, 0, 0, 0,\
5, 10, 10, 10, 10, 10, 10, 5,\
-5, 0, 0, 0, 0, 0, 0, -5,\
-5, 0, 0, 0, 0, 0, 0, -5,\
-5, 0, 0, 0, 0, 0, 0, -5,\
-5, 0, 0, 0, 0, 0, 0, -5,\
-5, 0, 0, 0, 0, 0, 0, -5,\
0, 0, 0, 5, 5, 0, 0, 0]

POSITION_BLACK_QUEEN = [\
-20,-10,-10, -5, -5,-10,-10,-20,\
-10, 0, 0, 0, 0, 0, 0,-10,\
-10, 0, 5, 5, 5, 5, 0,-10,\
-5, 0, 5, 5, 5, 5, 0, -5,\
0, 0, 5, 5, 5, 5, 0, -5,\
-10, 5, 5, 5, 5, 5, 0,-10,\
-10, 0, 5, 0, 0, 0, 0,-10,\
-20,-10,-10, -5, -5,-10,-10,-20]

POSITION_BLACK_KING = [\
-30,-40,-40,-50,-50,-40,-40,-30,\
-30,-40,-40,-50,-50,-40,-40,-30,\
-30,-40,-40,-50,-50,-40,-40,-30,\
-30,-40,-40,-50,-50,-40,-40,-30,\
-20,-30,-30,-40,-40,-30,-30,-20,\
-10,-20,-20,-20,-20,-20,-20,-10,\
20, 20, 0, 0, 0, 0, 20, 20,\
20, 30, 10, 0, 0, 10, 30, 20]

猜你喜欢

转载自blog.csdn.net/Tong_jy/article/details/81024172