【将棋】指手を生成するコードを生成するコード
久々に将棋ネタです。みなさんもそろそろ動き始めているようなので
クマ将棋もちょっと再開(できたらいいな(汗))
やっぱりNPSが重要ということで、高速化と並列探索をしようと思っています。
でも、局面の構造体はシンプルにしたいので、ビットボードは使いたくない。
クマ将棋の指手は大量のテーブル使って作成していたけど、これだと、やはり遅い模様。
かといって、テンプレートの使い方は良く分からない、ということで
指手を生成するコードを、テーブルの中身を全部、定数値に展開して生成するコードを作ってみた。
まだ動作は怪しいけど、上手くいきそうな感じ。
一応コード置きます。
http://navi.cs.kumamoto-u.ac.jp/~koutaki/shogi/gentest.zip
こんな感じに大量に指手生成コードを展開する。まだ、持ち駒を指す部分は作ってないけど、
現段階でコードサイズが500Kbyteくらいになった。
case KOMA_RY: if(kifu[69]<=0){ te[num++]=0x27c5; } if(kifu[71]<=0){ te[num++]=0x27c7; } if(kifu[70]<=0){ te[num++]=0x27c6; if(kifu[70]<0)break; if(kifu[61]<=0){ te[num++]=0x27bd; if(kifu[61]<0)break; if(kifu[52]<=0){ te[num++]=0x27b4; if(kifu[52]<0)break; if(kifu[43]<=0){ te[num++]=0x27ab; if(kifu[43]<0)break; if(kifu[34]<=0){ te[num++]=0x27a2;
上のコードを使うと、こんな感じで局面情報を渡すと指手が生成できる。
テーブル等の特別な構造体等は一切使わずに、関数コピペで使えるので
いろいろと便利だと思う。多分、以前よりも速度も速い。
char kifu[] = { -2 ,-3 ,-4 ,-5 ,-8 ,-5 ,-4 ,-3 ,-2 , +0 ,-7 ,+0 ,+0 , 0 ,+0 ,+0 ,-6 ,+0 , -1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 , +0 ,+0 ,+0 ,+0 ,+0 ,+0 ,+0 , 0 ,+0 , +0 ,+0 ,+0 ,+0 ,+0 ,+0 ,+0 ,+0 ,+0 , +0 ,+0 ,+0 ,+0 ,+0 ,+0 ,+0 ,+0 ,+0 , +1 ,+1 ,+1 ,+1 ,+1 ,+1 ,+1 ,+1 ,+1 , +0 ,+6 ,+0 ,+0 ,+0 ,+0 ,+0 ,+7 ,+0 , +2 ,+3 ,+4 ,+5 ,+8 ,+5 ,+4 ,+3 ,+2 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; int te[600]; int num = gmoves(kifu,te);
並列探索は選手権で保木さんに1秒指しと2秒指しでは全然勝率違うでしょ?
と言われて、なるほど、と思ったのでなんとか実装したい所。
それと3駒評価の部分でGPUを使ってみたい。できるかどうか分からないけど・・・