ボナンザの定跡ファイル構造 備忘録

Bonanzaの定跡データベースはどういう構造になっているのか?
http://d.hatena.ne.jp/LS3600/20091121

ボナンザに付いてくるファイル(key.h, probe.c, readme.txt)をしっかり読んで、LS3600様の解説ブログで補完すれば楽勝でしょうが、我なりに気付いた点を少々...

Zobrist hashing
http://en.wikipedia.org/wiki/Zobrist_hashing

ハッシュ値は極めて普通の Zorbrist Hash で求まりますが、それだけでは不十分です。盤を左右反転させた状態でハッシュ値を計算して、二つの値の内小さい方が真のハッシュ値となります。(probe.c を読まずに説明書だけでコードを書いているとこの落とし穴に嵌ります...我がそうでした) この時、どちらの値(正規・反転)を使用したのか覚えておくこと。

...これは対称の局面も定跡データに収めるため(だと思います...でも大駒のお陰でなかなかその様な局面は無いのでは?...と思った)

そのあと定跡データを引っ張って来るわけですが、反転ハッシュで検索した場合定跡データも「反転」しています...よって補正が必要となります。

ここまでくれば初期盤面から以下の定跡データが読み込めます...

frequency=52306, move=[P1:FU (7,7)-(7,6) ..]
frequency=12443, move=[P1:FU (2,7)-(2,6) ..]
frequency=715, move=[P1:FU (5,7)-(5,6) ..]
frequency=23, move=[P1:FU (3,7)-(3,6) ..]
frequency=21, move=[P1:HI (2,8)-(6,8) ..]
frequency=18, move=[P1:KI (6,9)-(7,8) ..]
frequency=7, move=[P1:HI (2,8)-(7,8) ..]
frequency=2, move=[P1:OH (5,9)-(6,8) ..]

...で・す・が、先手「2六歩」と進めた状態で検索すると空振りします。ボナンザの視点は盤の下側に固定されている*ので(前後同型を処理するためでしょう)反対側のプレーヤーの飛先の歩を突いて盤を180度回転させて検索する(定跡データも「回転」しています...よって補正)と...

frequency=37201, move=[P2:fu (8,3)-(8,4) ..]
frequency=27998, move=[P2:fu (3,3)-(3,4) ..]
frequency=220, move=[P2:ki (4,1)-(3,2) ..]
frequency=58, move=[P2:hi (8,2)-(5,2) ..]
frequency=58, move=[P2:gi (7,1)-(6,2) ..]

...の定跡データが戻ってくるのでめでたしめでたし...です。

たまには役に立つこと書けた...かな?

*ボナが後手のときは盤を回転させてハッシュ値を計算します。

投稿者: 紫外線 投稿日時: 水, 08/11/2010 - 12:08 categories [ ]

コメントの表示オプション

お好みの表示方法を選択し、「設定の保存」をクリックすると、表示方法を変更することができます。

準課題終了

...しました。これで最初の数手だけはボナと同等。(笑)

週末のタスクは少々コードのお掃除です。

ボナンザの定跡読み出しテスト

データ構造上、盤面から定跡データを検索できても定跡データからは盤面は割り出せないので厳密なテストは無理です。

「擬似的」テストとして、

初期盤面から...

①定跡データから手をランダムに選ぶ
②選んだ手が合法手かチェック
③1手進める

①~③を定跡データに該当する局面が無くなるまで回します。

以上を数千~数十万回繰り返してエラーが出なかったらよろしい...とします。

次の準課題

ボナ定跡読み込み関数をUSIクライアントに組み込んで

①定跡から手を選んで「対局」する
②定跡から外れたらランダムに手を選んで対局を進行

...これで

A. 定跡読み込み挙動チェック
B. 合法手生成チェック

...です。

コメントの表示オプション

お好みの表示方法を選択し、「設定の保存」をクリックすると、表示方法を変更することができます。