daruma3940の日記

理解や文章に間違い等あればどんなことでもご指摘お願いします

久しぶりなのじぇ

f:id:daruma3940:20160520223745p:plain
はふ~~お久しぶりなのじぇ!
f:id:daruma3940:20160521003616p:plain
ほんとにひさしぶりね..
f:id:daruma3940:20160520223745p:plain
最近記事を書いていなかってけれど
プログラムのバグを取れないので息抜きに記事でも書くのじぇ。
f:id:daruma3940:20160520223530p:plain
ゆゆっ?きょうはSquirrelくんがいないね?
f:id:daruma3940:20160520223745p:plain
Squirrelくんはいま将棋の勉強中なのじぇ~~
大局観(KPP,KKP)を磨くため(機械学習するため)にここ2日ぐらいずっと勉強に励んでもらっているのじぇ~~
f:id:daruma3940:20160520223530p:plain
ひぇ~~大変だよぉ(´・ω・`)
f:id:daruma3940:20160520223745p:plain
でも多分今の学習方法では上手く行かないと思うので学習方法を変えてもう一度やり直してもらうのじぇ!
f:id:daruma3940:20160521003616p:plain
更に大変ね...
ところでまりちゃ、いまはどんなプログラムを書いてるの?
f:id:daruma3940:20160520223745p:plain
いま書いているのはUCBを用いた定跡作成のためのコードなのじぇ!
UCBって言うのの解説はここを見てほしいのじぇ!
d.hatena.ne.jp
ここで紹介されている他椀バンディット問題というのを利用してponanzaは定跡を作っているらしいのでそれをパクらせていただいて、
SquirrelではUCBを用いて定跡を作ろうということなのじぇ!!!
f:id:daruma3940:20160521003616p:plain
なるほど...ポナンザがやっている方法なのならこの方法でSquirrelくんの定跡もいい定跡を指すようになってくれるかもしれないわね!
f:id:daruma3940:20160520223745p:plain
まりちゃが思いついたアルゴリズムとしてはこうなのじぇ。

まず
指し手とUCBとその指し手を指した後のノードの情報が格納された構造体へのポインタを格納するための構造体を作る。

struct ucbMove {
double ucb;
Move move=MOVE_NONE;
Move pondermove = MOVE_NONE;
NodeInfo* next=nullptr;//次のnodeinfoへのポインタ
};

またゲーム木のノードの情報を格納するための構造体を作る。
struct NodeInfo {
vector um;//ひとつの局面に対して最大でも3つまでの定跡手を用意する。
bool is_mattan = false;//これがtrueであれば末端ノードであるのでここから探索を再開する。
NodeInfo* previous=nullptr;//一つ前のnodeのnodeinfoへのポインタ(これがnullptrであるということはrootである)
int this_arm_tried = 0;//これは過去に渡っても更新しなければならない。
string sfen_;
int depth;
NodeInfo() { um.resize(3); }

初期局面から探索を始める。
探索が終われば、探索の結果、指し手の評価値が高かった上位3つの指してを取り出して、
その3つの指し手からucBmoveを作り、NodeInfoのvector umにする。

ここでNodeInfoのumをucbが大きい順にソートする。

um[0]で局面を一手進る。
ここは新しいノードであるので新しいNodeInfoの*previousを一手進める前のNodeinfoの番地情報にして
一手進める前のnodeinfo.um[0].nextを新しいnodeInfoの番地情報にするにする。
そしてもう一度探索をして3つの指してに対してucbを計算。
そして連結リストを遡って指し手のucbを更新していく。

umはucbが大きい順に並んでいるはずであるが、先程のucbの更新で順番が壊れているところがあるはずであるのでそのノードをrootから探していく。
そのノードを見つけたら、umをucbの大きい順に並べ替えてその指し手で局面を一手すすめ、NodeInfoをその局面に合わせる。
その後そのノードは末端ノードではないかもしれないので末端ノードまで移動する。
そして次はそこから同じことを繰り返す。

f:id:daruma3940:20160520223745p:plain
アルゴリズムとしてはこれでいいはずなのじぇ。
細かい実装が出来ないのじぇ~~難しいのじぇ~~