詰ますや詰まさざるや
今年の大会でのBonanza Felizに関して「詰めルーチンがないのがまずいのでは」という話がいろいろ取り沙汰されていまして、某雑誌の記事にも載ったくらい。そこんとこ検証したらどうよ、ということでちょっと手を出してみました。うちも現状八割方ボナなので他人事じゃないし。
ボナに詰めルーチンを載せてみて強くなるか試す…というのはちょっと難しそうなので、現状既に詰めルーチンのあるGPSから抜いたらどうだろ、という方針で考えてみました。先日酔狂にもGPSビルドしてたのはこういう訳です。
ビルドは先日一応できたので、次はじゃあ詰みを抜こう、なんですが、ソースを見ようとしましたがどこをどう見ればよいのかさっぱりわかりません。はは、困った困った(棒読み)
なのでソースを理解しようとか分不相応なことはあっさり諦め、gprofをとってみます。gprofの出力から詰めルーチンを探そう、と画策。
gprofの出力は、知ってる人は知ってるでしょうが、関数の返り値や引数の型がわかるように出ます。普通は "void foo(int, char*)" とかいう感じになるんですが、GPSだとこうなる:
__gnu_cxx::hashtable<std::
pair<osl::hash::HashKey const, osl::search::SimpleHashRecord>, osl::hash::HashKe
y, osl::stl::hash<osl::hash::HashKey>, std::_Select1st<std::pair<osl::hash::Hash
Key const, osl::search::SimpleHashRecord> >, std::equal_to<osl::hash::HashKey>,
osl::stl::pool_allocator<osl::search::SimpleHashRecord> >::find_or_insert(std::p
air<osl::hash::HashKey const, osl::search::SimpleHashRecord> const&)
…自分どんな関数やねん一体。怒るでしかし。
怒りを抑えつつ上位から見ていって、関数名からして詰みらしいものを見つける、という方針に。ざっと見たところ
bool osl::checkmate::DualDfpn::
isWinningState<(osl::Player)-1>(int, osl::state::NumEffectState const&, osl::has
h::HashKey const&, osl::PathEncoding const&, osl::Move&, osl::Move)
というのが実行時間で1割以上使っていて、まあ一見詰みっぽそうですよねいかにも。というのでたぶんここだろうと見当をつけます。更にちょこっとだけ眺めて「trueが返れば詰みで勝ち確定なんだろう」とこれまたいいかげんに見当をつけ野性の勘で見切ります。で、この isWinningState() の頭でいきなり return false を入れます。はい改造終了。
ほんとにこんなんで動くんかね〜と思いつつ、元の版と詰み抑止(?)版で1秒自己対戦。GAMENAME任せの時間設定にすると time up の山となるので、やはりCsaClient.pmで($timeleft, $byoyomi)を(0,1)にフォースします。
…するとあら不思議、詰み抑止(?)版が 59-41 で勝ち越してしまいました。
いちおう微妙に片側5%は越えてますが、まああまり信頼できるレベルではないでしょう。ですが少なくとも、「詰みがあった方が明らかに強い」という結論にはならないような。
その後ちらちらソース見てたら #ifndef DONT_USE_CHECKMATE というのがあるのに気づき、いちおうこれも試すことに。-DDONT_USE_CHECKMATE を入れてコンパイルしますが、またエラーでこけます。
search/alphaBeta2.cc
search/quiescenceSearch2.cc
の2つ。どうやら単なるwarning (variable not used) のようなので、この2つのコンパイルは lib/Makefile で -Werror を外して(また無理やり)通します。
でこれで -DDONT... ありとなしとで1秒自己対戦で、-Dあり(=詰みなし?)が 51-38。
…とまあ、自分があれこれ試したことを書いてみましたが、はっきり言って何かとんでもなく間違ったことやってるような気がしなくもないです。誰か追試してくれたらレポート大歓迎。
最近のコメント