クライアントサイド版COSUMIを作ってみました

このブログ記事は、以前書いた記事の続きです。よろしければ、そちらもどうぞ。

Keras/TensorFlowでDNNな囲碁の評価関数を作ってみる
http://www.perfectsky.net/blog/?p=350

Keras/TensorFlowでDNNな囲碁の評価関数を作ってみる その2
http://www.perfectsky.net/blog/?p=380

囲碁の思考エンジンを作ってみる
http://www.perfectsky.net/blog/?p=389

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

以前から作っていた囲碁思考エンジン「white shade」を、JavaScriptに書き直してブラウザで打てるようにしてみました。COSUMIのクライアントサイド版です。

white shade – 囲碁ブラウザゲーム COSUMI
https://www.cosumi.net/whiteshade.html

今現在は9路盤しかできませんが、強さはレベル1からレベル4まで選択できるようになっています。それぞれのレベルでの強さは、一応、通常版のとできるだけ合わせましたが、通常版を手元で再現するのがちょっとめんどくさくて、なかなか完璧にはいっていません。一応、クライアントサイド版では、レベル1はGNU GoのLevel 7に勝率60%、レベル4はFuego1.1の7000playoutに勝率50%、それ以外のレベルは、1レベル違いの自己対戦の勝率が同じになるようにしていきます(これでまあだいたい通常版と同じです)。最終的には、通常版にも無いレベル7ぐらいまで行きたいですね。まだやれることはたくさんあるので、それぐらいはなんとかなりそうな気はしています。現状は、目一杯の設定で、だいたいレベル4.5ぐらい。GNU Goに一局あたり平均16目ぐらい勝てるのですが、それでも勝率は90%を辛うじて超える程度で、100%っていうのはやはりかなり大変そうですね。

レベル1では、4子までの置き碁もできるようにしました。GNU Goにこれをさせると怪しいことになるのでちょっとあれなんですが、white shadeは、どれだけ形勢が悪くても結構自然に打つので、特に問題は無さそうです。今後はもっと大きな碁盤サイズでも対局できるようにしていきますが、8路盤以下は、もうこれで許してください…

JavaScriptのDNNライブラリ(って呼んでいいのかな?)は、TensorFlow.jsを使っています。私も使えたので(笑)、たぶんそんなに難しいものではないです。元々のPython版white shadeも、GTPとかデバッグ用のコードとかもろもろ除けば、実質200行ぐらい(?)のプログラムだったので、JavaScriptに書き直すのも大した手間ではありませんでした。一番たいへんだったのは、先ほどの強さの調整ですね。きれいに弱くするということがこんなに難しいことだとは、本当に思っていませんでした。後、少し心配しているのが、JavaScript版にした時に、NNのモデルのコンバートなんかで弱くなってたりしていないかなんですが、自分が打っている限りでは、大丈夫なように見えます。JavaScript版の強さの計測は、これも今後ちょっと厄介ですね。

簡単にwhite shadeの中身についても、書いておくと、基本的に、左上から右下まで本当に全幅で1手読んでるだけですが、人の手のみを学習したPolicy Networkの出力も少しだけ加味して手を決定していて、あとは、自然に打てるように微調整ですね。レベル4が少し重いかもですが、それ以外のレベルは、ちゃんと動きさえする環境ならば、おそらくサクサクだと思います。で、問題はそのちゃんと動く動作環境なんですが、今現在、iPhone/iPadのiOS系が安定して動かないと思います(後、IEもですがこれはもう本当にどうでもいい。Androidはちょっと分かっていません)。これは結構色々調べたのですが、まず、iPad+Chromeはだめで、Mac+Safariは大丈夫なので、iOSがだめっぽいのですが、NNのモデルを小さいものに変更するとかなり安定するようになるので(ちなみに今現在、Value Networkが92万、Policy Networkが45万パラメータぐらい。本当はもっと大きなNN使いたいぐらいなのに…)、端末が非力なことが単純に問題なのかもしれません。とはいえ、とりあえず動くだけは動いて欲しいのですが… iPhoneで動かない限り、トップページからのリンクもちょっと張れません。これはまた、なんとかします。

今現在、COSUMIは年間のサーバ代(最初に掛かった初期費用は入れず)が130万ぐらい掛かっているのですが、それがこのクライアントサイド版でいつか半分ぐらいにならないかなあと、つい皮算用してしまいます。私は今、車が欲しいんです(笑)。生まれてこのかた、一度も車なんて買ったことないのですが、今猛烈に欲しいんですね。軽でいいんですけど、新車が欲しい(笑)。そのためにも、このサーバ代はなんとかしなければいけません。話変わりますが、なんかネット見ていたら、さくらインターネットからお中元が来たって方がちょくちょくいるのですが、今までに新車のポルシェ一台分ぐらい貢いだ私はもらったことがない!(笑) うー、まだ足らないのかな… おいらもチョコが食べたい。

[追記 2018/9/2]
今回は、white shadeで囲碁の対局をできるようにしたわけですが、いつかは、9路盤以下の悪手指摘機能をこれで置き換えたいですし、もっと言うと、white shade Teach作りたいですね。この場合、teachするのは、囲碁というよりも、white shadeの囲碁に対する気持ちぐらいでしかありませんが(笑)、それでも、初心者の方には、十分有益なような気がします。忙しいので当面の間は無理ですが、またいつかがんばります。

COSUMI 10周年

今日2018年5月26日で、COSUMIは開始から10周年を迎えることになりました(実は、黒嘉嘉と誕生日がいっしょなんです(笑)。あっ、先生お誕生日おめでとうございます)。

囲碁ブラウザゲーム COSUMI
https://www.cosumi.net/

10年間の総ページビューは、221,499,920(におくにせんまん…)。もう本当に訳の分からない数字ですが、個人的には、セッション数59,413,618と平均セッション時間12分22秒という2つの数字が一番やばいと思っています。単純に掛け算すると約1398年。人生80年だとすると、17.47人分ですよ!(もう怖えーよ…) そして、COSUMIは10年間通算で、40,599,753敗しました。うーん、たくさん負かされましたね。究極の目標は1億敗なんですが、いつか達成できる日が来るのでしょうか?

10年間のページビューの推移(ともろもろ)です。

基本的にCOSUMIは、非常にゆるやかな右肩上がりをずっと続けてきました。このグラフを形作っているのは、そのほとんどがCOSUMI固有の要因だと言えると思いますが、その中で、唯一といっていいほど例外的に、外部的な要因で大きくアクセス数が変動したのが、2016年3月のAlphaGo-セドル戦で、結局のところ、この10年の間に起こった、囲碁をやらない人までを巻き込んだ大きな囲碁の話題って、この時一回きりだったのだと思います。AlphaGo-柯潔戦とか、井山七冠達成とかは、ニュースバリューがほとんどなかったと見るべきでしょう。

COSUMIの今後については、現時点ではあまりはっきりしたことは言えませんが、新しい機能の追加とかはもうあまりないと思ってください。ただし、使用している囲碁の思考エンジンは、最近、急に出てきた非常に強いオープンソースのソフトや、今現在、私が作っているソフトに、部分的には置き換えられていく可能性が高いと思います。たぶん、そのあたりが今COSUMIに一番足らない部分ではないでしょうか?

そして、ここ最近、私がよく考えていることとして、「いつまでCOSUMIを続けるのか」っていうのがあるのですが、一応、最低でもあと5年は続けたいなと思っています。ただ、それ以降については、私ではなく時代が決めることなのかなという気がしています。

似たような内容のことを、このブログでも何度か書いていると思いますが、COSUMIを最初に作っていた時は、10年後、まさかこんなことになるとは、夢にも思っていませんでした。驚くほどたくさんの方に遊んでいただきましたが、一番楽しんだのは自分自身なんだということについては、よく理解しているつもりです。これも以前からの繰り返しになりますが、すばらしいソフトウェアを自由に使わせてくださっているGNU GoとFuegoの開発者の方にも、再度お礼申し上げます。そして、今までCOSUMIで遊んでくださった方々へ。10年間、本当にありがとうございました。感謝しています。

10周年にかけて、10路盤の対局ができるようにしてみました(笑)。強さはLevel 1相当です。COSUMIは黒しか持たないようになっています。これは、今だけの期間限定です。一週間ぐらいしたらまた元に戻しておきます。

[追記 2018/5/27]
セッション数と平均セッション時間を掛けた1398年という数字は、ユーザがCOSUMIを見ていてくれた延べ時間ぐらいの意味で出したのですが、実情は、おそらくそんなものではありません。古いログは解凍するのも恐ろしいので(笑)、きちんとした数字を出すのはここではやりませんが、例えば、この2週間の間にCOSUMIが打った手数が70,843,582手(+α)、同期間のページビューが1,623,460pvで、割り算すると43.6手/pvぐらいです。それに、全期間のページビューを掛けると約96.7億手(本当によく知らないけど、AlphaGoといい勝負になってない?(笑) GNU Goは軽いですね)。COSUMIでは、これに10秒掛けたのがだいたい対局時間と考えてよいので、そうなると約3065年になります。これはかなり適当な計算ですが、とはいえ、対局リプレイを見ている時間なども含まれていません。

囲碁の思考エンジンを作ってみる

このブログ記事は、以前書いた記事の続きです。できれば、まずはそちらをお読みください。

Keras/TensorFlowでDNNな囲碁の評価関数を作ってみる
http://www.perfectsky.net/blog/?p=350

Keras/TensorFlowでDNNな囲碁の評価関数を作ってみる その2
http://www.perfectsky.net/blog/?p=380

時間ができたので、以前から作っていたDNNな囲碁の評価関数を使って、囲碁の思考エンジンを作ってみました。「パスも含めて全幅で深さ1だけ読む」という単純なプログラムです。9路盤しか打てません。一応、名前も必要かと思ったので、コードネームだったのをそのまま使って、white shadeと名づけました。由来は、Procol Harumの例の曲です。特にそれ以上の深い意味はありません。ちなみにこの映像は、ちょうど今から50年前のものみたいですが、ポピュラー音楽って本当に進歩がないですね。コンピュータ囲碁は、この5年だけでもめっちゃくちゃ強くなったのに…(笑)

ということで、早速、GNU Goとの対戦を行ってみました。使用した評価関数は、BottleneckアーキテクチャになっているRes-Blockのネックの部分が、32Filterなのと48Filterなのとの2種類。共に10 Res-Block(ちなみに、32Filterはパラメータ数が210,769で、48Filterは368,529。できれば、このあたりのサイズで何とかしたい…)。それぞれ、8対称形の平均をとったのと、とらないのとの、計4種類です。対局数は、先後を換えて150局ずつ計300局。同じような対局ばかりになりがちなので、twogtpに付属していたオープニングブックを使用しています。結果は、

32Filter 106勝194敗 (勝率 35.33%)
32Filter/8対称形の平均 144勝156敗 (勝率 48.00%)
48Filter 128勝172敗 (勝率 42.67%)
48Filter/8対称形の平均 176勝124敗 (勝率 58.67%)

うーん、よくわからんけどまあこんなものかな? とりあえず、ここがスタートですね。棋譜を見ていると、序盤はかなり上手なんですが、この子どうやらアタリがよく分かってないみたいで(笑)、後半すさまじいファンタを見せてくれます。一番強い48Filterの8対称形平均版から適当に3局選んでみたので、ご覧ください。


Sorry, your browser doesn’t support WGo.js.

Sorry, your browser doesn’t support WGo.js.

Sorry, your browser doesn’t support WGo.js.

こんなのに半分以上負けるGNU Goもどうなのよって感じですが(笑)、まあ強い時は強いからしかたないか… でもって、何でこんなにアタリがわからないのかっていうと、いろいろ理由はあるんでしょうが、おそらく一番大きいのは、学習データにこういう局面があまり含まれていないからだと思います。もちろん、大石がアタリになっている局面はそれなりの数あるのですが、そのほとんどが、アタリにされている方の手番になっていて、つぐなり逃げるなりすれば大事にならないので、それで深刻なことだと学習できていない気がします。NNの入力にダメの数を入れるとか、深さ2読むとかしたら、ここまでひどいことにはたぶんならないと思いますが、そんなことしなくても評価関数だけでこれぐらいは分かってほしいですし、こんなことも分からなくて、もっと高度なことが分かるはずもないような気がするので、なんとかしたいのですが、どうするのがいいかな? 「いっぱい対局させて、それをRayに添削してもらって、酷そうな手の前後を学習データに追加していく」みたいな感じでだめかな? また少し試してみます。

9路盤での最終的な目標は、GNU Goに対して1局平均10目勝ちです(今はだいたいイーブンぐらい)。勝率はあまり気にせず、そこを目指していきたいと思っています。そこまでいけたら、ブラウザで打てるようにしたいですね。

いろいろやっている間に、Rayが出してくれる形勢判断が常に1目ずれていること(黒番の時と白番の時で向きが逆、平均すれば0。簡易的な日本ルール対策?)に気づいて、その分を修正しようとしたのですが、今度は別のところで矛盾が生じてきて絶賛混乱中です。もう一目ぐらいどうでもいいか… あと、現在、Policy Networkも作っています。Value Networkもそうですが、よくこんなのでちゃんとしたアウトプットが出てきますね… なんだか、狐につままれた気分です。

あとあと、CapsNetで囲碁やった人とかいないんでしょうか?

[追記 2018/5/6]
最近、Policy Networkを作っているのですが、学習データを普通の棋譜からランダムに切り出して使ったりすると、結構ラベルに偏りが出てくるのが気になります。ということで、囲碁で一局を通して、座標ごとにどれぐらいの回数打たれるのかっていうのを調べてみました。例えば、COSUMIの9路盤のレベル1の作り碁ならこんな感じ。一番打たれる回数の多い場所を100として、それとの割合です。

 14  29  40  52  59  52  40  29  14
 30  44  56  68  71  67  55  44  30
 40  56  76  86  88  86  75  56  41
 53  68  87  96  95  96  86  68  54
 60  73  89  95 100  95  88  73  60
 54  68  87  97  94  95  86  68  53
 41  57  76  86  87  85  75  56  41
 30  45  56  68  71  67  56  44  30
 15  31  41  53  59  52  40  30  14

そして、レベル5ではこんな感じです。

 24  48  56  67  71  67  57  48  24
 48  64  74  82  85  82  74  64  48
 57  74  89  95  97  95  89  75  57
 67  83  96  99  98  99  95  83  67
 71  86  97  99  99  98  97  86  72
 67  83  95 100  98  99  95  83  68
 57  74  89  95  96  94  88  74  56
 48  65  74  83  86  83  74  64  47
 25  48  57  67  71  67  57  48  25

どうでしょう、ちょっと不安になってきませんか?

今現在、学習に使っているデータは、COSUMIの棋譜から取って、いくつかの条件でふるいをかけたものですが、それの検証用データのラベルの合計がこちら。これを[1]とします。

 1628 2786 3627 4372 4508 4372 3627 2786 1628
 2786 4038 4507 5506 6126 5506 4507 4038 2786
 3627 4507 5296 6662 6550 6662 5296 4507 3627
 4372 5506 6662 8024 6928 8024 6662 5506 4372
 4508 6126 6550 6928 7928 6928 6550 6126 4508
 4372 5506 6662 8024 6928 8024 6662 5506 4372
 3627 4507 5296 6662 6550 6662 5296 4507 3627
 2786 4038 4507 5506 6126 5506 4507 4038 2786
 1628 2786 3627 4372 4508 4372 3627 2786 1628

そして、そのデータと同じ作り方をしている学習用データで学習したNNで、先ほどの検証用データを予測させた時の最後のsoftmaxの出力をそのまま合計したのがこちら(この数字をここで使うことが正しいのかがちょっと確信持てませんが…)。これを[2]とします。

 1584 2745 3695 4300 4598 4301 3668 2754 1594
 2735 3890 4561 5532 6039 5525 4578 3922 2746
 3678 4605 5399 6763 6706 6754 5334 4583 3663
 4272 5503 6705 7787 7231 7720 6611 5479 4303
 4623 5987 6656 7232 7764 7128 6517 5946 4598
 4308 5513 6673 7657 7236 7645 6586 5511 4306
 3756 4626 5447 6669 6662 6638 5312 4612 3694
 2820 3924 4578 5491 5972 5544 4613 3944 2766
 1609 2763 3694 4276 4583 4272 3667 2726 1592

それぞれの座標で、[2]/[1]*100したのがこちら。

  97  99 102  98 102  98 101  99  98
  98  96 101 100  99 100 102  97  99
 101 102 102 102 102 101 101 102 101
  98 100 101  97 104  96  99 100  98
 103  98 102 104  98 103 100  97 102
  99 100 100  95 104  95  99 100  98
 104 103 103 100 102 100 100 102 102
 101  97 102 100  97 101 102  98  99
  99  99 102  98 102  98 101  98  98

ほんの少しだけ、それっぽい傾向が見受けられるような気もしますが、まあこれぐらいならぜんぜんOKでしょうかね? とりあえずは気にしないことにします。

[追記 2018/5/25]
「white shadeの棋譜をRayに添削してもらって、悪手っぽいところの前後を学習データに追加して、それをもう一度学習する」ってやり方で、いきなりGNU Goに1局平均10目ぐらい勝てるようになったのですが、それってそれなりの棋力がないとできないはずだと思って実際に棋譜を眺めてみても、そこまで強そうには見えません。どうも、最後にねちねちやられてGNU Goが自爆していることが、ちょくちょくあるからみたいです。手法自体はかなり有効そうなので、目標を「1局平均20目」に変更して、現在、二周目やってます。

[追記 2018/8/29]
ブラウザで対局できるようにしてみました。続きの記事をどうぞ。

クライアントサイド版COSUMIを作ってみました
http://www.perfectsky.net/blog/?p=402

COSUMIに最大何目差で勝つことができるか? その2

[以前の関連記事] : COSUMIに最大何目差で勝つことができるか?

以前、「COSUMIに最大何目差で勝つことができるか?」という記事を書いたのですが、その時は15路盤までだったので、再度、19路盤でも調べてみました。

囲碁ブラウザゲーム COSUMI
http://www.cosumi.net/

調べたのは、直近約3ヶ月の対局のみ。まずは互先から調べてみましたが、COSUMIの石を全滅させた対局が何局かありました。その中で一番大差で勝っている対局は、夢の400目(?!)オーバーを達成されています。


Sorry, your browser doesn’t support WGo.js.

GNU Goが謎です…(地の計算も1目ずれてる(笑))

続いて、COSUMIに9子置かせた対局です。これは全滅させた対局は無いようです。それではベスト3を順に紹介していきます。まずは第3位、284目勝ち。


Sorry, your browser doesn’t support WGo.js.

最初に7回パスしているので、実質16子局(!)になっています。凄過ぎです。

次に第2位、290目勝ち。


Sorry, your browser doesn’t support WGo.js.

そして第1位、315目勝ち。


Sorry, your browser doesn’t support WGo.js.

うーん、GNU Goはもうちょっとがんばったほうがいいね(笑)。

悪手の指摘が少し正確になりました

COSUMIの5路盤~9路盤(レベル0)の対局リプレイでは、ユーザの打った悪手を指摘する時がありますが、これが少しだけ正確になりました。

オンライン囲碁ゲーム COSUMI
http://www.cosumi.net/

今までは、Fuegoに初手から調べさせて、ユーザから見たwin rateが下がったところを悪手としていました。ただ、これだと勝っている局面で、不必要な手入れをした方がいいと言うことがたびたび起こり、ちょっとみっともないことになっていました。そこで、今度からはさらにGNU Goの意見も聴くようにし、GNU Goが「確かにFuegoの指摘する手の方が得だ」と判断しないかぎり、COSUMIとしてはその手を悪手とは指摘しないようにしました(実際は、今までも今現在も、そこまで単純ではありませんが…)。

例えば、次の棋譜は実際にCOSUMIで打たれたものですが、最後に2回、自陣に手を入れろと指摘が入っています。Fuego的にはそうした方がだいぶwin rateが高くなるようですが、正しくはこれらの手は不必要な手入れであり、かなり問題のある指摘になっています。逆に、GNU Goはこういうところであまり不正確にならないので、Fuegoの主張をいい感じに却下してくれます。という訳で、今現在は、同じ棋譜の対局が行われても、悪手の指摘はしなくなっています。

[9路盤 レベル0] 黒(You)12目勝ち – オンライン囲碁ゲーム COSUMI

今回は同時に、Fuegoが悪手と判断する基準も緩くしたので、COSUMIが悪手とする回数自体はあまり変わっていないと思います。

ということで、今回の変更でなかなか良くなったのではと思っているのですが、サーバの負荷がしゃれになっていないので、これから何とかチューニングしてみます。なんだったら最後はお金の力で…(笑)

COSUMIで打たれた9路盤の棋譜を公開します

COSUMIの9路盤レベル5の対局の内、ユーザが勝った棋譜を、黒番白番それぞれ5000局ずつ、計10000局分公開します。

オンライン囲碁ゲーム COSUMI
http://www.cosumi.net/

人間が打った9路盤の棋譜を大量に入手するのは、意外と難しいように感じたので、なにかの役に立つかと思い公開することにしました。大量の棋譜をひとつのSGFファイルにまとめたら面白いかなとか、Fuego使って名局を探してみようかなとか、以前ちょっとだけ考えたことがあるんですが、なかなか腰が重くて未だできてませんので、もし誰かがやってくださるとうれしいです。もちろん、マンパワーで「COSUMI名局100選」を選出していただいても(笑)良いと思います。

今回公開する棋譜は直近の対局分なのですが、具体的にはだいたいここ20日間ぐらいの間に打たれたものになります。

http://www.perfectsky.net/misc/cosumi_9x9level5.zip

少し話は変わりますが、以前にも書いたとおり、白番よりは黒番持った方がほんの少し勝ちやすい傾向が今もあるようです。

[追記 2014/1/13]
公開した棋譜を少し眺めていたんですが、かなり頻繁にGNU Go先生が終盤でファンタしてますね(笑)。まあこれは、以前から分かってたことではあるんですが、でもこんなに多かったかなあ? ということで、少し調べてみることにしました。

COSUMIの9路盤レベル5では、まず独自のオープニングブックを使い、それが切れると38手目までFuegoが打って、その後GNU Goが終局まで打ちます(とは言っても、実際はいろいろ例外があります)。それを踏まえて次のグラフを見てください。

今回公開した棋譜の内、ユーザが黒番だった対局の、総手数が50手以上の対局(4202局)の30、34、38、42、46手目終了時点の形勢を、Fuegoを使って調べてみました。win rateが100%に近いほど黒番の人間ユーザが優勢ということになります。

まず驚くのは、34手目終了時まではやや左に偏っていることです。9路盤で34手目といえばだいぶ後の方ですが、ここから最終的には右端に張り付くんだと考えると、これはかなり特異な印象を受けます。そして、その前と比較して、38手目終了時以降は急に差が大きくなっているような気がしますので、これはやはり、GNU Go先生はファンタジスタと言わざるを得ませんね(笑)。個人的には46手目終了時のグラフを見ただけでも、ちょっと悲しくなります。30%以下からなんて、普通はそこからひっくり返らないんですが…

Fuegoにヨセを打たすとかなり不自然になるのでGNU Goを使っている訳ですが、GNU Goの手を一度FuegoでチェックしてだめそうならFuegoが打つとかは、した方がいいかもしれません。一番いいのは、GNU Goが後ほんの少しでいいので、強くなってくれることなんですが…

[追記 2014/1/14]
昨日のグラフに、10手目と20手目終了時点の形勢も調べて追加してみました。

さらに9路盤のレベル1も調べてみました。レベル5と同じくユーザが黒番で勝った直近の対局5000局の中から調べたのですが、総手数がレベル5の時より大幅に短いものが多いので(碁盤を真っ二つに分けたような分かりやすい対局が多いんです)、総手数は50手以上ではなく40手以上の対局(それでもたったの2217局しかありません)としました。ちなみに、レベル1ではまず独自のオープニングブックを使い、それが切れるとそこから終局までGNU Goが打ちます。要するに、レベル5のFuegoが打っているところをGNU Goが打つのと同じことになります。

うーん、これが普通だと思います。レベル5の方はちょっと問題がありますね…

COSUMI 5周年

COSUMIをスタートさせてから、今日で5年になります。

オンライン囲碁ゲーム COSUMI
http://www.cosumi.net/

この5年間の、1日あたりのCOSUMIが負けた数の推移はこんな感じ。

中央付近で0になっているのは震災の時に一時止めてたからで、最後のほうでぐっと伸びているのは19路盤をメインの対局ゲームに統合したからです(メインの対局ゲームの負けた数しか数えていません)。この数が増えていくのが、私にとって一番うれしいことです。なので、これからもみなさんどんどん負かしてください(笑)。トータルでは今現在4,620,131敗です。ものすごい数ですね…

当然のことながら、COSUMIが打っている手の数もものすごいことになっていて、1日あたり約1,900,000手ぐらい。平均して、79,167手/時間、1,319手/分、22手/秒(!)ぐらいになりますね。以前から漠然と思っていたのですが、今までGNU Goが生成した手(これを正確に定義するのはちょっと難しいんですが…)のほとんどは、「COSUMI上で」ではないかなと思っています。もしそうだとすれば、COSUMIは「GNU Goというすばらしいソフトを世に広めるのだ」と作り始めたサイトですので、こんなにうれしいことはありません。

COSUMIを最初に作っていたのが、本当に昨日のことのようです。もちろん、あの時は5年後にまさかこんなにたくさんの人に遊んでもらえるようになるとは思っていませんでした。どちらかというと、あの時はウェブサイトが完成しない可能性を心配していたのですが…(笑) 今まで、COSUMIで遊んでくださった方々、本当にありがとうございました。すばらしいソフトウェアをこんなに自由なライセンスで公開してくださっている、GNU GoとFuegoの開発者の方々にも改めてお礼申し上げます。あと5年はCOSUMIを続けていると思うので、その時どうなっているのか今から楽しみです。

9路盤でコンピュータの強さが選べるようになりました

COSUMIの9路盤で、レベル1からレベル4までコンピュータの強さを選べるようにしてみました。

オンライン囲碁ゲーム COSUMI
http://www.cosumi.net/

今回の変更直前の9路盤の強さは、(常に一定ではありませんでしたが)だいたいレベル3.5相当ぐらいでした。ですので、今回のレベル4は今までよりも少し強く、レベル4以下は今までよりも弱いです。将来的にはレベル5はいつか必ずできそうです。それより上はFuegoの進化しだいですね。それぞれのレベルの強さがころころ変わっては意味が無いと思うので、今後のアップデート時には、できるだけ同じ強さを維持できるように気をつけたいと思います。

一応、どのようにレベルの調整をしているかも、以下簡単に書いておきたいと思います。COSUMIの9路盤は、まず初手からCOSUMI独自のオープニングブックを使い、それが切れるとFuegoに考えさせ、そしてある一定の手数まで来るとGNU Goに考えさせていました(厳密にはもう少しややこしいことをやっていますが…)。今回はこの元々Fuegoに考えさせていた中盤を、GNU Go、Fuego 2000playout、Fuego 6000playout、Fuego 20000playoutにすることで、それぞれレベル1からレベル4の強さに調整しています。ちなみに、GNU GoとFuego 2000playout、Fuego 2000playoutとFuego 6000playout、Fuego 6000playoutとFuego 20000playoutの組み合わせで初手から終局まで丸々一局戦わせると、だいたい後者が勝率8割ぐらいになります。

COSUMIのサーバを交換しました(3回目)

昨日、COSUMIのメインのサーバを新しいのに交換しました。

オンライン囲碁ゲーム COSUMI
http://www.cosumi.net/

新しいサーバは、「さくらの専用サーバ」のエクスプレスシリーズの一番高いのです。お値段は、35,800円/月から13,800円/月に!(幸せです。いやほんとに) しかも、COSUMI的な性能はそれほど変わらないかなと思っていたのですが、新しいのは倍近く処理能力があるみたいで… 特に意外だったのは、GNU Goを同時にたくさん動かしている時に、Hyper-Threadingで4割ほど多く仕事してくれること。テストする前はゼロみたいなものだろうと思ってました。

サーバのスペックも良くなったので、少し贅沢にリソースを使うようにもしました。Fuegoのバージョンも0.4.1から1.1に変更(ずっとほったらかしだった…)。定石も少しアップデートしました。という訳で、もろもろ結構良くなっているはずです。

あと、今現在COSUMIのHTML5版を作成中です。最初は大変かなと思っていたのですが、作り始めたらそうでもなかった… とりあえず、iPhoneやiPadなどのiOS系で動くようにだけはしたいと思います。

19路盤

COSUMIで19路盤の対局もできるようにしました。

19路盤
http://www.cosumi.net/nineteen.html

COSUMIが黒番の時の初手以外は、もう完全に全部GNU Goです。正直、ローカルでお好きなGUI使ってGNU Goと対局してもらった方が何かと良いと思うので、存在意義がちょっと薄い気もしますが、まあとりあえず作ってみました。一応、この19路盤だけはサーバの負荷が高い時は対局できない仕様にさせてもらいますが、実際はたぶん基本的にいつでも動くと思います。というか、いつでも動くようにサーバを増強し続けたいと思います。

今回の19路盤の対局ゲームでは、さくらのVPSを初めて使ってみました。最近になって気づいたのですが、このサービスちょっと安過ぎではないでしょうか? 鯖をたくさん食べたければ(笑)丸ごと一匹買ってくるのが良いに決まってると思ってたのに、この小さい切り身はとってもお買い得に見えます。もし今回これでうまくいくようなら、今後はこのさくらのVPSをたくさん借りて負荷を分散させていく予定です。本当にありがたいことなんですが、現在のCOSUMIのアクセス量は4コアXeon2発ではとても捌ききれません… サーバが複数台の構成になるのは技術的にいろいろ大変ですが、もうこれは避けようがなさそうです。

7路盤スペシャルバージョンの定石を公開します

[以前の関連記事] : 7路盤スペシャルバージョン

COSUMIの7路盤スペシャルバージョンの定石を公開したいと思います。本当はもう少しちゃんとしたのができてからにしたかったのですが、なかなか終らないので… これからはアップデートするたびに随時公開していきます。

7路盤スペシャルバージョン
http://www.cosumi.net/seven.html

まずはSGFファイル。

http://www.perfectsky.net/misc/kifu/seven-20110608.sgf

ここにも貼り付けておきます。

以下、注意点を箇条書きにしていきます。

  • Bad Moveというコメントがついている手は地を損する手(以下、悪手と呼びます)で、それ以外の手は地を損することのない手(以下、最善手と呼びます)です。悪手・最善手の区別に、コウ材の数や、人間が見て自然な手かどうかなどといったことは一切考慮されていません。COSUMIは最善手だけを打ちます。
  • 悪手となっている手が実際は最善手ということはほとんどないと思いますが、その反対に最善手となっている手が実際は悪手ということはけっこうよくあります。特に、一度悪手を打った後の手順中には多いです。
  • COSUMIでは手順ではなく盤面の形で定石を持っているかどうか調べています。例えば、黒A・白B・黒C・白Dという手順が入っていたら、黒C・白B・黒Aの手順でも白Dと打ちます。ただし、コウは考慮されます。
  • COSUMIでは対称形は考慮されます。
  • GNU Goの尻拭い的な手順がけっこうたくさん入っています。あまり気にしないでください。
  • 棋譜管理ソフトの操作ミスで明らかにおかしな手順が入っている時もあると思います。それもあまり気にしないでください。

一応、現在の7路盤解析の進捗状況はというと、まず、COSUMIが負けたけどまだ定石を修正できていない対局の棋譜が5000局分ぐらいあります。その内の半分ぐらいは、GNU Goが最後に勝手に転んでるだけの対局なのでどうでもいいのですが、残りの半分はちゃんと調べないといけないやつで、これがパターン数で本当にだいたいですが20パターンぐらい。ただ、主だった変化はもう出尽くした感もあるので、この20パターンさえ調べられたら一応終わりかなと思います。

ということで、今回はその中から、比較的やっかいなのを2つ紹介します。興味があったら調べてみてください(何人かでつつくと楽しいかもしれません)。そして、結果を教えてください!

とりあえず、7路盤を調べるならまずはこのサイト。

七路盤の研究
http://olive.zero.ad.jp/qin/7ro/

その1。

先のサイトにはこの局面で、F4にあてて、F5に継ぐ手順が載っていますが、素人目には、C3が良い所に見えてしかたありません(Fuegoもここを曲がりたがります)。単に曲がるのが良いのか、F4に一本あててから曲がるのが良いのかはよく分かりませんが、最低でもどちらか一方は盤面9目ぐらいありそうに思えるのですがどうでしょうか? ちなみに、この形は7路盤調べ始めた時から、自分の中でラスボス的な扱いになっています(笑)。

その2。

私にはまず気がつかない手なんですが、この局面でC3にこすむ手があるようです。一見、ぬるく見えますが、この手がすごいのは、(相手から対称形で手を渡されたのに対し、さらに)相手に対称形で手を渡しているところで、白は右下半分だけで(左上半分だけで)、なにか手を捜さなければいけませんが、しかし狭い… この勝負どころで、選択肢がほとんどないのは白も怖いです。うーん、これは油断ならない手。一応、さすがにこの手は成立しないというのが私の予想なのですが、Fuegoに打ち次がせると黒の勝率もそれほど悪くないんですよね。ひょっとすると…

7路盤調べていていつも思うのは、「本当にちゃんと調べた人はいないんじゃないかな」ということです。盤面9目という話もまだ怪しい… でも自分が死ぬまでにはきっとはっきりするだろうと思うので、ちょっと楽しみです。

話が少しそれますが、こちらのサイトによると7×4では白は生きないけど、6×5なら生きがあるようです。面白いですね。ここまで来れば、6×6がコンピュータで解析されるのも、もう時間の問題でしょうか? できればそれまでに、ある程度しっかりした7×7の答えを出したいですね。人間様のすごさを見せてやる!(笑)

GNU Goに純碁を打たせる

正直、COSUMIを始めるまではあまりそういう認識ではなかったんですが、「囲碁のルールは難しい」と感じる人は少なくないようです。囲碁を始めてみたいと思っても、一番最初のルール覚えるところでつまづいてしまうらしい… 囲碁のルールが「シンプル」なのは間違いないと思うのですが、必ずしもすべての人に「わかりやすい」とは言えないのかもしれません。ただ、難しく感じる原因が、囲碁のルール自体ではなく、人や書籍やウェブサイトなど、ルールを教えるものにあることも多い気がします。じゃあなぜそうなってしまうのかというと、それは囲碁のルールがムズカシイからで…

ということで「純碁」です。もうみんなで純碁をやりましょう!

王銘エン九段著「純碁」
http://park6.wakwak.com/~igo/golax/jungo/ohmei.html

みんなで純碁をやると決まったので(笑)、GNU Goにも純碁を打ってもらうことにします。ここからが今回の本題です。

まず、使えそうな起動オプションを探してみます。とりあえずこのあたりかな?

$ gnugo --chinese-rules --play-out-aftermath --capture-all-dead

これで打たせたのがこの対局。

ちょっぴり感じが出てますが、最後はもっと自分の地に石を埋めていってもらわないといけません。そこで、読めないソースコードを読んだふりして、少し分かった気になってみます。aftermath.cの952行目あたりに以下の赤字部分を追加します(以下、すべてバージョン3.8の話です)。

  /* Case 7.
   * In very rare cases it turns out we need yet another pass. An
   * example is this position:
   *
   * |.....
   * |OOOO.
   * |XXXO.
   * |.OXO.
   * |O.XO.
   * +-----
   *
   * Here the X stones are found tactically dead and therefore the
   * corner O stones have been amalgamated with the surrounding
   * stones. Since the previous case only allows sacrificing
   * INESSENTIAL stones, it fails to take X off the board.
   *
   * The solution is to look for tactically attackable opponent stones
   * that still remain on the board but should be removed.
   */
  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
    if (board[pos] == other
	&& (worm[pos].unconditional_status == UNKNOWN
	    || do_capture_dead_stones)
	&& (DRAGON2(pos).safety == DEAD
	    || DRAGON2(pos).safety == TACTICALLY_DEAD)
	&& worm[pos].attack_codes[0] != 0
	&& !is_illegal_ko_capture(worm[pos].attack_points[0], color)) {
      DEBUG(DEBUG_AFTERMATH, "Tactically attack %1m at %1m\n",
	    pos, worm[pos].attack_points[0]);
      return worm[pos].attack_points[0];
    }
  }
  
  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
    if (ON_BOARD(pos)
    && board[pos] == EMPTY
    && is_allowed_move(pos, color)
    && safe_move(pos, color)) {
      return pos;
    }
  }
  
  /* No move found. */
  return PASS_MOVE;
}

ちなみに、is_allowed_moveを付けておかないと、ごくまれに非合法な手を打とうとしてエラーになる時があるようです。で、これで打たせたのがこの対局。

おー、これは純碁っぽいですね。地を埋めていくのがなんだか面白い。ただ、何局も打たせて調べていると、次のような局面で左上の1目の地を埋めてしまうことが判明しました…(それはsafe_moveなのか?(笑))

しかたないので、かなり無理やりですが、先ほど追加したコードの前にさらに以下の赤字部分を追加します。

  /* Case 7.
   * In very rare cases it turns out we need yet another pass. An
   * example is this position:
   *
   * |.....
   * |OOOO.
   * |XXXO.
   * |.OXO.
   * |O.XO.
   * +-----
   *
   * Here the X stones are found tactically dead and therefore the
   * corner O stones have been amalgamated with the surrounding
   * stones. Since the previous case only allows sacrificing
   * INESSENTIAL stones, it fails to take X off the board.
   *
   * The solution is to look for tactically attackable opponent stones
   * that still remain on the board but should be removed.
   */
  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
    if (board[pos] == other
	&& (worm[pos].unconditional_status == UNKNOWN
	    || do_capture_dead_stones)
	&& (DRAGON2(pos).safety == DEAD
	    || DRAGON2(pos).safety == TACTICALLY_DEAD)
	&& worm[pos].attack_codes[0] != 0
	&& !is_illegal_ko_capture(worm[pos].attack_points[0], color)) {
      DEBUG(DEBUG_AFTERMATH, "Tactically attack %1m at %1m\n",
	    pos, worm[pos].attack_points[0]);
      return worm[pos].attack_points[0];
    }
  }
  
  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
    if (ON_BOARD(pos)
    && board[pos] == EMPTY
    && (board[SOUTH(pos)] == EMPTY
        || board[WEST(pos)]  == EMPTY
        || board[NORTH(pos)] == EMPTY
        || board[EAST(pos)]  == EMPTY)
    && is_allowed_move(pos, color)
    && safe_move(pos, color)) {
      return pos;
    }
  }
  
  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
    if (ON_BOARD(pos)
    && board[pos] == EMPTY
    && is_allowed_move(pos, color)
    && safe_move(pos, color)) {
      return pos;
    }
  }
  
  /* No move found. */
  return PASS_MOVE;
}

これで打たせたのがこの対局。

地の埋め方がなんだかいい感じに臆病になっています(笑)。

ところが、これでもうOKかなと思っていたら、さらに別の問題が判明しました。次のような局面で白石を打ち上げてくれません…

これは先ほどのコードを追加したからとかではなく、そもそもGNU Goはこの巨大墓場を打ち上げてくれないようです(そういえば、COSUMIでも打ち上げてないのを見たことがある(笑))。最初は「これは純碁として致命的!」と思ったんですが、よく考えたら致命的なのは中国ルールでも日本ルールでも同じようなもの。ただ、囲碁を知っている人が打てば、普通こんな局面にはなったりしないので別にあれですが、純碁を打つような初心者の人なら、こんな局面にだってしてしまうかもしれないし、このまま終局したらなにかと誤解しかねないのでちょっとやな感じです。で、なんとかならないかなといろいろ試したところ、この局面の後、黒パス白パスとなると、今度は打ち上げてくれることに気づきました(GNU Goの中で、一体何が起こったのかは全くわかりません(笑))。正確には、--capture-all-deadオプションと、黒パスか白パスのどちらかひとつでも最後に付いていれば(2手打ちになるけど)、GNU Goは打ち上げてくれるようです。

ということで、時間のある時にこのあたりを何とかまとめて、COSUMIでも純碁が打てるようにしたいと思います。ちなみに、今回のようなことをしても、切り賃を意識したような純碁的に良い手を打つようになったり、純碁でスコア計算をしてくれるようになったりはしませんので注意してください。あくまでも、最後に上手に地を埋めていってくれるようになるだけです。

[追記 2011/5/13]
COSUMIでも純碁が打てるようにしました。

http://www.cosumi.net/jungo.html

棋譜の最後にパスを付けると、取れないコウが取れるようになってしまうので(気づくのが遅い!(笑))、(盤面全体の)巨大墓場は、GNU Goを使わずに自前のコードで打ち上げるようにしました。なので、純碁以外の対局ゲームでも、今度からは巨大墓場を打ち上げます。少し賢くなりました。

GNU Go 3.9.1

GNU Goの最新開発版、バージョン3.9.1がリリースされています。

GNU Go – GNU Project – Free Software Foundation (FSF)
http://www.gnu.org/software/gnugo/

ということで、バージョン3.8と対戦させてみました。

GNU Goは、両方のバージョンとも自分でコンパイルしました。使用したPCのOSはWindows XP、CPUはAthlon X2 BE-2400。それぞれの碁盤サイズごとに、先後を換えて100局ずつ計200局対戦させました。コミは6目半。同じような手順の対局ばかりになってもあれなんで、対局開始局面はGoGuiに入っているテスト用のを使っています。カッコ内は、一局あたりの平均消費時間です。ちょっとうっかりして、付けなくてもいいのに--never-resignオプションを付けてテストしてしまいましたが、結果にはほとんど関係ないと思います。

9路盤 GNU Go 3.9.1(8.2sec) 105勝 – 95勝 GNU Go 3.8(8.4sec)
19路盤 GNU Go 3.9.1(140.6sec) 90勝 – 110勝 GNU Go 3.8(141.9sec)

特に強くはなっていないようです。それより、再現条件がよく分からないんですが、レベルを下げるとたまにエラーを出して死ぬのが… このバージョンは、COSUMIでは使いません。

[追記 2011/2/7]
レベルを下げるとおかしくなるのは、たぶんこれですね。パッチ当てたら直りました。

第15回コンピュータオリンピック

2010.09.24  |  Fuego, GNU Go, MoGo, Zen, 囲碁, 将棋  |  Comments (0)

[以前の関連記事] : 第14回コンピュータオリンピック

今日から、日本の金沢で第15回コンピュータオリンピックが開かれています。今年は囲碁に13路盤部門、将棋に5五将棋部門が追加されています。

金沢 2010 (ICGA トーナメント)
http://www.grappa.univ-lille3.fr/icga/event.php?id=42&lang=3

The JAIST 20th Anniversary Events with the ICGA
http://www.jaist.ac.jp/ICGA-events-2010/olympiad/

さらに今年は、囲碁と将棋はネット中継があるようです。

ICGAの主なイベントのネット中継を実施
http://www.jaist.ac.jp/news/2010/0922_2.html

囲碁の19路はおそらくZenが一歩抜き出ていると思いますが、今年は去年出ていなかったMany Faces of Goも参加するみたいなので、意外と面白くなるかもしれません(他の伏兵だって居るかも…)。また、大会最終日の10月2日に、優勝ソフトと噂の史上最年少プロ棋士(そして秀行先生のお孫さん)、藤沢里菜初段との対局が行われます! しかも、これのネット中継もあります!! 何子で打つのかわかりませんが、すごく楽しみですね。

将棋の方も、今回は日本で開催されるということもあってか、去年とは打って変わって(笑)参加ソフトが多いです。激指、習甦、GPS将棋、Bonanzaなどが出ます。こちらも楽しみです。

[追記 2010/9/26]
9路盤の結果が出たようです。1位MyGoFriend、2位Fuego、3位Ericaでした。

MyGoFriendというソフトは初めて目にしましたが、こちらにウェブサイトがあります。

Home | mygofriend.net
http://www.mygofriend.com/

現在は9路に焦点を合わせて開発しているようで、今大会でも13路と19路には参加していません。

そして2位のFuegoですが、やっぱり9路では強いですね。3位のEricaは、この前のKGSの9路の大会で優勝していました。

ちょっと話変わりますが、今日、KGSにZen19とManyFaces1が居ました。Zen19は互先では3戦全勝、相手は全て3dでした! そして、ManyFaces1の対局を観戦しているZenAuthor… すでに火花が飛び散っています(笑)。

[追記 2010/9/28]
13路盤の結果が出たようです。1位Many Faces of Go、2位Fuego、3位MoGoでした。

Many Faces of Goの1位は順当なんでしょう。しかし、このソフトが9路では14チーム中10位(前回出場の一昨年は1位!)っていうのは、Many Faces of Goの作者が言われる「現在9路は良い定石を持っていないと勝てない」という事実を、如実に物語っている気がします。あくまでも推測ですが、MyGoFriendという新星の出現はこのあたりに秘密がありそうです。

明日からの19路は、やはり本命Zen、対抗Many Faces of Goでしょうか? FuegoやMoGoはどこまで食い込めるか…

[追記 2010/10/2]
19路は、1位Erica、2位Zen、3位Many Faces of Goでした。1位のEricaってこんなに強かったんですね… このソフトのことは今まで良く知らなかったのですが、9路と13路の結果からいって、19路はメダルもないかと思ってました。よく分かりませんが、Crazy Stoneの人が少しかんでるんでしょうか? 今日の対藤沢里菜戦が楽しみです。

(順当に強かった2位と3位をとばして)4位のMogoですが、ZenとMany Faces of Goとの対局は時間切れ負けでした(形勢は、Many Faces of Goとは良い勝負で、Zenには勝ってた?)。どうやら9路の時からトラブル続きだったようです。

5位のFuegoは、しちょうに取れない石を追っかけてましたね… おちゃめなのは嫌いじゃないです(笑)。

[追記 2010/10/2]
エキシビション対局は、藤沢里菜初段の中押し勝ちでした。コンピュータが強いプロ棋士に6子で勝つのは、まだまだ簡単なことではなさそうです。この対局のライブ映像は、録画されたものを今からでも見ることができます。

http://www.ustream.tv/channel/the-jaist-20th-an-ni-ver-sa-ry-events-go

GNU Go 3.8

2009.02.23  |  GNU Go, 囲碁  |  Comments (0)

GNU Goの新しい安定版、バージョン3.8がリリースされています。

GNU Go – GNU Project – Free Software Foundation (FSF)
http://www.gnu.org/software/gnugo/

ソースコードは、こちらからダウンロードできます。

早速、実力をチェックするために、以前の安定版、バージョン3.6と対戦させてみました。

GNU Goは、両方のバージョンとも自分でコンパイルしました。使用したPCのOSはWindows XP、CPUはAthlon X2 BE-2400。それぞれの碁盤サイズごとに、先後を換えて50局ずつ計100局対戦させました。コミは6目半。カッコ内は、一局あたりの平均消費時間です。

9路盤 GNU Go 3.6(9.1sec) 53勝 – 47勝 GNU Go 3.8(9.0sec)
13路盤 GNU Go 3.6(35.0sec) 49勝 – 51勝 GNU Go 3.8(32.9sec)
19路盤 GNU Go 3.6(132.5sec) 45勝 – 55勝 GNU Go 3.8(135.8sec)

うーん、全く進化してない…(笑) GNU Goの開発は、このままフェードアウトしていくのでしょうか? ちょっと寂しいですね。

[追記]
Windows用のバイナリはこちらからダウンロードできます。

囲碁思考エンジンFuegoについて調べてみた

2009.02.07  |  Fuego, GNU Go, MoGo, 囲碁  |  Comments (6)

オープンソースで開発されている、Fuegoという囲碁思考エンジンを最近知ったのですが、このソフト、KGSで2kというかなりの実力らしいので、気になってちょっと調べてみました。

Fuego
http://fuego.sourceforge.net/

Fuegoは、GUIを持たないテキストベースのシンプルなコマンドですので、普通に対局しようとする場合は、別途GTPに対応したGUIフロントエンドが必要になります。

まずはヘルプ。

$ fuego -help
Options:
  -config file execute GTP commands from file before
               starting main command loop
  -help        display this help and exit
  -maxgames n  make clear_board fail after n invocations
  -nobook      don't automatically load opening book
  -nohandicap  don't support handicap commands
  -quiet       don't print debug messages
  -size        initial (and fixed) board size
  -srand       set random seed (-1:none, 0:time(0))

Fuegoは起動すると常に、GNU Goに--mode gtpオプションを付けた時と同じような、GTPな状態になります。囲碁のルールや強さ(考慮時間)などは、起動時のオプションで指定することができないようですが、起動後、GTPコマンドでFuegoに教えることができます。

囲碁のルールは、go_rulesコマンドで変更できます。いわゆる日本ルールにする場合は

go_rules japanese

とします。引数は他にもchinesecgoskgsがあり、デフォルトはchineseを指定したのと同じ状態になっているのですが、このchineseを指定した時のコウのルールは、スーパーコウルールとなっています。もしこのコウのルールだけを変更したい場合は、go_param_rulesコマンドを使って

go_param_rules ko_rule simple

のようにします。

go_param_rules

と引数を取らなければ、現在設定されているルールを詳細に表示します。

強さは、考慮時間を変更するtime_settingsコマンドを使って変更できます。たくさん考えさせると、その分強くなります。例えば

time_settings 0 30 1

とすると、一手30秒で考えるようになります。と言いたいところなんですが、バグっているのかなんなのか、この指定ではなぜだかデフォルトよりも大幅に早く手を返してきてしまいます。次のような指定は、うまくいくようです。意味は一局1000秒です。

time_settings 1000 0 0

time_settingsコマンドの詳しい使い方は、こちらのGTPの仕様を見てみてください。

ただ、GUIフロントエンドからFuegoを使う場合に、こういったGTPコマンドが送れなかったり、仮に送れても手間が掛かって面倒なことが多いと思います。そういう場合のために、起動時に実行したいGTPコマンドを記述したコンフィグファイルを用意し、そのファイルを-configオプションを使って読み込ませることができます。例えば、次のような内容のファイルを用意します。

go_rules japanese
time_settings 1000 0 0

そして、GUIフロントエンドの設定では次のようにします(今回はコンフィグファイル名をfuego.confとしました。path/to/は適宜変更してください)。

path/to/fuego -config path/to/fuego.conf

これで、日本ルールで一局1000秒考えるFuegoと対戦できます。

Fuegoには、終局後、対局結果を調べる機能がありますが(final_scoreコマンド)、正確でなかったり結果を返してこないことがたまにあるようですので、この機能を使って目数などの対局結果を表示するGUIフロントエンドを使う時は注意してください。なんかおかしいなと思ったら、自分で数えた方がいいかもしれません。ちなみに、GNU Goはこのあたりけっこうしっかりしていて、ほとんど間違うことはありません。

ということで、Fuegoの使い方はだいたい分かりましたので、今度はGNU Goと対戦させてその実力を調べてみたいと思います。本当はMoGoとさせたかったんですが、なぜか頻繁にエラーが出て止まってしまいうまくいきません(しかも、その後PCの調子が明らかにおかしくなる…)。原因がはっきりしなくて気持ちが悪いのですが、よく分からないので今回は諦めました。

対局に使用したFuegoとGNU Goは、どちらともこちらのサイトからダウンロードしてきました。Fuegoはバージョン0.3.1、GNU GoはMinGW版の3.7.13。両方のソフトとも基本的にデフォルトのままですが、日本ルールのときはFuegoに

go_rules japanese

とGTPコマンドを送り、中国ルールの時はGNU Goに--chinese-rulesオプションを付けました。使用したPCのOSはWindows XP、CPUはAthlon X2 BE-2400。連続対戦させるために、GoGuiに入っていたgogui-twogtpというソフトを使いました(このソフト、最終的な結果をHTMLファイルにまとめることができたりと、めちゃくちゃ便利です)。それぞれの条件ごとに、先後を換えて20局ずつ計40局。コミは6目半です。対局中に他の作業もしていましたので、消費時間や強さに影響が出ている可能性もあります。カッコ内は、一局あたりの平均消費時間です。

9路盤 日本ルール Fuego(159sec) 35勝 – 5勝 GNU Go(16sec)
19路盤 日本ルール Fuego(1016sec) 14勝 – 26勝 GNU Go(261sec)
9路盤 中国ルール Fuego(163sec) 36勝 – 4勝 GNU Go(16sec)
19路盤 中国ルール Fuego(1049sec) 29勝 – 11勝 GNU Go(257sec)

とりあえず、9路盤での強さは本物ですね。GNU Goが相手では、どれくらい強いのかがよく分からないレベルです(笑)。19路盤はちょっと微妙… ただ、時間を増やせばまだまだ強くなりそうな感じはします。それから、他のモンテカルロな囲碁ソフトと同じく、デフォルトの中国ルールの方がだいぶ得意なようです。でも、日本ルールでもそれなりに打てるのはすばらしい。ちなみに、MoGoなどと同じく、「半目勝ちか中押し負け」な対局結果がすごく多かったです。

一応、少しだけ採れたMoGoとの棋譜も置いておきます。4局とも、中国ルールの9路盤。MoGoは--9オプションを付けただけです。時間はMoGoがFuegoの2倍弱ほど使っていました。これだけの対局数ではどちらがどれくらい強いのかはっきりしたことが分かりませんが、とにかくやっぱりMoGoは強いです。

[黒]Fuego vs [白]MoGo : 白(MoGo)中押し勝ち
[黒]Fuego vs [白]MoGo : 白(MoGo)中押し勝ち
[黒]MoGo vs [白]Fuego : 白(Fuego)中押し勝ち
[黒]MoGo vs [白]Fuego : 黒(MoGo)中押し勝ち

[以後の関連記事] : MoGoとFuegoを対戦させてみた

[追記]
コメントで教えていただいたんですが、一手あたりの考慮時間はgo_paramコマンドでtimelimitパラメータを変更するといいようです。一手30秒で考えるようにするには、

go_param timelimit 30

とします。

それからuct_param_searchコマンドでnumber_threadsパラメータを変更すると、マルチスレッドで動くようです。例えば、

uct_param_search number_threads 2

とすると、スレッド数が2になります。マルチコアなCPUを使用時は、この設定をぜひ試してみてください。

[追記]
ハードウェアにも依存するらしいのですが、スレッド数を変更したら、

uct_param_search lock_free 1

ともしたほうが良いそうです。難しくて私にはよく分かりませんが、この設定でLock-freeモードというのになります。

[追記]
GoGuiを使ってFuegoと対局する方法の解説ページを作ってみました。よかったら見てみてください。

http://www.perfectsky.net/fuego/index.html

「オンライン囲碁 COSUMI」始めました

コンピュータと対局できるオンライン囲碁サイトを、GNU Goを使って作ってみました。かなり以前からやってみたかったのですが、これがなかなかたいへんで、ひとまず公開できて今は少しほっとしています。

オンライン囲碁 COSUMI
http://www.cosumi.net/

とりあえず今は、7路盤と9路盤が遊べます。初心者向けですね。基本はGNU Goなんですが、それとは別に独自に用意した定石からも手を探すので、対局ごとにいろいろな形になる分、普通にGNU Goと対局するよりは面白いかもしれません(たぶん、ちょっぴり攻撃的です)。ちなみに今現在、9路盤の定石が10908局面分入ってます(対称形を重複して数えてますので、実質的にはもっと少ないですが…)。

今後、「定石を充実させてもう少し強くすること」と「11路盤の対局ができるようにすること」の2つは、必ず実現したいと思います。他にもいくつかやってみたいことがあるんですが、自分のスキルの問題もあって(笑)、何ができて何ができないのかまだよく分かりません。とにかく、少しでも多くの人にこのサイトで囲碁を覚えてもらえればと思っています。気軽に遊んでみてください!

それから、英語のページも用意したんですが、英語がおかしかったら教えていただけると助かります。

それからそれから、7路盤や9路盤用のスペシャルGNU Goの作り方を知っていたら教えていただけるとすごーく助かります。board.hMIN_BOARDMAX_BOARDMAX_HANDICAPだけは変更したんですが(ちなみにこれは有意な差がありました)、他に何か無いでしょうか? ここはけっこう切実なんですが…

モンテカルロなGNU Go

2008.04.18  |  GNU Go, 囲碁  |  Comments (0)

GNU Goの最新開発版、バージョン3.7.12が出ていたのでChangeLogを見ていたら、その中にこんな項目を見つけました。

new options –monte-carlo and –mc-games-per-level to use Monte Carlo UCT search on 9×9 and smaller boards

ついにGNU Goもモンテカルロだそうです! ということでさっそく実力を調べてみることにしました。

まずは、

gnugo-3.7.12.exe --monte-carlo

gnugo-3.7.12.exe

で先後を換えて50局ずつ計100局、9路盤で対戦させてみました。コミは6目半です。結果は、前者モンテカルロの63勝37敗となりました。なかなかやるなと最初思ったのですが、モンテカルロの消費時間が約13倍(!)と多いので、バランスをとるため、次に

gnugo-3.7.12.exe --monte-carlo --level 1

gnugo-3.7.12.exe

で対戦させてみました。結果は、モンテカルロの41勝59敗。しかもまだ1.2倍ほど時間を使っています。うーんまだまだだめかも… しかし、ここまでレベルを下げるのは、逆にモンテカルロがかわいそうな気がしたので、最後に

gnugo-3.7.12.exe --monte-carlo --level 5

gnugo-3.7.12.exe --level 15

で対戦させてみました。結果は、モンテカルロの59勝41敗。時間も先ほどまでとは逆に、非モンテカルロがモンテカルロの1.3倍ほど使っています(バランスとるの難しいな(笑))。

と言うことで結論、「新しいモンテカルロなGNU Goは時間をたくさん使えば結構強い」でした。本当は、–mc-games-per-levelというオプションも使って消費時間を調節できれば良かったのですが、すぐに適当な数字が出てくる気がしなかったのでやめておきました。

私は囲碁があまり強くないのであれですが、少し棋譜を見たかぎりでは、モンテカルロGNU Goの棋風は、石がガンガンぶつかって、相手の地になりそうな所にも入って行く少し攻撃的な感じでした。でもヨセは以前と比べてなんだかおかしいと思います。前半モンテカルロ、後半非モンテカルロで打ってくれたら結構いいかもしれません。まだチューニングが全然できていないみたいなので、これからに期待ですね。

現時点では、モンテカルロなGNU Goの情報はほとんどないようですが、興味のある人はこことかここを見てみてください。