-
King Safety king-safety
king-safety
-
-
添付ファイル
-
変更点
-
ソースを表示
-
表示
# King Safety
King Safety は、
王の周辺がどれだけ安全かを評価する項目である。
[評価関数](/shogi/shogiwiki/search/evaluation-function/)の中でも特に重要で、
中盤の勝敗を大きく左右しやすい。
## 概要
一般に王の安全性は、
- 王の周囲の[歩の壁](https://www.chessprogramming.org/King_Pattern)
- 王の近くにある相手の利き
- 開いている筋や斜線
- 攻撃駒の数と重なり
などから見積もられる。
チェスでは castling 後の pawn shield が典型だが、
将棋では城や囲い、玉頭の厚み、飛車角の通り道などを重視することになる。
## どのように数えるか
手作り評価では、たとえば
- 王の近傍マスへの相手の利き数
- 王周辺の自駒による防御
- 玉頭や端攻めへの弱さ
- 竜や馬の王周辺への侵入可能性
を加点減点する。
また、相手の駒が多く残っている中盤ほど king safety を重くし、
駒が減った終盤では比重を下げる実装が多い。
## 実装例
```cpp
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 はチェス以上に局面依存で、
単一の特徴だけでは測りにくい。
特に、
- [パターン認識](/shogi/shogiwiki/search/pattern-recognition/)
- [NNUE](/shogi/shogiwiki/search/nnue/)
- [Piece-Square Tables](/shogi/shogiwiki/search/piece-square-tables/)
との組み合わせが重要になる。
## 注意点
- 中盤と終盤で重要度が大きく変わる
- 材料差だけでは王の危険度を表せない
- 王手のかかりやすさと、実際に詰むかどうかは別問題である
## 関連項目
- [評価関数](/shogi/shogiwiki/search/evaluation-function/)
- [パターン認識](/shogi/shogiwiki/search/pattern-recognition/)
- [NNUE](/shogi/shogiwiki/search/nnue/)
- [Mobility](/shogi/shogiwiki/search/mobility/)
## 参考にしたホームページ
- [Chessprogramming Wiki: KING Safety](https://www.chessprogramming.org/King_Safety)
- [Chessprogramming Wiki: KING Pattern](https://www.chessprogramming.org/King_Pattern)
- [Chessprogramming Wiki: CPW KING](https://www.chessprogramming.org/CPW_King)
- [Chessprogramming Wiki: Evaluation Function Draft](https://www.chessprogramming.org/Evaluation_Function_Draft)