本将棋 内藤九段将棋秘伝 (FC) 攻略/解析

Published on: 2022-01-21

思考エンジン

思考エンジンの大まかな処理の流れは以下の通り:

また、手数などに基づく「進行度」が思考に影響する。

以下、特に断らない限り玉位置は ルート局面での 玉位置が使われる(末端局面の評価時であっても)。

なお、局面評価などは多くの場合オーバーフローを考慮していない。

進行度

進行度の初期値は 0 で、最大値は 3 である。ただし、実際には 1 以上の進行度は全て同じ意味になる。
進行度が 0 のとき、探索による思考の後に定跡手が検討される可能性がある。つまり進行度は定跡を使うかどうかのフラグ(0:true, 非0:false)と考えてよい。

思考エンジンは、通常の手数とは別に「進行度管理用手数」を持つ。これは開始局面での初期値は 0 で、1 手ごとに 1 増える(ただし最大 100)。
プレイヤーが着手を行った後、進行度管理用手数が 51 以上ならば進行度が 1 増え(ただし最大 2)、71 以上ならば進行度が 3 になる。
進行度管理用手数そのものも思考に影響する。

ルート局面評価

ルート局面の評価項目は以下の通り:

power の手数補正は以下の通り:

ルート局面の最大駒得価値が 30 以上の場合、プレイヤーが自殺手を指したと判定し、探索による思考をスキップする(玉の価値は 40 で、他の駒の価値は全て 30 未満であることに注意)。
これはほとんどの場合プレイヤーの負けになるが、ごく稀な例外もある(後述)。

探索による思考

基本深さ 1 の探索を行う(プレイヤー玉の詰み判定を行う場合のみ深さ 2)。
候補手の集合はルート局面における全ての疑似合法手となる。疑似合法手には自殺手および打ち歩詰めが含まれるが、打ち歩詰めはプレイヤー玉の詰み判定の際に除外される。なお、千日手判定は行わない。

全ての候補手を生成し、各候補手を適用した末端局面を評価し、その評価を現在の最善手と比較して最善手を更新していく。
初期状態では最善手が存在しないので、最善手の評価として最も悪いものを割り当てておく(これは自殺手扱いになるので、最終的に最善手が存在しない場合はプレイヤーの勝ちになる)。

末端局面評価

末端局面評価は 2 段階に分かれている。第 1 段階で簡易評価を行い、第 2 段階で諸々の要素を加味した補正を行う。

一部の候補手は第 1 段階で却下される(最善手との比較が行われない)。

末端局面評価 第 1 段階

以下の項目を評価する:

また、以下の条件を全て満たすとき、プレイヤー玉の詰み判定を行う:

詰み判定の際、打ち歩詰めと判定されたらその候補手は却下される。
プレイヤー玉が正当な詰みと判定された場合、それより後の候補手は生成しない。また、現在の候補手に以下の補正をかける:

また、王手対応(最大駒損価値が 30 以上)や詰ます手を除き、駒捨ての候補手は却下する。
具体的には、移動先が駒損マスで、かつ駒取りでない手は駒捨てとみなされる。
これは 合法手があっても投了してしまう現象 の一因となっている。

末端局面評価 第 2 段階

第 1 段階で得られた評価に対し、以下の補正を行う:

候補手と最善手の比較

まず、候補手と最善手のいずれか一方のみが自殺手ならば自殺手でない方を採用する:

次に、総駒損価値の大小により場合分けして判定を行う(末端局面の駒損マスは「今取られる駒」なので、「次に取れる駒」である駒得マスより重要と考えられる):

ここまでで決着しなかった場合、タイブレーク処理を行う:

定跡処理と最終的な指し手決定

まず、以下の条件を全て満たす場合はここまでの思考結果によらず定跡処理(後述)を行う:

(これはプレイヤーが自殺手を指した場合にも適用されるため、王手放置ができてしまうバグ の原因となっている)

そうでない場合、まず対局終了判定を行う:

そして、以下の条件を全て満たすとき定跡処理を行う:

定跡処理

定跡は戦型別に定義されており、プレイヤーの特定の指し手への対応を定める「定跡分岐」と、序盤の手順を定める「定跡手順」からなる。
定跡分岐は具体的な応手または戦型変更のいずれかである。
戦型が変わらない限り、定跡分岐/定跡手順のいずれについても、一度定跡処理で返した手は二度と使われない。

まず定跡分岐処理を行う。直前のプレイヤーの指し手に対応するエントリがある場合、それが具体的な応手ならば定跡手として返す。戦型変更の場合、戦型を変更して定跡分岐処理を最初からやり直す。

定跡分岐処理でエントリが見つからなかった場合、定跡手順処理を行う。定跡手順内に未使用の指し手があれば、最初のものを定跡手として返す。

定跡手順内の指し手が全て使用済みならば定跡を抜ける(戦型を「なし」に変更し、進行度を 1 にする)。

以上の処理で定跡手が返された場合、それを実際に採用するかどうかのテストを行う(このテストに失敗しても定跡手は使用済みとなる):

このテストを通ったら定跡手を採用し、さもなくば探索による思考で得られた最善手を採用する。