前回の記事 : 「コンピュータ囲碁プログラム 設定を作ろう」 http://qiita.com/muzudho1/items/51ae95477b669ba61f29
盤を使ったボードゲーム(今なぜ同義反復したのか)では 盤のデータを記憶するのに、
board (ボード、盤)と呼ばず position (ポジション、局面)と呼ぶ。
囲碁盤は1つだが、その上には たくさんの局面がある。コンピューター・ゲームとしては 局面データを記憶している、という発想をする。
ポジション
囲碁では次の 6つ をポジション・データとして持っておけばいいのではないか。
- 盤面
- アゲハマ ※黒白別
- 手番
- コウの位置
- 最後の着手はパスだったか ※連続パスは終了という重要なルールがあるので、局面ハッシュにも、最後の着手がパスだったかどうかを含意しておきたい
- パス回数 ※黒白別に、パスを何回したか覚えておく。中国ルールの勝敗判定でパスは1回につき-1目
ここで、局面ハッシュ という言葉が出た。
局面ハッシュ
チェスなら3回、将棋なら4回、囲碁なら2回、同じ局面が出てきた時点で 対局は終了になる。バラバラでワロスwwww
繰り返しが許される回数で言えば、チェス1回、将棋2回、囲碁0回だ。
囲碁は盤面がでかいので 何回同じだっけ?、とか 1回だって覚えてられない し、将棋では「おいおい千日手やる気かよ」「千日手でも構いませんよ」という間があって それぞれ面白い。
同形反復、千日手 を調べるために、今までに指した ポジションを覚えておいて比較する必要があるわけだが……。
で、例えば 棋譜で100手ぐらいの手数が続いたとしよう。
そこだけ見ると たった100手だが、思考中(指し手の探索中)は 局面を作っては消し、の繰り返しだ。将棋でも初期局面から 1手で30局面、2手で900局面、3手で27000局面ぐらいにはなるだろう。
ポジションをそんなに作ったり消したり してられないのは分かるだろう。そこで登場するのが 局面ハッシュ だ。
例えば 1局面が long型の整数1つ で表現できたりする。このような数字を局面ハッシュという。
ただし、ハッシュから 局面データに復元することはできない。データは欠損している。1つの局面から同じハッシュが出てこないかというと そんなことはなく、ほんとは数学的に調べないといけないんだが、まあ数字をとにかくでかくして、実用的には衝突なんか起こらないようにすれば、千日手の判定とかに使える、という 数のでかさ を利用したなかなか実践的な話しだ。
省メモリで高速、実装が楽で なお嬉しい ゾブリスト・ハッシュ というのを1つ覚えておくといいだろう。
同形反復を調べるために必要な情報って何だろう
ちょっと休んでから続きを書く。
- 黒石の位置
- 白石の位置
- コウの位置
- 前の対局者がパスしたか(最後に置いた石の位置が「パス」か否か)
この4つが 同形反復を調べるために必要な情報だろう。
じゃあ、アゲハマ、手番、パス回数とは何だったのか……。
日本ルールでは アゲハマ(取った石)は 相手にマイナス点として計算される。中国ルールでは盤上の石だけ見るので 取った石なんか勝敗に関係ないんで アゲハマとか無い。
前述したように、中国ルールでは パス回数 は 相手にマイナス点として計算されるので勝敗判定のために覚えておく必要がある。日本ルールではパスし放題なんで回数とか覚えておかなくていい。囲碁では基本的に何もしないよりは石を置けば有利なので、ほんとに置くと損するという場面でパスをする。
あれっ、手番 は? 棋譜を見ると、黒、白、黒、白、と並んでいるな? パスをしたからといってこの順番は崩れない。あとは分かっただろう。0番目をスタートとして、0番目の局面ハッシュは手番が黒だし、もっと言えば 偶数番目の局面ハッシュは手番が黒で 奇数番目の局面ハッシュは手番が白だ。
ただ、ほんとに手番なんか関係なく 盤面だけ見て 同形反復を判定するのかもしれない。どうなんだろうか。
コウって何?
取られた場所に すぐ置くと 取り返せるケースがあるんで、その場合は 1回だけ別の場所に置いたあとでないと置けない、というルールがある。その、置いてはいけない場所を コウ と言ったり、そのコウを作ることを狙うのを「コウを狙う」、コウに石を打ち込むのを避けたりすることを「コウを避ける」とか言う。
コウを避けるために別の場所に石を置くことを「コウ立て」と言う。
すると、「コウ立て」すると相手が1手 得するじゃないか、ということなんだが、
将棋で言うところの「面倒をみなければならない」ようなところに「コウ立て」を打てば 相手はコウ立てに付き合ってくれるので、
(図は悪手なんだが……まあ何か黒が白のめんどうを見た)
相手に面倒を見させれば 自分の手番が回ってきて 相手が「コウを作れる」場所を こっちが先に取ってやることができる。
このとき、相手が面倒をみなければならないコウ立てを打てる場所を コウ材 という。
(図は、見事な捨て石が決まった。相手に小さなところを取らせて 自分は大きなところを取るという、囲碁の遊び方だ。ただ、この適当に書いたデタラメな例えの図を見ると白は大悪手すぎて黒有利に見えるが……)
コウ材を多く持っていると、コウの取り合いでは勝てるわけだ。
このコウというルールは、囲碁のルールの欠陥ではなく、囲碁を面白くするルールとなっているようだ。
解説おわり
これで 囲碁のゲームデータにあたる ポジション について解説できた。
あと、コンピュータ囲碁用語の 連(れん) と、自殺手、勝敗判定などの説明をすれば 囲碁をするプログラムは 動かすだけなら だいたい書けるかと思う。
それが強いか弱いかは おいておいて……。
なんというか、モンテカルロ木探索アルゴリズム が登場して、それ以前と比べると ある意味で 囲碁プログラムは一気に 簡単ですっきりしたし、逆に ディープラーニングが出てきて ちゃんと数学を勉強してないといけなくなって、ずっと2強であとは団子状態と思われたコンピューター囲碁は さらに頂上が果てしなくなった。プログラムとしてとっつくには、面白いのではないか。