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では、 単純な玉周辺利きだけでなく、
まで見ることが多い。
将棋では王が自ら囲いへ潜り込み、 相手は飛車・角・打ち駒を組み合わせて攻める。 そのため king safety はチェス以上に局面依存で、 単一の特徴だけでは測りにくい。
特に、
との組み合わせが重要になる。