約五年ぶりに将棋をつくり始めた。
五年前は知識も技術も無く一回も一時予選を突破できなかったが、
この四年間、先輩に鍛えられ格段の技術アップがあった。なので、
来年の大会でなんとか一時予選を突破できるものを作りたいと思う。
先週から初めてまだまだ指し将棋ルーチンは駒得の三手読みなのだが
とりあえず詰め将棋の開発にとりかかる。
単純な深さ優先探索は二日でほぼ実装。
ただこれでは使い物にならないのでもっと
高級な詰め将棋ルーチンを入れることにした。
df-pnが今一番らしいのでとりあえず進歩4を読む。
が全く意味がわからないので、しょうがなく
証明数による詰め将棋の進歩2を読む。
例題も載っていてわかりやすい。
ただ、いまいち納得がいかない。
結局、進歩1の最良優先探索から読み始めてやっと原理を納得。
納得したので証明数を実装。
なんとか動いてそう。
ということでそのままdf-pnの仕組みを組み込もうと
再び進歩4を読む。
基本的にへっぽこプログラマの私には先人の
研究して開発したプログラムをそっくり真似ることしかできない。
ただ、前回あれほど訳がわからなかった
例題プログラムがなんとか理解できるようになった。
しかし、やっぱりわからない。
多重反復深化の子ノードを選択後の証明数と反証数の設定。
nc = SelectChild( n, φc, δc, δ2 );
φ(nc) = δ(n) + φc - Sum(n);
δ(nc) = min( φ(n), δ2+1 );
この三行。
改訳すると
SelectChildOr( &hash_pn, &hash_dn, &hash_dn2 );
child_pn = dn + hash_pn - PnSum();
child_dn = min( pn, hash_dn2+1 );
になると思うのだが
なぜchild_pn は dn をベースに加算するのか?
dn2って一体なんなのか?
せっかく証明数は理解できたと思ったのに
どうやらまだまだ理解不足のようだ。。。
確かに証明数の時でも
CN + 動的評価 を足して子供に送ってたが
どうして動的評価を加算して送らなければならないのか
いまいち理解できてない。
やはりこういうあやふやなところがあると
次に進めないんだなぁ・・・
まぁ詰め将棋を開発し初めて
5日でここまでくれば上出来だろう。
後は腰を据えてじっくり勉強するか・・・