もごぼっと
(現在休止中です。)
はじめに
07/09/11にbinaryが公開された思考エンジン、
MoGo
を使って、
ポカぼっと
と同じように
iGo棋院
で打てるようにしてみました。
使い方
基本的な使い方はポカぼっとと同じです。
こちらを見て下さい。
ポカぼっとにあるいくつかの機能は省略されています。
-
「形勢」コマンドが追加されています。MoGoの考えている黒の勝つ確率が表示されます。
-
「地合い」コマンドで表示される数値はMoGoではなくGNU Goが計算しています。
-
「ヒント」コマンドではMoGoとGNU Goの両方の手が表示されます。
-
「投了」コマンドは使えません。形勢が悪ければ投了します。
-
「死に石」、「詳細」、「宇宙流」コマンドは使えません。
MoGoの特徴
MoGoは、Sylvain Gellyさんが作成した思考エンジンで、
モンテカルロ法に基づくアルゴリズムを用いています。
乱数で非常に多くの(勝手読みによる)対局を終局まで行って、
最も勝率の良かった手を選ぶという、シンプルで一見無茶な
手法です。しかし、充分な思考時間を与えれば、9路盤などの
小さい盤ではかなり強いようです。
定石も死活も知識としては持っておらず、全局的な読みだけで
打ちます。そのため、十分なシミュレーション回数が得られない
19路盤では、まだまだ弱いようです。
勝率をベースにしている(目数の差は考えない)ため、勝っているときは
安全運転してとことん緩みます。半目差まで詰めさせることもめずらしく
ありません。逆に、負けているときは無茶な勝負手を連発します。
また、日本ルールではなく中国ルールを採用しています。
中国ルールでは日本ルール的な「終局」後に自陣に手を入れても
損にならないので、乱数対局で終局判定せずに打つところが無くなるまで
打たせてしまい勝敗判定を行う、というアルゴリズムを採用することで
終局判定を省略でき、シミュレーションの高速化が可能なためと思われます。
中国ルールへの対応
前述したように、MoGoは日本ルールではなく中国ルールを採用しています。
日本ルールは、「地の数 + アゲハマの数」を競うのに対して、
中国ルールは「地の数 + 盤上の石の数」を競います。
全く違うルールのように見えますが、終局時の盤上の白石と黒石の数は
交互に打っている以上基本的に同じで、差があるとすればそれは
取られた石の数の差なので、どちらで計算しても基本的には同じスコアになります。
他にも細かいところで差は出てきますが、MoGoを日本ルールで運営されている
iGo棋院で動かすためには、次の点が問題となりました。
- 黒から打ち始めて、黒が最後の手を打った場合、黒の方が一つ多く打っている
ために、日本ルールよりも黒のスコアが1多くなる。
- 置碁の場合、はじめに置かれている黒石の分が黒のスコアとなる。
この違いは、特に勝っている場合半目差まで緩める性質があるMoGoにとっては、
致命的になります。黒を持って勝っている碁をわざわざ半目負けまで緩める、という
ことが起こり得ます。そこで、
- MoGoが黒の場合、予めコミを一目多くMoGoに伝えておく。
- 置碁の場合、(置石の数 - 1)をコミにプラスしてMoGoに伝えておく。
というふうに対処しています。
GNU Goとの併用
現在iGo棋院で動いているもごぼっとは、実は純粋なMoGoではなく、
GNU Goとのハイブリッドになっています。具体的には、以下の通り。
-
13路盤以上の場合
序盤の数手と、最後の小ヨセの部分をGNU Goが担当します。
-
12路盤以下の場合
最後の小ヨセの部分で、GNU Goがパスを生成したらMoGoの手は
採用せずにパスします。
また、終局時の死に石指定もややGNU Goの方が安定度が高いようで、
現在はGNU Goにやらせています。
その他細かいこと
-
6路盤以下では動きません。
-
「レベル」コマンドでレベルの変更が出来ますが、レベルの数値は、
そのままMoGoに与える「一手あたりの思考時間」に対応しています。
GNU Goはレベル1でもそこそこきちんと打ちますが、MoGoの場合
充分な思考時間を与えてあげないとまともな碁になりません。
今のところ、デフォルトで20秒、最大30秒にしてあります。
-
CPUパワー、メモリともに消費が激しいので、多面打ちは厳しいです。
一応5部屋まで入室できるようにしてありますが、誰かが打っていないことを
確認してから打つようにした方がいいかも知れません。
-
現在、Pentium 4 3GHzのマシンのLinux上で動いています。
アルゴリズムの性質上、マシンが高速であればあるほど強くなるので、
現状ではMoGoが真価を発揮しているとは言えないかも知れません。
多面打ちが絶望的に遅くなるため、マルチスレッド機能(-nbThreads 2)も
有効にしていません。