バグ?
つれづれなるままにボナソースを読んでいますが、ちょっと気になる点があったのでメモ。
hash.cのhash_store()の以下の部分ですが、
1 if ( hand_hash != HAND_B
2 && keyt_hash != ( word2 & ~(uint64_t)0x2fU ) )
3 {
4 slot = (unsigned int)hash_word2 >> 31;
5 SignKey( hash_word2, hash_word1 );
6 ptrans_table[index].always[slot].word1 = hash_word1;
7 ptrans_table[index].always[slot].word2 = hash_word2;
8 }
9 SignKey( word2, word1 );
10 ptrans_table[index].prefer.word1 = word1;
11 ptrans_table[index].prefer.word2 = word2;
探索結果をpreferに書く(10,11)んだけど、今のpreferの内容はalwaysにコピーする。ただし、書こうとしている結果が今のpreferと同じ局面に対するもの(より深い探索結果)ならalwaysへのコピーはしない、ってことだろうと思うんですが、
もしそうなら、if条件(1,2)でhandのチェックは不要、というかやらない方がいいんじゃないでしょうか?keyが違えば盤面が別なので、handが同じかは意味ないと思うんですが。
盤面が同じでhandが違う、という場合は書くべきかどうか微妙な気はしますが、そうしたいならばif条件は&&ではなくて||ですよね。
見てるのはv4.1.2ですが、v4.1.3でも変わってないようです。
ということでたぶんバグなんじゃないかなぁ?という気がしてはいるのですが、なにしろあのボナンザなので、私が何か勘違いしてるのかも?という気もしないでもないです^^;
まあここを変えてもそうドラスティックに強さ変わるわけではないとは思いますが、「盤面異なるが持ち駒は同じ」局面群に対してはpreferしか使わないことになるので、そこそこ発生するような気はします。
それにしても、なんでボナンザってコメントないんでしょうか?w 深まる謎がぜんぜん解決しない…
« インサイド・ボンクラーズ | トップページ | Amazon EC2からfloodgateなう »
「将棋プロセサ」カテゴリの記事
- ボンクラーズの開発過程について書いた記事が掲載されました(2019.03.07)
- 「浅い評価値を深い評価値に近づける学習法」誕生の背景(2016.10.06)
- 塚田九段の対ボンクラーズ練習棋譜を公開します(2013.09.07)
- Puella α ソース公開(2013.08.28)
- クラスタ並列の解説記事を公開します(2013.08.22)
A級様、
間違えていました、&& ではなく || です。あと、
今読んでみると何故 ~0x2fU と論理積を取っているのかも謎です。
今までずっと気づかなかったということは、A 級さんの仰るように、そもそもやらない方が良いかもしれません><
発見してくださり有難うございます!
投稿: hoki | 2010年2月15日 (月) 16時14分
コメントありがとうございます。
疑問が解決して、こちらこそ助かりました。
0x2fはそう言われると謎ですが、まったく気づかなかったです^^;
あと今更ですが、ボナ使わせてもらってます。その面でもほんとお世話になっておりますです。
投稿: A級 | 2010年2月15日 (月) 22時32分
不明な点があればどんどん教えてください。
恐らくバグや不必要なコードがまだまだあると思います、教えて下さると助かります。
A級さんの、他人の実装を極力利用してオリジナルの成果を出そうという姿勢が好きです。ガンバって下さい!
投稿: hoki | 2010年2月16日 (火) 00時02分
そう言っていただけると大変心強く、また励みになります。独力での解決に窮したらお言葉に甘えて何かお聞きするかもしれません。今後ともよろしくお願い致しますm(__)m
投稿: A級 | 2010年2月16日 (火) 19時36分