Stockfish perft函数运行结果矛盾的原因咨询
结果矛盾原因
你手动构造黑方走c7c5后的局面FEN时,没有按照FEN规范正确填写**吃过路兵(En Passant)**字段,导致Stockfish漏算了1个合法走法。
- 国际象棋FEN规则规定:当一方的兵从初始位置向前直走两格,落子后与相邻列的对方兵处于同一横线时,FEN的第4个字段(吃过路兵目标位)必须填写该兵移动时经过的中间格。黑兵从c7走两格到c5,中间经过c6格,因此走完
c7c5后,正确的FEN吃过路兵字段应为c6,而你手动写的FEN里该字段填的是-,等于告诉引擎当前不存在可以吃过路兵的情况。 - 黑兵走到c5后,正好对白方位于b4的王形成将军,白方所有合法走法必须满足解将要求:你手动运行perft1时列出的6个走法全是白王移动逃将的走法,遗漏的第7个合法走法正是白方b5位的兵吃过路兵走到c6、吃掉c5位的黑兵直接解将的走法。
- 你在初始局面直接跑
go perft 2时,Stockfish内部走完c7c5后会自动正确维护过路兵状态,所以统计到了包含过路兵吃子在内的7个白方合法走法,和你手动写错FEN跑出的6个结果自然不一致。
走完c7c5后的正确FEN应为8/8/3p4/1Pp4r/1K5k/5p2/4P1P1/1R6 w c6 0 2,用这个FEN跑perft1就能得到节点数为7的正确结果,和深度2的统计完全匹配。
内容的提问来源于stack exchange,提问作者Elia Giaccardi Old
相关产品推荐
相关产品推荐

