囲碁ソフトの作り方


  • はじめに
  • 言語
  • 認識
  • 連オブジェクト
  • 群オブジェクト
  • 地オブジェクト
    ●はじめに
      囲碁をコンピュータに考えさせる事は非常に難しい。チェスは世界の名人と同等の強さを持つようになり、将棋は2段ぐらいの強さを持つようになりました。しかし、囲碁はまだ3、4級程度の強さぐらいしかありません。世界最強で日本棋院から2級の認定がありました。ようやく初段が見え隠れしてきたと、プロ棋士のコメントがありました。しかしながら、初段は届きそうでなかなか届かない。それは2年先なのか、10年先なのかわかりませんが、近い将来必ず到達するでしょう。世界の囲碁プログラマー達が、我先にと初段を目標に研究開発を続けています。死活の判断、先読み、模様をはる、コウを仕掛けるなど、最近になり高度な技術を使うようになってきました。益々面白くなってきたという感じですね。あなたも挑戦してみますか?囲碁ソフトを開発するにあたり、基本的な知識を述べたいと思います。
    ●言語
      言語はなんでもいいのですが、強い思考ルーチンを作ろうとするならば、オブジェクト指向言語がいいでしょう。Java,C++,SmallTalk,Delphiなどがそうですが、私はMS-DOS版ではC++,Windows版ではDelphiで開発しています。間違っても人工知能言語で作ってはならない。人間が囲碁を考える時、オブジェクト指向であると言えるでしょう。盤上にオブジェクトがゴロゴロところがっていて、そのオブジェクトが手が進むにつれて変化していくわけですから、その情報をオブジェクトで生成して、そしてコンピュータに考えさせるわけです。Visual Basic でも作る事はできますが、処理時間が遅いのが難点です。
    ●認識
      まず、盤上がどういう状況なのかの認識をしなければなりません。碁盤、石、連、群、地という基本的なオブジェクトが存在しますが、これらの情報をデータとして生成します。碁盤には19×19路の場所があり、その場所には黒石が置かれているか、白石が置かれているか、または何も置かれていないかです。そして辺というものがあるという事もコンピューターに認識させる必要があります。ここから先は番外で打つことはできないという認識です。この認識をコンピュータに教える事は簡単です。次のような盤面になっている場合

       ABCDEFGHJ
      1・−−−−●○○・ 例えば
      2|++●+●●○| 何も置かれていない=0
      3|●●++●○○| 黒石が置かれている=1
      4|●○○○●++| 白石が置かれている=2
      5|○++●○○○| 辺(盤外である) =3
      6|+○+●●○●| とすると
      7|+○●+○●○|
      8|○●●+●●○|
      9・●○−−−−●・

      3,3,3,3,3,3,3,3,3,3,3
      3,0,0,0,0,0,1,2,2,0,3
      3,0,0,0,1,0,1,1,2,0,3
      3,0,1,1,0,0,1,2,2,0,3
      3,0,1,2,2,2,1,0,0,0,3
      3,0,2,0,0,1,2,2,2,0,3
      3,0,0,2,0,1,1,2,1,0,3
      3,0,0,2,1,0,2,1,2,0,3
      3,0,2,1,1,0,1,1,2,0,3
      3,0,1,2,0,0,0,0,1,0,3
      3,3,3,3,3,3,3,3,3,3,3 という具合になります。

      何故、黒石と白石を1と2にするかというと、この石の相手の石が...というときに
      wisi = isi ^ 3; //(C++)
      wisi := isi xor 3; //(Delphi)
      と簡単にコーディングできるからです。 何故回りに辺=3を置くかというと、これがないとわざわざ
      if ( x<1 or y<1 or 19< x or 19< y ) ;
      としなければならないからです。辺があれば
      if ( ban[x][y] = 3 ) ;
      だけで済みます。次に重要な連と群の認識の説明をしましょう。

    ●連オブジェクト
      連オブジェクト(連)とは縦横が隣接している石の固まりを言います。
      石を取るときの最小単位

      上左図を想定すると、上右図が連です。番号は連の識別番号です。
      1つの連には次のような情報があります。
      連識別番号、石の色、石の数、石の位置、縦横の接触している状態の数、縦横に接触している連、同じ群と見なされる回りの連、どの群に含まれているか、接触している空点の位置。
      連番号=04を例に取って説明しましょう。
      連識別番号:4
      石の色:黒
      石の数:3
      石の位置:[2,3][3,3][2,4]
      縦横の接触している状態の数:白石=2,空点=5
      縦横に接触している連:05,06,19
      同じ群と見なされる回りの連:03
      どの群に含まれているか:群番号
      接触している空点の位置:[2,2][3,2][4,3][1,3][1,4]

    連オブジェクトの作り方

      連に含まれる石の1つ1つの石の座標を求めます。まず、連オブジェクトに1点の座標を加えます。その点の上下左右を調べ同じ状態(同じ石)である点を加えます。次に前回加えた点の上下左右を調べます。この時1度調べた座標は考慮しません。同じように同じ状態(同じ石)である点を加えます。これを同じ状態のものがなくなるまで繰り返します。
    ●群オブジェクト ●地オブジェクト
      黒石に囲まれた空地を黒地、白石に囲まれた空地を白地となります。同じ色の地が縦横隣接している1つ固まりを地オブジェクトといいます。地オブジェクトは群オブジェクトの部品になり、群の死活に役立つものになります。この空地が黒石に囲まれているという認識をどうすればいいでしょう?まず、空地と石の関係情報を作成します。

      線が結ばれている空点と石には関係があります。 座標[2,4]の位置を考えてみましょう。 例えば、空点[2,4]は黒石[2,2]と一間の関係があります。 空点[2,4]は白石[5,4]とはなにも関係がない事になります。 左図は黒石と関係をいくつか持ち、白石とは1つも関係を持っていないので黒地と判断します。座標[2,6]に白石があるとどうでしょう? 右図は黒石と関係をいくつか持ち、白石とも1つも関係を持っているのでどちらの地でもないと判断します。つまり片方の石のみの関係がある場合にのみ地と判断されます。但し、死石がない場合に限ります。

      全ての空地に対し、黒地であるか、白地であるか調べます。すると同じ色の地で連続している領域ができます。これが地オブジェクトです。 紫の濃い部分は完全に黒地で、薄い部分は地と地でない部分の境界線で黒から打てば黒地になるが、白から打つと地でなくなっていまう可能性があります。どちらの地も地オブジェクトの要素として生成します。地オブジェクトの作り方は連オブジェクトと同じです。
      1つの地には次のような情報があります。
      地識別番号、地の色(黒地or白地)、含まれている群識別番号、地の数、地の位置、欠目、中石の存在、境界線、眼数。
    続く...

    GORO HomePageに戻る