クラスPosのcalcVectorsの
BVector he = h.diff(b);
d = he.mul((tFei.and(he)).mul(ei));
の式が黒3手目であやしい動きをしていることが分かってきました。これは数学の式で書くと、
he = h-b
d = he (((tF ei)∧he) ・ei)
となります。heはアタリのベクトルhと黒∨空のベクトルbの論理差です。3手目は黒番なので、heは敵石(白石)のアタリを表したベクトルです。ただし、着手の前と後でベクトルが変化するので、着手前をb、着手後をb‘と表記することにします。h=t(1 1 0 0)、b=t(0 1 1 1)なので、he=t(1 0 0 0)となります。敵石のアタリなので、取られる石を表しているとも言えます。
また、tF eiは連接関係を表す行列Fの転置に着点eiを掛けたものです。eiは単位ベクトルといって一つの要素だけが1のベクトルですが、黒番で要素3(左下の点)に着手しているので、ここではei=e3=t(0 0 1 0)です。tFにこれを掛けると行列Fの3行目が取りだされます。これは、着点の連接点を意味します。tF e3=t(1 0 1 1)であり、着点の連接点は要素2(右上の点)以外の点であることを表しています。
(((tF ei)∧he) ・ei)は、上記の着点の連接点tF eiと前述した敵石のアタリheの論理積をとって、さらに着点eiとのスカラー積をとったものです。tF eiと前述した敵石のアタリheの論理積はt(1 0 0 0)なので、着点eiとのスカラー積は0となります。このスカラー積は取りがあったかどうかを示す値で、1なら取りがあった、0なら取りがなかったことを示すつもりでしたが、0になってしまったので、本来白が取られていることを検出できていませんでした。
なんとなく分かってきました。((tF ei)∧he)ではなく、(tF he)にしなければならなかったようです。この値はFの要素1を取りだすのでt(1 1 1 0)であり、着点eiとのスカラー積は1となります。つまり、白石の連接点に着点が一致した、唯一の活路がなくなったことになるわけです。
この式は紙に書いて導いたのですが、プログラムするときに間違えてしまったようです。最初に示した d= の式を以下のように書き換えてみましょう。
d = he.mul((tF).mul(he)).mul(ei));
さて、直してみたのですが、結果は変わりませんでした。そういうときは実際どう動いているのか確かめてみた方がよさそうです。Eclipseのデバッグ機能を使ってみましょう。
(つづく)
