PilotGoJ を改造する

prc-tools をインストールしたのは、PilotGoJ を改造したかったから。PilotGoJ は、Palm OS 用のオープンソース囲碁ソフトに改良を加えたものなのだけど、ところどころ変なところがある。これらを改善してみようというわけだ。
まず、(細かいけど)ハンディキャップ(置き石)の場所が変なこと。5 つまではこれでいいと思うのだけど、6、7、8 つのときに置かれる場所が、私の知っている置き方とは違うのだ。なんか気になるので、まずはここから修正してみる。置き石の処理は、main.c の SetHandicap で行われているようなので、ここを修正する。
また、置き石のときは、白が先に打つことになるはずなのに、なぜか黒からになってしまっているので、これも修正する。これは、main.c の SubNewGame 内に Palm が黒だったら先に打つという処理があるので、置き石がある場合は、白だったら先に打つように修正。人間どうしの場合はこれだけでは不足なような気がするけど、とりあえずは保留。
それから、コミが、5 目半しか選べない。今は 6 目半が主流だと思うので、どちらかを選択できるように改造。これには、prefs.c とリソースファイル?(pilotgoj.rcp.in)を修正する必要があった。置き石のときは通常コミなしにすると思うので、main.c の SubEndGame も修正。
とりあえずここまでで気になったところは改善できたかな。他にも、スコア表示のあとに下の 2 行くらいの表示が乱れるとか、undo 時に画面が乱れることがある(ポン抜きを undo した場合かな?)とか、若干気になるところがあるので追々直してみようかなと思う。

実際には、こんな細かい部分を修正したいのではなくて、悲しいほど弱いので、もっと強くなってほしいのだ。gnugo をもとにして作られているようだけど、バージョンが古い(おそらく 1.2)からかかなり弱い。WING でまだ 1 勝もできていない私が、9 子置かせても勝ててしまうというのは問題だ。gnugo のバージョンをもっと新しいものにすればいいと単純に考えたのだけど、新しいバージョンは 1.2 と比べてかなり複雑になってしまっている。その次の安定バージョンの 2.6 (3.2 よりも 4 級くらい弱いらしい)でも、1.2 とは別物としか思えない。
ということで gnugo の新しいバージョンを載せるという計画はほとんど挫折しているわけだけど、おもしろそうな課題なのでぼちぼちさわってみようと思う。

バケツをまとめる

FAQ に新しい項目が追加されたので、翻訳。バケツをひとつにまとめる

単純に考えると、それぞれのバケツの単語数を足しあわせればいいのではないかと思うのだけど、話はそう単純ではないようだ。以下に、足し合わせではうまくいかないことを説明してみる。

A,B,C のバケツにそれぞれ 100 単語ずつが入っていて、X という単語が、A には 1 個、B には 5 個、C には 4 個入っているとする。

この場合、A,B,C のそれぞれから適当に単語を取り出したときにその単語が X である確率は、1/100、5/100、4/100 で、ベイズの定理により、X が

A から取り出したものである確率 1/10
B から取り出したものである確率 5/10
C から取り出したものである確率 4/10

で、バケツ B の確率が最も高い。

ここで、A と B の二つのバケツをまとめて A' というバケツを作った場合、単純に単語数を足しあわせれば、このバケツに含まれる単語数は 200 で、単語 X は 6 個含まれることになる。

すると、A' から単語を取り出したときにその単語が X である確率は、6/200 = 3/100。先ほどと同じように、ベイズの定理により、X が

A' から取り出したものである確率 3/7
C から取り出したものである確率 4/7

となり、今度はバケツ C の確率が最も高くなってしまう。

本来は、A から取り出したもの、あるいは B から取り出したものである確率と同じになるべきだから、バケツ A' から取り出したものである確率は 6/10 にならなくてはならないはず。ということは、A' から単語を取り出したときにその単語が X である確率は、6/100 でなければならないということだ。要は、単語数ではなくて、確率を足しあわせなければいけないということだ。

では、確率を足しあわせるということが現実にできるのかというと、これが実は不可能なのだ。バケツ A から取り出した単語が X1 である確率、バケツ B から取り出した単語が X1 である確率、バケツ A から取り出した単語が X2 である確率、……をすべて足しあわせると、2 になってしまう。すべての事象の確率を足しあわせて 2 になることはあり得ない。

ということで、単語数をやりくりして、もとと同じ状態を維持するということは不可能。やはり、ドキュメントに書かれているように、リセットして最初からやりなおすというのがいい方法のようだ。