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 }

}

あとはこの配列を使って、駒毎の座標毎の利きを表現するビットパターンを作る必要が……
こういうの作るの苦手なんで疲れました。休憩