King Safety

King Safety は、 王の周辺がどれだけ安全かを評価する項目である。 評価関数の中でも特に重要で、 中盤の勝敗を大きく左右しやすい。

概要

一般に王の安全性は、

  • 王の周囲の歩の壁
  • 王の近くにある相手の利き
  • 開いている筋や斜線
  • 攻撃駒の数と重なり

などから見積もられる。

チェスでは castling 後の pawn shield が典型だが、 将棋では城や囲い、玉頭の厚み、飛車角の通り道などを重視することになる。

どのように数えるか

手作り評価では、たとえば

  • 王の近傍マスへの相手の利き数
  • 王周辺の自駒による防御
  • 玉頭や端攻めへの弱さ
  • 竜や馬の王周辺への侵入可能性

を加点減点する。

また、相手の駒が多く残っている中盤ほど king safety を重くし、 駒が減った終盤では比重を下げる実装が多い。

実装例

int evaluateKingSafety(const Position& pos, Color us) {
    Square kingSq = pos.kingSquare(us);
    Bitboard zone = kingZone(kingSq);

    int attackUnits = 0;
    attackUnits += popcount(pos.attacks(~us, ROOK) & zone) * 4;
    attackUnits += popcount(pos.attacks(~us, BISHOP) & zone) * 3;
    attackUnits += popcount(pos.attacks(~us, GOLD) & zone) * 2;

    int shield = pawnShieldScore(pos, us, kingSq);
    int openness = openLinePenalty(pos, us, kingSq);

    return shield - attackUnits - openness;
}

実際の将棋AIでは、 単純な玉周辺利きだけでなく、

  • 囲いの形
  • 王手のかかりやすさ
  • 詰めろ級の危険度

まで見ることが多い。

将棋AIでの位置づけ

将棋では王が自ら囲いへ潜り込み、 相手は飛車・角・打ち駒を組み合わせて攻める。 そのため king safety はチェス以上に局面依存で、 単一の特徴だけでは測りにくい。

特に、

との組み合わせが重要になる。

注意点

  • 中盤と終盤で重要度が大きく変わる
  • 材料差だけでは王の危険度を表せない
  • 王手のかかりやすさと、実際に詰むかどうかは別問題である

関連項目

参考にしたホームページ