BitBoardいいな SEEも速くなるんですかっ
http://chocobo.yasuda-u.ac.jp/~nisimura/mymove/index.cgi?no=554
>BitBoard だと SEE も比較的高速に行えるんですよね。
そうなんですか! それは初耳です。
そうか、特定の場所に利きをもってる駒が、そこにある駒をとれる候補だから。
bitBoardで素早く手を作れるのかな?
なるほどなあ。
うさぴょんさんの本ではSEEは、その位置に移動できる駒をすべてリストアップして(大駒は影の利きも)
そのリストを互いに打ち合う仕組みでした。
作るのが難しいかったので、私は毎回その場所に打てる駒を調べてます(´・ω・`)
でもSEEってうまく考えたら予めすべての組み合わせをテーブルで持てると思いませんか?
しばらく考えましたが、飛び駒がややこしいので断念しましたが、
現在の技術で将棋の必勝法は解決できないですが(天文学的数字)
SEEなら解決できるんじゃないかと思うんですが。なんとなく。
http://chocobo.yasuda-u.ac.jp/~nisimura/mymove/index.cgi?no=555
>私はハッシュ最善手の合法チェックは行っていませんけど、問題なく動作しています。
考えてみたらチェックしないでも動いて当たり前ですね(#゚Д゚)
キラームーブとごっちゃになってたです。
最後はNPSをあげるしかないと思うので、
評価関数を単純な線形和にするって方向性はよさそうですね。
うちの場合は、王手されてるか?とか利きの計算が遅いので、なんとかbitBoardしたいですが、
チェックするのが大変そうで尻込みしてます( ´Д`)
並列探索はあきらめました(弱
とりあえずbeginthreadで探索を同時にするってのはやってみたんですが、
片方が先に終わったら、残ってる方の局面を二つコピーして、終わった方に再度渡して働いてもらう。
って感じがcraftyメモかなと思ってるんですが、
選手権会場で去年うさぴょんの育ての親さんに聞いたときは、
PVノードをひたすら1CPUで検索して、他のノードは別のCPUでことだったかな?
なんにせよ柿木さんも一ヶ月ぐらい実装にかかられたようだし、うまく行っても1.4倍速にしかならないようなので、
弱い将棋ソフトが1.4倍速くなっても仕方がない……。
バグをひとつでも取る方が賢明と判断し、並列探索は諦めました。
Bitboard作るのたいへん
とりあえずこんな感じで、任意の座標のビットパターンを取得。
山下さんが試していたビット構造でまずはやってみました
(回転とか考えるともっと効率の良い方法があるらしいけど、とりあえず)
山下さんのメモより
各bitの割り当ては下のようにしてます。 9 8 7 6 5 4 3 2 1 333333333 0 1 2 3 4 5 6 7 8 一 333333332 9 10 11 12 13 14 15 16 17 二 222222222 18 19 20 21 22 23 24 25 26 三 222222222 27 28 29 30 31 32 33 34 35 四 222222222 36 37 38 39 40 41 42 43 44 五 222211111 45 46 47 48 49 50 51 52 53 六 111111111 54 55 56 57 58 59 60 61 62 七 111111111 63 64 65 66 67 68 69 70 71 八 111111111 72 73 74 75 76 77 78 79 80 九 a3 a2 a1 xxxxxxxxxxxxxxx33333333333333333 22222222222222222222222222222222 11111111111111111111111111111111 0123456789abcdef0123456789abcdef 0123456789abcdef0123456789abcdef 0123456789abcdef0123456789abcdef
printf("unsigned long a[9][9][3]={\n"); for(int y=0;y<=8;y++) { for(int x=0;x<=8;x++) { unsigned long temp=0x80000000; printf("{ "); if( (x+y*9)<=16 ) { printf("0x%08x ,",temp>>((x+y*9))+15 ); printf("0x00000000 ,"); printf("0x00000000 },"); } else if( (x+y*9)<=48 ) { printf("0x00000000 ,"); printf("0x%08x ,",temp>>((x+y*9)-17) ); printf("0x00000000 },"); } else { printf("0x00000000 ,"); printf("0x00000000 ,"); printf("0x%08x },",temp>>((x+y*9)-17) ); } printf("\n"); } }
出力結果
unsigned long a[9][9][3]={ { 0x00010000 ,0x00000000 ,0x00000000 }, { 0x00008000 ,0x00000000 ,0x00000000 }, { 0x00004000 ,0x00000000 ,0x00000000 }, { 0x00002000 ,0x00000000 ,0x00000000 }, ……中略…… { 0x00000000 ,0x00000000 ,0x00000008 }, { 0x00000000 ,0x00000000 ,0x00000004 }, { 0x00000000 ,0x00000000 ,0x00000002 }, { 0x00000000 ,0x00000000 ,0x00000001 } }
あとはこの配列を使って、駒毎の座標毎の利きを表現するビットパターンを作る必要が……
こういうの作るの苦手なんで疲れました。休憩