Zugzwang

Zugzwang(ツークツワンク)は、 「手番であること自体が不利」な局面を指す。 もしパスが許されるなら有利または互角を保てるのに、 何かを指さなければならないために評価が悪化する。

概要

探索上で重要なのは、 zugzwang 局面では 「何もしない手は普通の手より悪くない」 という前提が崩れることである。

この点が特に問題になるのは Null Move Pruning である。 null move は、 「1 手パスしても局面が大きく悪化しないだろう」 という仮定に基づいているため、 zugzwang では誤判定を起こしやすい。

典型例

チェスでは駒の少ない終盤で現れやすい。 将棋でも純粋な意味での zugzwang はチェスほど典型的ではないが、

  • 一手パスなら助かるが、受けるしかない
  • 余計な手を指すと形が崩れる

といった「手番損」が問題になる局面はある。

探索器での扱い

null move を使う実装では、 zugzwang を避けるために

  • 終盤では null move を弱める
  • 駒数が少ない局面では使わない
  • 王手中や特殊局面では無効化する

といった制限を入れることが多い。

実装例

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() では、 駒数や大駒の有無などを見て保守的に判定することが多い。

将棋AIでの位置づけ

将棋では持ち駒があるため、 チェスより純粋 zugzwang は少ない。 それでも、 Null Move Pruning を安全に使うには 「どんな局面で null move の仮定が壊れるか」を知っておく必要がある。

その意味で Zugzwang は、 探索の枝刈りを理解するための重要概念である。

注意点

  • 「悪い手しかない局面」すべてが zugzwang とは限らない
  • 将棋では持ち駒の存在で性質が変わる
  • 検出を厳密にやろうとするとコストが高い

関連項目

参考にしたホームページ