海野秀之(うんのひでゆき)の外部記憶
Twitter (twilog) / RSS / アンテナ / ぶくま
いつ思いついたのかというメモにしかならない気がしますが。 (昨日思いついて興奮したんだけど、きっと誰でも気づくな。)
Bitboard については、「チェス盤はちょうど 8x8 で 64-bit になってよさそうだけど」 程度にしか思っていなかったのですが、ちょっと気が向いて Crafty の作者が 書いている文書を読みはじめた。
そこで、はっと!
これとは別に、だいぶむかしに、容量優先最適化したら将棋盤表現はどうなるかなぁ
*1
と
考えたことがある。
まだ情報量的にコンパクトではないけど 40-byte
(しまった、こんだけでは成れない。もっと増える)
かなぁと思ったんだけど、
いかにも動かしにくそうだった。
で、棋譜 DB 向けならまだしも、ゲーム木探索向けではないだろうなぁ
くらいに思ってそのままにしてあった。
が、がが!!
これは、もっともナイーブに、メモリ無駄遣い的に実装した bitboard を、 ひょっと圧縮したような形になっているのではないかな。 (常に 1-bit だけ on になるような 81-bit bitmap の情報量は 81-bit もない!)
ひょっと圧縮したので、ひょっと元に戻るぞ。
わりかしコンパクトなので、局面同士の比較コストも小さめである。 あー、ハッシュは Zobrist hashing だとばかり思い込んでいたけど、ちょっと違うものに なるなぁ。
盤表現は 40-byte (←計算しなおさないと。このままでは 34-bit 不足してる筈。
エンコードは考え直し。),
ワークは bitboard と attack table の併用でとりあえず決めておこう。
しかし、Hyatt の文章は発見的に書かれていて、 エッセー調で、とても面白い。まだ読みはじめたばっかりだけど、全部訳しながら読もう。
訳すのはコストが掛かるのだけど、何度も読み返すときのコストが激減するのと、 条件が整ったら(著者にお伺い?)訳したものを web に置けるかなぁ。
関係ないけど、transposition table を訳すなら「移行判定表」がいいと思った (ちょっと前までは「別手順表」だと思っていた)。 まあ、「転置表」/「置換表」が誤訳であることは間違いない。 *2
おろ。bitboard でない attack table なんて要らない気がするぞ。<br>垂直データの可算器(←ちょっと意味不明)を構成すればいいのね。<br><br>並列処理効率をあげるためには<br> u32 bb[3];<br>と<br> struct {<br> u64 a;<br> u32 b;<br> }<br>の union がいいかも。<br><br>あ、独り言です。
ま、試作は Ruby で Array の attack table だけど。
さらにメモ:<br>「ハッカーのたのしみ」 5-1 にはワード中の 1 ビットの数え上げというのがある。
ビットの足しあげは、<br>・たくさん 1 があるケース<br>・1 が少ないケース<br>・1 がある方がめずらしいケース<br>で最適なコードが異なるので、試作版で統計と取っておくのが大切。<br><br>垂直データ Array だと、垂直方向のビット位置によって傾向が全然ちがうはず。