2024年11月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

tweet

  • tweets

« 2010年7月 | トップページ | 2010年9月 »

2010年8月

詰ますや詰まさざるや

今年の大会での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。

…とまあ、自分があれこれ試したことを書いてみましたが、はっきり言って何かとんでもなく間違ったことやってるような気がしなくもないです。誰か追試してくれたらレポート大歓迎。

GPSをソースからビルドしてみた(無謀にも)

プロトコルの件はいくつかコメントをいただきまして、こちらも少し考えております。後ほど何か書きます。

ちょっとした実験を思い立ちまして、それを試すためにGPSをビルドしてみました。だいぶ以前にたしか1回やったことあるはずなんですが全然忘れてまして、今回やったらかなりハマったのでやり方メモしておきます。(当然ですけど、Linuxですよ。)

まずは「GPS将棋」+ I'm Feeling Lucky で出てくる
http://gps.tanaka.ecc.u-tokyo.ac.jp/gpsshogi/
を見にいきます。ところがまず、ここを見てもどうやってビルドすればいいのかぱっとはわからないんですよね…というところでハマります。いろいろ探しまわるとまあ何とかわかるんですが。結論から言うと、
 ・gpsshogiとoslの2つの部分がある
 ・事前にboostとcppunitのインストールが必要
ということで、
1. boost インストール
2. cppunit インストール
3. osl ビルド
4. gpsshogi ビルド
5. スクリプトをいじって実行
という順に進めます。(1と2は逆でも可)

1. boost インストール

http://www.boost.org からソースを入手します。boost_1_43_0.tar.gz とかいう名前のファイルを解凍して、
cd path/to/boost_1_43_0
./bootstrap.sh --prefix=path/to/install
./bjam
./bjam -install
bjamって何だかわかってませんが、とにかくドキュメントに従います。そうそう、boostのドキュメントも不便で、READMEとかINSTALLとかにさくっと書いといてほしいんですが、INSTALLを見ると「index.htmlを見ろ」とかほざいてます。それ見てもぱっとわからず、更に2,3回リンクをたどらないとインストールのやり方までたどりつきません。おまけに途中わかりづらいし。なめとんのかお前は。いやつい激昂してしまいました。失礼しました。

2. cppunit インストール

これもググって http://sourceforge.net/projects/cppunit/ に取りに行くんですが、ここでDLするとなぜか cvsの*repository*のファイルが来ます。xxx,vとかいうやつ。なぜこうなる?何考えてるんでしょうかこの人たちは。頭おかしいんじゃないでしょうか。いやつい激昂してしまいました。失礼しました。暑いと怒りっぽいんです。
どうやるかというと、"view all files"をクリックして、"cppunit"を開くと各リリースのディレクトリが出ますんで、そこだと cppunit-1.12.1.tar.gz とかいうファイルがあります。
こっちはINSTALLにちゃんとやり方書いてあります。
./configure --prefix=path/to/install
make
make install
という見慣れたやり方。

ちなみにググると yum なり apt-get なりで一発インストールする方法もある雰囲気もありましたが、今回は諸般の事情でroot権限のないマシンを使っていたため、/usr/localに書けないのでboostもcppunitもソースから作ってました。

3. osl ビルド

GPS将棋のページから「使い方(ソースから)」~「osl/Install」で行ける
http://gps.tanaka.ecc.u-tokyo.ac.jp/gpsshogi/index.php?osl%2FInstall
に従うんですけれども、まずmakefile.localで何をどう選べばいいのかがまたわからないんですよね~ とりあえず私がやったのは、CPUOPTION=-fno-strict-aliasing のみ。
BOOST_POSTFIX[_MT] は消す。INCLUDES と LDFLAGS は boost と cppunit の include, libを指定。更に、Linux(RHEL)なんですが "LDLIBS += -ldl" も必要でした。memory allocator は default にしたがう。これでmake。あそうそう、LD_LIBRARY_PATHもboostとcppunitのlibを指定しました。

7/15/2010 にDLしたcvs tarballを使ったんですが、2か所ほどコンパイルでエラーに。gccは4.1.2です。
lib/search/searchTimer.cc
lib/Annotate/analyzer.cc
両方ともint(/uint64_t)とdoubleの暗黙変換関連。warningがあるとエラーでビルド止まるようです("-Werror"がそれかな?)。warningでも止まらないようにしようかとも一瞬思いましたがさすがにちょっと恐いので、ソースを見てみます。幸い両方ともちょこっとキャストすれば通りそうなところだったので、"(int)"をつけたり、"* 0.9" を "* 9 / 10"とかにして切り抜けます。(正しいのかよくわからんが)

以上で何とかビルドは通りました。

テストができるとのことなので、test/ をビルドして testAll を実行。何かいっぱい出てきます。

Failures !!!
Run: 548   Failure total: 73   Failures: 70   Errors: 3

…ま、8割以上通ってるから問題ないんでしょう。(<いいのかそれで)

>一部のテストは著作権の問題で公開できないデータに依存しているため,失敗します.

とありますし。そうですか。失敗するんですか。まあ細かいことにはこだわらずに次に進みます。

4. gpsshogi ビルド

GPS将棋のページから「使い方(ソースから)」~「gpsshogi」で行ける
http://gps.tanaka.ecc.u-tokyo.ac.jp/gpsshogi/index.php?%BB%C8%A4%A4%CA%FD%2Fgpsshogi
を見ます。
cd gpsshogi/bin     # gpsshogi/ は osl/ と同じdirに置く
make gpsshogi RELEASE=t

ここは特に問題なし。ちなみに私はもっぱらshogi-server経由で対戦するだけなので、GUIとかは目もくれません。gpsshogiだけあればおk。

5. スクリプトをいじって実行

gpsshogi/bin/scripts-for-game/ の下にいくつかスクリプトがあります。適当そうなのを選んでいじって使えばよいっぽい。私はwdoor.sh をとってきていじってました。これはenvを設定して network_x1.pl を呼ぶだけなので、わからないことがあったら network_x1.pl をみます。shogi-serverがローカルだったら"SERVER=localhost"でよさそうだな、とか適当に見当をつけて使います。

なお、以前にやってたときのうろ覚えですが、GPS将棋の時間設定はたしかGAMENAMEからとってくるんですよね。これだと不便なこともあるので、直接時間設定をするときはスクリプトをいじった記憶があります。今ぱっと見たところ、gpsshogi/bin/network/CsaClient.pm のなかの timeleft/byoyomi をセットしたんだったかな?

以上でいちおうローカルのshogi-serverと接続してGPS対ボナで対戦できました。1回だけやってボナが勝ったんですが、テストの結果とかから見ても、GPSが変に弱くなってる可能性はなきにしもあらず?

CSAプロトコルでの詰みの扱い

最近floodgateで妙にtimeupが多いなーと思ってたんですが、よくよく見ると、詰んでても詰まされた側が投了しないとWIN/LOSEでなくtimeupになるんですね。akara1cさんとか、yss4gps4とか。

CSAプロトコル読み返してみましたが、たしかに詰みになったときに即サーバから何か送る、という規定はないようです。ただ、一方

  投了、千日手ほか、対局の終了もしくは中断に至る何らかの事象が発生した場合、
  サーバは '#' で始まる文字列を2行続けて送信し、何らかの事象の発生を通知する。

という記述もあるので、詰みになったらサーバが"#TSUMI"とか送った方がいいのでは?という気もします(対局の終了に至る事象、ですよね)。クライアント側が、詰まされたら必ず%TORYOを送るべし、という考え方もありますが、一般論としてこういうのはサーバ側でハンドルすべきような気もちらほら。

現実問題としては、大方の場合は詰まされた方がtimeupで負けるので、勝敗的には問題ないといえばないんですが、後で結果を見るときハングやネットワーク切れでtimeupになったのか、詰まされて負けた(勝った)のか一見わからないのはちょっと困るような気もします。
あと私の環境だとよくネットワークが切れるので、せっかく詰まして勝っても、相手が黙ってる間にネットワークが切れてabnormalになったりするともったいないなぁ、とかも思ったり。もうちょいけちくさいことを言うと、58分くらいで詰んで、すぐ終われば00分から対局できるのに、timeupまで待ったために00分からのマッチングを逃したり、とかもありそう。

これって、プロトコルとしてはどうあるべきなんでしょうね?

« 2010年7月 | トップページ | 2010年9月 »