Zugzwang(ツークツワンク)は、 「手番であること自体が不利」な局面を指す。 もしパスが許されるなら有利または互角を保てるのに、 何かを指さなければならないために評価が悪化する。
探索上で重要なのは、 zugzwang 局面では 「何もしない手は普通の手より悪くない」 という前提が崩れることである。
この点が特に問題になるのは Null Move Pruning である。 null move は、 「1 手パスしても局面が大きく悪化しないだろう」 という仮定に基づいているため、 zugzwang では誤判定を起こしやすい。
チェスでは駒の少ない終盤で現れやすい。 将棋でも純粋な意味での zugzwang はチェスほど典型的ではないが、
といった「手番損」が問題になる局面はある。
null move を使う実装では、 zugzwang を避けるために
といった制限を入れることが多い。
bool allowNullMove(const Position& pos, int depth) {
if (depth < 3) return false;
if (inCheck(pos)) return false;
if (isLikelyZugzwangEndgame(pos)) return false;
return true;
}
isLikelyZugzwangEndgame() では、
駒数や大駒の有無などを見て保守的に判定することが多い。
将棋では持ち駒があるため、 チェスより純粋 zugzwang は少ない。 それでも、 Null Move Pruning を安全に使うには 「どんな局面で null move の仮定が壊れるか」を知っておく必要がある。
その意味で Zugzwang は、 探索の枝刈りを理解するための重要概念である。