解释
空着是只在国际象棋引擎计算内部使用的虚构停着,引擎是一种分析局面的程序。轮到走棋的一方不移动任何棋子,放弃一手让对手行动。 这种停着在真实国际象棋对局中并不合法 。它用于快速测试局面是否足够稳固。
引擎以缩减搜索进行这项测试,也就是比正常搜索少看几步。若在白送对手一手后,局面仍明显超过所需截断阈值,程序便假定至少有一步合法着法同样足够好。于是它可以停止这一分支,而不必逐一检查所有选择。
未在棋盘上出现的停着
8
7
6
5
4
3
2
a1
b
c
d
e
f
g
h
棋盘上不存在空着
局面合法,白方未被将军,并且盘上仍有足够的非兵子力。虚构的停着不会移动任何棋子;可能发生的截断取决于具体实现和具体的alpha-beta窗口,而不是图示本身。
这种剪枝能节省大量工作,但其假设并非始终成立。在 中,走棋反而有害,而允许停着会带来真实国际象棋不存在的优势。空着测试可能把一个局面判断为安全,但棋手因必须走棋实际上会输。某些少子残局中的风险更大。
对王例外
8
7
6
5
4
3
2
a1
b
c
d
e
f
g
h
双方的王在e线上相对,中间隔着 ;白方不能停着。
走棋反而使结果变差
白方在王兵残局的对王局面中必须走棋。虚构的停着不会改变棋子位置,却会把行棋权交给黑方;在固定证据中,这一变化改善了白方的WDL,从而确认这是楚茨文克。
因此,引擎会加入保护条件。王被将军时不会使用这项测试,并可能在子力很少时禁用它、采用较小的缩减幅度,或在接受截断前执行验证搜索。空着剪枝在 等框架内运行,并与其他选择性技术结合,但它本身不决定哪一步最好。
用法与背景
剪枝是指在一项测试表明某分支无法改变主要决定后,避免完整检查该分支。
常见混淆
空着与失去一手
空着是内部搜索手段。没有棋手真的失去一手,这个动作也不会出现在对局中。
剪枝与错误
这种方法有意进行选择性搜索,其保护条件和验证搜索用于控制假设可能失效的情况。
来源
- 1.Null Move Pruning, Chess Programming Wiki
