重复局面不论是在真人对弈,还是象棋AI中,都要尽量避免。
确认局面重复非常简单,遍历zobrist 队列就可以了。但后续处理比较麻烦,要不同情况具体分析。
一. 在AI中
在搜索算法中,发现局面重复,首先判断重复的性质:
(1) 为了进攻而导致重复(具体又可为了捉将和捉子)
(2) 遭受攻击,为了逃避而触发重复。
(3) 无意义的废棋。
仅情况(2)被允许,其它情况予以剪裁。
二. 在对弈中
结合象棋规则,首先判断最近局面是否存在反复(存在长将或长捉的迹像)。如果局面反复,判断最后一步性质(使用第一部分中的算法),如果不属于(2),禁止着法。
三. 解将还将
AI搜索算法中一般都会采用将军延伸。仅依靠前面两部分的方法,解将还将会无休止地进行下去。解决办法是在将军延伸前做一个局面是否存在反复的判断(第二部分中的方法),如果存在,则不做延伸。
总结:
算法要在判断的准确性和运算速度上找到平衡。因为完善的判断是较为复杂的,为了提升速度,不得不牺牲一点准确度。