使用三角表收集将杀结尾PV招法时仅返回首招的问题排查
传统国际象棋引擎三角表收集将杀结尾PV的问题
我正在研究传统非AI国际象棋引擎的工作原理,目前尝试使用三角表收集*主变(PV)*招法,采用了N×N表及简易实现(代码如下)。将提取的PV与置换表生成的PV对比后发现:当PV不以将杀结尾时工作正常,但以将杀结尾时,三角表仅返回第一步正确招法。
我尝试多种修改均未成功,唯一有效的方法是将代码中的条件(1)从if (value > alpha)改为if (value >= alpha),但这会牺牲搜索速度,因为搜索会遍历到最后一步而非在首次发现将杀时终止。
想了解:该问题是我的实现存在缺陷,还是此方法本身无法返回将杀结尾的完整PV招法?
代码实现
private Integer alphaBeta(final int depth, int alpha, int beta) { ... pvLength[ply] = ply; ... while (move != null) { ... if (value > alpha) { // (1) dPvTable[ply][ply] = move; nextPly = ply + 1; for (int p = nextPly; p < pvLength[nextPly]; ++p) { pvTable[ply][p] = pvTable[nextPly][p]; } pvLength[ply] = pvLength[nextPly]; ... } ... } ... }
内容的提问来源于stack exchange,提问作者dakat
相关产品推荐
相关产品推荐

