作る過程については前のエントリで書いたので、今回は内容について書く。
ソース
探索はただのアルファベータ法。反復深化と置換表(スコアのみの簡易版)は使っている。持ち駒の優劣判定も入れたけど、置換表との相性がちょっと心配。全体的に手抜き実装しかしてないけど、一応簡単に書ける範囲では速度にも気を使っている。
棋力に関係しない部分だと、USIオプションに関する処理はきっちり書いてある。
2駒関係は差分計算なし(そこまで遅くならない)。
自己対戦による学習が今回の主眼。やってることは、learn関数冒頭のコメントに書いた。自己対戦して1000局面以上溜まったら勾配を対称なやつにも分配して更新を繰り返したまに保存する。保存されたものたちの平均をとってもよい。そこそこ短く書けて動いたのでよかった。
自覚している範囲でダメだった点は、自己対戦の千日手を考えていなかったため256手までずっと千日手のスコアが学習されてたと思われること。自己対戦の並列化がいまいちで、学習する局面数も毎回違っていたので学習に悪影響がありそうだったこと。あと、上手いこと局面をばらけさせるのが存外難しいと感じた。
オプションでLearnを選ぶと詰みボタンでその局面から学習できるようにしてある(行儀は悪いな)。四間に振った局面からちょっと学習させたら▲28飛と戻す手を指したので悲しかった。