它如何思考
暗棋以自己独特的方式隐藏信息:每枚棋子起初都背面朝下,翻开一枚,就会从剩下的棋子里随机翻出一枚。因此和国际象棋不同,引擎的搜索树里既有普通着法,也有随机事件。MistyBanqi 把翻子当作一个概率节点,对这枚棋子可能翻出的各种身份取加权平均;其余部分则像经典国际象棋引擎那样搜索:向前推演双方可能走的着法,再把最佳一路的价值回传上来。
它做不到的是凭感觉判断局面。这棵搜索树的每个叶子节点,都由一套手写的评估来打分:基于一张修正过的子力价值表的子力(炮靠隔子吃,是盘面上最危险的棋子)、每枚棋子控制多少格、将帅有多暴露,以及另外一些项。引擎的水平完全取决于这些项的好坏——下面要讲的弱点正源于此。
大多数时候,它会赢
MistyBanqi 能赢过大多数人,而它取胜的方式正是经典引擎的方式:往前算上好几步的吃子。逐步回放下面这盘它把对手清光的棋。暗棋的局势随翻子起伏,这盘里它开局甚至一度子力落后,随后一步步扳了回来,直到对手没有棋子可走。每枚棋子第一次被翻开时,会翻出它所发到的身份。
这种一子一子算下去的计算,是它棋力强的那一半。盲点是另一半:当胜利不再需要吃子、只需要耐心时,会发生什么。
它会把赢定的棋下成和棋
同样这个引擎,下面处在一个它已经完全赢定的局面。它以十子对两子领先,已经没有子可吃,唯一要做的就是把胜势走到底。结果它却下成了和棋。
评估里没有任何一项会因为「把优势转化为胜利」而比「单纯守住子力」给更高的分,于是一个遥遥领先的局面和一个真正已经赢下的局面,得分几乎一样。既然没有哪一项促使它取得进展,它就只是来回挪子,而暗棋的三次重复局面规则便把这盘判成和棋。
这对你有个实用的启示。如果你子力落后,并不一定就输了:用长捉缠住它的一枚大子,MistyBanqi 可能就一头走进那个它看不出自己本该拒绝的和棋。
它也可能丢掉自己的将帅
另一个相关的盲点和将帅有关。只有兵(卒)能吃将帅,而当将帅被逼到角落时,引擎迟迟不为它腾出退路。有时它会把一枚棋子调到棋盘另一头,任由一枚孤零零的敌方兵走上来把将帅困死。这和上面的和棋是同一类毛病:评估对一个缓慢、安静、还要好几步才成形的威胁,没有真正的感觉。
这些问题各自是如何被发现、复现并量化的,下面链接的工程博客文章里有详细记录。
为什么会有这些问题,以及下一步
这些是手写评估的局限:它只能给有人想到要编码进去的东西打分,而「把胜势转化为胜利」和「缓慢围猎将帅」恰恰是那种很难写成规则的长程判断。最强的暗棋程序采用的解法,是一套从对局胜负中学习得到的评估,让引擎能自己判断这些。这也是 MistyBanqi 终将迈出的下一步。在学习版于测试中越过现有引擎这道门槛之前,你面对的仍是手写版:强,且对自己会在哪里出问题保持坦诚。
来下一盘
MistyBanqi 已在 Mistboard 上线。来按你选择的强度挑战它,或阅读它如何被构建与衡量的完整记录。