Javaアプレット(48) 行列Sの定義

6つのベクトルを計算するために、b, w, Fでは足りない気がしています。石については、Fがつながっている石(連)を記憶しているのでいいのですが、空点についてはそのつながりがすぐに分かりません。局面を表すにはb, wの情報でも十分なのですが、連をいちいち計算するのが大変なのでFを導入していたわけです。空点についても同様な仕組みがあると計算が楽になりそうです。
下図に、ある局面とそのF(iの連接点j)を示してあります。Fを見ると分かるとおり空点に関してはその隣接する点しか表していません。つまり、空点を囲む石を知りたい場合にFからではすぐに分からないのです。そこで、空点について連接点に相当するものを行列Sとして定義しようと思います。
図:行列Fと行列S
【図74 行列Fと行列S】
初期局面におけるSをS0と呼ぶとすると、S0は要素が全て1の行列になります。1手打たれると、その行は隣接関係でクリアされます。つまりFとは逆で石のあるところは隣接関係、ないところが連接関係を表す行列になります。
この行列Sは、行列Fのように少しずつ増えた連接関係を追加していくことが難しいようです。例えば盤面が石で左右に分断されたとき、すべての空白の連接関係が左側の空白に属するか、右側の空白に属するかで2つのパターンに分かれます。その際の連接パターンの抽出は、盤面全体を調べる必要があります。
Fの場合は育っていった(石の)連があるときつながるだけなので、関連する連の論理和を取れば済みます。Sの場合はその逆で、あるとき大きな空白の連が最大4つの小さな空白の連に分かれるのですが、その小さな空白の連の情報を元々持っていないので、そのときに計算しなおす必要があるわけです。
Fの導入のようにスマートにいきませんが、このSを計算することを前提に、6つのベクトルを導く式を検討していこうと思います。
(つづく)

カテゴリーJava

コメントを残す