思うだけで学ばない日記 2.0

思うだけで学ばない日記から移転しました☆!よろしくお願いします。

反復深化に向かって

αβ探索(またはdf-pn探索)において枝のカットを効率よく行うには子ノードの列挙順序が重要だ。
特に反復深化させる場合、第k回目の反復において深度d毎にαβ幅極小だった子ノードを記憶しておいて、第k+1回の探索(最大深度を第k回より増す)で深度dに達したとき、(どうせ同じ親ノードに真っ先にたどりつくから)さっきの子ノードを最初に調べると効率がいい。この記憶と判断を0〜前回(第k回)の最大深度の各深度毎に行うとする。

αβ幅極小ノードが変動したときは?

最大深度を増した探索の結果、αβ幅極小だった子ノードが変動することがある。この場合は最新の極小ノードが最初、前の極小ノードがその次に探索されるようにするといい、、ような気がするが禿げしく違う気もする、、

実現方法

深度ごとに盤の空きセル*1のスキャンオーダーを記憶する(仮にスキャンオーダーマップと呼ぶ)。
記憶形式は、int(4 Byte)の1次元配列(要素数 = 総セル数 = 盤の縦サイズ×盤の横サイズ)。
配列要素の中身は次の通りとする。

  • [i][j][prv][nxt] (4 Byte)

ここで、

(i,j)
対応するセルの座標(行と列)
prv
前要素のインデックス
nxt
次要素のインデックス

最初にスキャンする要素をint* p_startで保持する。
要素同士は(prvとnxtによる)双方向リンクでつなぐ。(最後の要素と最初の要素もつないで全体を循環させる。)
で、αβ幅極小ノードを生じたら、それに対応するスキャンオーダー要素のリンクを繋ぎ変えてp_startが指すスキャンオーダー要素の直前に移動(挿入)後、p_startをその要素を指すように変更する実装とした。
どうなんだろ…?(←調べろよ

ふとオモタ

反復深化中の極小ノードの入れ替わり頻度を水平線の手がかりとする手法はアリなのだろうか…、、

ふとオモタ(2)

話は戻るが、df-pn探索を、相手の必至証明でなく自己の必至警戒目的で使う手法はアリなのだろうか…、、
(自己の手番において、相手の想定される最善手+αについて、詰みが反証されることを確かめる。詰みと判定されたら手を変える。)
相手の可能な合法手を全数検査しないと無意味?評価関数上最善とは程遠い手でひっくり返されることがそんなに有り得る?のか?
しかしまあ、世の中にはdf-pnなど一切用いずに強い思考ルーチンもあるからぬ、、(BonanzaとかBonanzaとかBonanzaとか、
過度に依存するほどのこともないのか、、

*1:五目並べの場合。