#はじめに
この記事は Stockfish(ストックフィッシュ)の局面評価方法を解説します.
Stockfish はオープンソースチェスエンジンの一つです.AlphaZero の論文でも比較対象として用いられており,最も強力なチェスエンジンの一つと言えます.Stockfish の思考方法を理解し,実践すれば,みなさんも今日からチェスの名人のはず(?)です.
本稿はプログラムの読み方を知らない or 読みたくないチェスプレイヤーを対象として想定しています.
なお,本稿では分かりやすさを重視し,ごく稀なケースでしか適応されないルールは省略することがあります.正確な挙動とコードを知りたい場合はソースコードを直接見てください.
本稿では,まず Stockfish の基本を説明します.そして,基本で出てきた各要素について説明していくという構成でいきます.
#基本
###評価値とは
Stockfish は探索したそれぞれの局面について,その時点での良し悪しを評価し,数値的に表します.この数値を評価値と言います.
正確には,最終的な評価値は,その局面から派生しうる局面をユーザから与えられた制限時間内でできる限り先まで探索し,Minimax 法
によって辿った先にある局面の評価値が採用されます.Minimax 法は非常に直感的で,自分は評価値が最大になるよう,対戦相手は評価値が最小になるよう手を選択していく仮定に基づいた戦略です.非常に簡単ですぐに理解できるので,少し勉強してから続きを読み進めると良いと思います.
また,チェックメイト,ステイルメイト,50手ルール,テーブルデータベースの局面など,絶対的に形勢判断できる場合はその時点でそれに応じた評価値となります.
###評価値の単位
Stockfish の評価値は centipawn
というものを基本単位としてスコア化します.100 centipawn は 概ね1ポーン分の価値です.
チェスプレイヤーの多くはマテリアル1ポイント分という表現を使っていると思います.
###評価概要
評価値の算出は2段階で行われます.
#####スコア
1段階目で,局面を点数化します.この結果は内部的にスコア
と呼称されます.スコアは,局面が中盤だった場合(中盤スコア)と終盤だった場合(終盤スコア)の2つが個別に計算されます.
この意義は,キングが中央にいることは中盤はマイナス要素ですが,終盤ではプラス要素である例を思い浮かべると理解しやすいと思います.
スコアは以下の要素をそれぞれ個別に点数化し,単純に足し合わせて求められます.
- piece squrare-table(駒とその位置)
- imbalance(マテリアルの不均衡さ)
- contempt(引き分けを避けることへの意欲)
- ポーン価値の補正
- 駒の利き(オープンファイルの支配力など)
- mobility(駒の動きやすさ)
- キングの安全性
- threat (脅威)
- パスポーンの強さ
- space (空間の広さ)
- initiative (盤面の主導権)
ちなみに,piece squrare-table, imbalance, contempt, ポーン価値の補正の4つを足し合わせて 1500 centipawn 以上の差がある時は,それ以外の要素は評価に加えません.これは形勢が明らかなケースの計算を軽くすることで,より多くの探索を行うためです.
#####ゲームフェーズ
2段階目で,スコアにゲームフェーズ(中盤〜終盤のどの地点か)による補正をします.終盤に近づけば近づく程,終盤スコアが最終的な評価値(バリュー)に大きな影響を与えるようになります.
ゲームフェーズはポーン以外の駒の数を基本として計算され,その値に応じて中盤スコアと終盤スコアを重み付け平均して求められます.
#piece square-table
これは,駒は駒自身の価値と,その配置によって決定されるという仮定に基づいた評価軸です.以下の計算方法で点数が求められます
駒スコア = 駒自身の価値 + 駒の位置によるボーナス \\
最終スコア = 盤上の自駒スコア合計 - 盤上の相手駒スコア合計
駒自身の価値は以下の通りです.
中盤 | 終盤 | |
---|---|---|
pawn | 142 | 207 |
knight | 784 | 868 |
bishop | 828 | 916 |
rook | 1286 | 1378 |
queen | 2528 | 2698 |
king | 0 | 0 |
駒の位置によるボーナスは以下のとおりです. ちなみに,全て左右対称となっています.
- ポーン(中盤)
a | b | c | d | e | f | g | h | |
---|---|---|---|---|---|---|---|---|
8 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
7 | -4 | 20 | -8 | -4 | -4 | -8 | 20 | -4 |
6 | -6 | -8 | -6 | -2 | -2 | -6 | -8 | -6 |
5 | -6 | 5 | 3 | 21 | 21 | 3 | 5 | -6 |
4 | -17 | -9 | 20 | 35 | 35 | 20 | -9 | -17 |
3 | -18 | -2 | 19 | 24 | 24 | 19 | -2 | -18 |
2 | -11 | 6 | 7 | 3 | 3 | 7 | 6 | -11 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
- ポーン(終盤)
a | b | c | d | e | f | g | h | |
---|---|---|---|---|---|---|---|---|
8 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
7 | 3 | -9 | 1 | 18 | 18 | 1 | -9 | 3 |
6 | 8 | -5 | 2 | 4 | 4 | 2 | -5 | 8 |
5 | 8 | 9 | 7 | -6 | -6 | 7 | 9 | 8 |
4 | 3 | 3 | -8 | -3 | -3 | -8 | 3 | 3 |
3 | -4 | -5 | 5 | 4 | 4 | 5 | -5 | -4 |
2 | 7 | -4 | 8 | -2 | -2 | 8 | -4 | 7 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
- ナイト(中盤)
a | b | c | d | e | f | g | h | |
---|---|---|---|---|---|---|---|---|
8 | -195 | -67 | -42 | -29 | -29 | -42 | -67 | -195 |
7 | -63 | -19 | 5 | 14 | 14 | 5 | -19 | -63 |
6 | -11 | 37 | 56 | 65 | 65 | 56 | 37 | -11 |
5 | -26 | 16 | 38 | 50 | 50 | 38 | 16 | -26 |
4 | -25 | 18 | 43 | 47 | 47 | 43 | 18 | -25 |
3 | -71 | -22 | 0 | 9 | 9 | 0 | -22 | -71 |
2 | -83 | -43 | -21 | -10 | -10 | -21 | -43 | -83 |
1 | -161 | -96 | -80 | -73 | -73 | -80 | -96 | -161 |
- ナイト(終盤)
a | b | c | d | e | f | g | h | |
---|---|---|---|---|---|---|---|---|
8 | -109 | -89 | -50 | -13 | -13 | -50 | -89 | -109 |
7 | -65 | -50 | -24 | 13 | 13 | -24 | -50 | -65 |
6 | -54 | -38 | -7 | 27 | 27 | -7 | -38 | -54 |
5 | -46 | -25 | 3 | 40 | 40 | 3 | -25 | -46 |
4 | -41 | -25 | 6 | 38 | 38 | 6 | -25 | -41 |
3 | -50 | -39 | -7 | 28 | 28 | -7 | -39 | -50 |
2 | -69 | -54 | -17 | 9 | 9 | -17 | -54 | -69 |
1 | -105 | -82 | -46 | -14 | -14 | -46 | -82 | -105 |
- ビショップ(中盤)
a | b | c | d | e | f | g | h | |
---|---|---|---|---|---|---|---|---|
8 | -35 | -11 | -19 | -29 | -29 | -19 | -11 | -35 |
7 | -23 | 17 | 6 | -2 | -2 | 6 | 17 | -23 |
6 | -17 | 16 | 12 | 2 | 2 | 12 | 16 | -17 |
5 | -11 | 27 | 16 | 9 | 9 | 16 | 27 | -11 |
4 | -11 | 28 | 21 | 10 | 10 | 21 | 28 | -11 |
3 | -9 | 27 | 21 | 11 | 11 | 21 | 27 | -9 |
2 | -20 | 20 | 12 | 1 | 1 | 12 | 20 | -20 |
1 | -44 | -13 | -25 | -34 | -34 | -25 | -13 | -44 |
- ビショップ(終盤)
a | b | c | d | e | f | g | h | |
---|---|---|---|---|---|---|---|---|
8 | -55 | -32 | -36 | -17 | -17 | -36 | -32 | -55 |
7 | -34 | -10 | -12 | 6 | 6 | -12 | -10 | -34 |
6 | -24 | -2 | 0 | 13 | 13 | 0 | -2 | -24 |
5 | -26 | -4 | -7 | 14 | 14 | -7 | -4 | -26 |
4 | -26 | -3 | -5 | 16 | 16 | -5 | -3 | -26 |
3 | -23 | 0 | -3 | 16 | 16 | -3 | 0 | -23 |
2 | -34 | -9 | -14 | 4 | 4 | -14 | -9 | -34 |
1 | -58 | -31 | -37 | -19 | -19 | -37 | -31 | -58 |
- ルック(中盤)
a | b | c | d | e | f | g | h | |
---|---|---|---|---|---|---|---|---|
8 | -23 | -15 | -11 | -5 | -5 | -11 | -15 | -23 |
7 | -12 | 4 | 8 | 12 | 12 | 8 | 4 | -12 |
6 | -21 | -7 | 0 | 2 | 2 | 0 | -7 | -21 |
5 | -22 | -7 | 0 | 1 | 1 | 0 | -7 | -22 |
4 | -22 | -6 | -1 | 2 | 2 | -1 | -6 | -22 |
3 | -21 | -9 | -4 | 2 | 2 | -4 | -9 | -21 |
2 | -21 | -8 | -3 | 0 | 0 | -3 | -8 | -21 |
1 | -25 | -16 | -16 | -9 | -9 | -16 | -16 | -25 |
- ルック(終盤)
a | b | c | d | e | f | g | h | |
---|---|---|---|---|---|---|---|---|
8 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
7 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
- クイーン(中盤)
a | b | c | d | e | f | g | h | |
---|---|---|---|---|---|---|---|---|
8 | -1 | -4 | -1 | 0 | 0 | -1 | -4 | -1 |
7 | -2 | 7 | 7 | 6 | 6 | 7 | 7 | -2 |
6 | -2 | 6 | 8 | 10 | 10 | 8 | 6 | -2 |
5 | -3 | 9 | 8 | 7 | 7 | 8 | 9 | -3 |
4 | -1 | 8 | 10 | 7 | 7 | 10 | 8 | -1 |
3 | -2 | 6 | 9 | 9 | 9 | 9 | 6 | -2 |
2 | -4 | 6 | 9 | 8 | 8 | 9 | 6 | -4 |
1 | 0 | -4 | -3 | -1 | -1 | -3 | -4 | 0 |
- クイーン(終盤)
a | b | c | d | e | f | g | h | |
---|---|---|---|---|---|---|---|---|
8 | -74 | -55 | -43 | -30 | -30 | -43 | -55 | -74 |
7 | -55 | -30 | -21 | -6 | -6 | -21 | -30 | -55 |
6 | -40 | -16 | -10 | 3 | 3 | -10 | -16 | -40 |
5 | -27 | -5 | 10 | 21 | 21 | 10 | -5 | -27 |
4 | -29 | -5 | 9 | 19 | 19 | 9 | -5 | -29 |
3 | -39 | -17 | -8 | 5 | 5 | -8 | -17 | -39 |
2 | -56 | -30 | -21 | -5 | -5 | -21 | -30 | -56 |
1 | -71 | -56 | -42 | -29 | -29 | -42 | -56 | -71 |
- キング(中盤)
a | b | c | d | e | f | g | h | |
---|---|---|---|---|---|---|---|---|
8 | 64 | 87 | 49 | 0 | 0 | 49 | 87 | 64 |
7 | 87 | 120 | 64 | 25 | 25 | 64 | 120 | 87 |
6 | 122 | 159 | 85 | 36 | 36 | 85 | 159 | 122 |
5 | 145 | 176 | 112 | 69 | 69 | 112 | 176 | 145 |
4 | 169 | 191 | 136 | 108 | 108 | 136 | 191 | 169 |
3 | 198 | 253 | 168 | 120 | 120 | 168 | 253 | 198 |
2 | 277 | 305 | 241 | 183 | 183 | 241 | 305 | 277 |
1 | 272 | 325 | 273 | 190 | 190 | 273 | 325 | 272 |
- キング(終盤)
a | b | c | d | e | f | g | h | |
---|---|---|---|---|---|---|---|---|
8 | 5 | 60 | 75 | 75 | 75 | 75 | 60 | 5 |
7 | 40 | 99 | 128 | 141 | 141 | 128 | 99 | 40 |
6 | 87 | 164 | 174 | 189 | 189 | 174 | 164 | 87 |
5 | 98 | 166 | 197 | 194 | 194 | 197 | 166 | 98 |
4 | 103 | 152 | 168 | 169 | 169 | 168 | 152 | 103 |
3 | 86 | 138 | 165 | 173 | 173 | 165 | 138 | 86 |
2 | 57 | 98 | 138 | 131 | 131 | 138 | 98 | 57 |
1 | 0 | 41 | 80 | 93 | 93 | 80 | 41 | 0 |
#imbalance
駒の不均衡さで形勢を図る方法です.imbalance は中盤終盤関係なく,同じ値です.全ての駒の組み合わせパターンを網羅し,次の計算式で求めます.
駒の不均衡スコア = 不均衡表の値 × 組み合わせ元の駒の数 × 組み合わせ相手の駒の数 \\
不均衡スコア = 自駒内の不均衡スコアの合計 + 自駒と相手駒間の不均衡スコアの合計
不均衡スコアは以下の表で求められます.ちなみに,これは Tord Romstad という方が決めた値だそうです.
- 自駒内の不均衡スコア
Bishop pair | pawn | knight | bishop | rook | queen | |
---|---|---|---|---|---|---|
Bishop pair | 1438 | 0 | 0 | 0 | 0 | 0 |
pawn | 40 | 38 | 0 | 0 | 0 | 0 |
knight | 32 | 255 | -62 | 0 | 0 | 0 |
bishop | 0 | 104 | 4 | 0 | 0 | 0 |
rook | -25 | -2 | 47 | 105 | -208 | 0 |
queen | -189 | 24 | 117 | 133 | -134 | -6 |
Bishop pair
は日本でダブルビショップ
と言われるものです.Bishop pair がある場合は,盤上に Bishop pair というピースが一つ存在するものとして考えます.
この表によると,例えばポーンはビショップよりもナイトと相性良いので,ポーンが多い場合はビショップよりもナイトの価値が高くなることがわかります.
計算例として,自駒がポーン3つ,ナイト2つ,ルック1つ(とキング)の場合を示しておきます.
この時,ポーン-ポーンが38点,ナイト-ポーンが255点,ナイト-ナイトが-62点,ルック-ポーンが-2点,ルック-ナイトが47点,ルック-ルックが-208点,その他が0点です.
よって,以下の通りになります.
ポーン-ポーン = 38 × 3 × 3 \\
ナイト-ポーン = 255 × 2 × 3 \\
ナイト-ナイト = (-62) × 2 × 2 \\
ルック-ポーン = (-2) × 1 × 3 \\
ルック-ナイト = 47 × 1 × 2 \\
ルック-ルック = (-208) × 1 × 1
自駒内の不均衡スコアの合計 = 上記の合計
- 自駒と相手駒間の不均衡スコア(縦軸が自駒,横軸が相手駒)
Bishop pair | pawn | knight | bishop | rook | queen | |
---|---|---|---|---|---|---|
Bishop pair | 0 | 0 | 0 | 0 | 0 | 0 |
pawn | 36 | 0 | 0 | 0 | 0 | 0 |
knight | 9 | 63 | 0 | 0 | 0 | 0 |
bishop | 59 | 65 | 42 | 0 | 0 | 0 |
rook | 46 | 39 | 24 | -24 | 0 | 0 |
queen | 97 | 100 | -42 | 137 | 268 | 0 |
この表によると,クイーンはナイトに対して相性が悪いことがわかります.クイーンダウンになったら,ナイトを残しておくと(少しは)良いと言えます.
#contempt
引き分けを避けるよう,評価値に補正を加えるための要素です.これはユーザがその強度をオプションで設定できるようになっています.指定されていない場合,この要素は0点です.
contempt は以下のようにまずはセットされます.
中盤の contempt = ユーザ指定の強度 / 100 \\
終盤の contempt = (ユーザ指定の強度 / 100) / 2
感覚的な説明をすると,形勢がイコールなければ,終盤への移行は評価値的にマイナスとなります.
更に,1手進むごとに以下の通り更新されていきます.
新しい contempt = contempt + 88 × 前局面の評価値 / (前局面の評価値の絶対値 + 200)
#ポーン価値の補正
ポーンの状態によって,スコアに補正が加えられます.これは以下の要素によって決まります.
- Connectivity
- Isolated (孤立ポーンか)
- Backward (バックワードポーンか)
- Double (ダブルポーンでかつ,ポーンによって守られていない(supportではない))
Double はダブルポーンでもポーンによって守られているものは対象外であることに注意してください.
ポーン価値の補正スコアは次の式で求められます.
ポーン補正スコア = Connectivity - Isolated - Backward - Double
Connectivity 以外のスコアは以下の表の通りとなります.
中盤 | 終盤 | |
---|---|---|
Isolated | 5 | 15 |
Backward | 9 | 24 |
Double | 11 | 56 |
Contectivity は少し複雑で,次の要素によって決定されます.
- opposed (相手ポーンと向かい合っているか)
- isolated (孤立しているか)
- supported (ポーンによってサポートされているか)
- phalanx (隣にポーンがいるか)
- rank(ポーンのいる段目)
まず,rank による補正は以下の表を使います.(rank point は便利上の名前)
rank | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
rank point | 0 | 13 | 24 | 18 | 65 | 100 | 175 | 330 |
そして,以下のようにして点数otherThanSupport
を求めます.
- phalanx ではない場合,無条件で0点
- ポーンのいるランクを r ,r の rank point を rankPoint[r] とする.
- otherThanSupport を以下の式により求める.
otherThanSupoort = (rankPoint[r] + rankPoint[r + 1]) / 2
- opposed の時,otherThanSupport を半分にする.
最後に,以下の式によって自分の盤上のポーンそれぞれのConnectivityスコアが求められます.
Connectivity スコア(中盤) = サポートしてくれているポーンの数 × 17 + otherThanSupport \\
Connectivity スコア(終盤) = Connectivity スコア(中盤) × (r - 2) / 4
最後の中盤用のポイントから終盤用のポイントへの変換は,終盤では進んでいないポーンの価値が低いこと,そもそもポーンの強さが局面評価に与える影響が小さくなることを意味しています.
なお,パスポーンの評価はこの評価軸には含めず,独立した別の要素(パスポーンの強さ)として評価されます.
#まとめ
本稿では Stockfish の基本,piece squrare-table, imbalance, contempt, ポーン価値の補正について説明しました.
これだけでも,駒得しか指標がない方には,良い勉強となるのではないでしょうか?
この時点で1500 centipawn 以上の差がついていれば一方の形勢良いと Stockfish は断言しますが,多くの場合は更に細かく他の要素を評価に加えていく必要があります.
これ以外の要素として,オープンファイルを取ったらどれぐらいの価値があるのか,x-ray 攻撃(例えば,自ルックと相手クイーンの間に他の駒があってもルックがクイーンを攻撃しているとみなす)はどれぐらい評価値を上げるのか等,説明していない要素が多くあります.やる気と時間ができたら続きの解説もしたいと思います.
#参考文献
https://github.com/official-stockfish/Stockfish
https://www.chessprogramming.org/Main_Page
https://www.webcyou.com/?p=6997