2020年11月26日木曜日

Pythonによる囲碁ゲームの表現

囲碁ディープラーニングプログラミング(原書:Deep Learning and the Game of Go)を読んでみた際のメモです.囲碁ディープラーニングプログラミングの 第I部 第3章では,Pythonによる囲碁ゲームの実装( dlgo と呼ばれるモジュールを段階的に構築して,Python上で囲碁ゲームを表現する)が始まります.

囲碁を表現するライブラリを構築するために必要なデータモデルは以下の4つになります.

  1. 人間相手の対局で,ゲームの進行状況を追跡する.
  2. ボット同士の対局で,ゲームの進行状況を追跡する.
  3. 同じ局面から予測される多くの手順を比較する.
  4. 棋譜をインポートして,それから訓練データを生成する.

1. 2. は同じことのように見えますが,わずかな違いがあります(ゲームの終局の認識).

実装は,プレーヤーや,着手が何であるかといったいくつかの簡単な概念から始めます.これらの概念は,上記のタスクに取り組むための基礎となります.

フォルダ構成は以下のようになり,dlgoフォルダの中に3つの.pyファイルが格納される形になります.

    dlgo -   init_.py

            -   go types.py

            -   go board_slow.py

黒と白のプレーヤーは交互に手番を握ります.異なる石の色を表現するために,以下のenumを使います.一度プレーヤーが石を置くと,Playerインスタンスのotherメソッドを呼び出すことで色を切り替えることが可能です.


このPlayerクラスをgotypes.pyに追加します.

盤上の座標を表すために,タプルを使用します.名前つきタプルを使用すると,point[0]とpoint[1]の代わりにpoint.rowとpoint.colとして座標にアクセスできます.これにより読みやすさが大幅に向上します.

このPointクラスをgo types.pyに追加する

プレーヤーが1手で取ることができる行動を表す構造も必要です.通常,手番では盤上に石を置きますが,プレーヤーはいつでもパス,または投了することができます.

着手(move)は打つ,パス,投了の3つの行動のいずれかを意味します.打つ(play)は石を置くことを意味します.Moveクラスでは,3つのタイプの着手(打つ,パス,投了)を全てコードで表現し,着手がこれらのタイプのうち1つに対応することを確認します.打つ場合は,打つ場所のPointを引数として渡す必要があります.


このMoveクラスはgoboard_slow.pyファイルに追加します.

上記の3つのクラス(Player, Point, Move)は,プレーンなデータ型で,これらは盤を表現するための基本になりますが,ゲームのロジックは含んでいません(ゲームプレイの懸案事項を分けるとメリットがあるので,これは意図的に行われている).

盤から石を取り除く条件をチェックするアルゴリズム(Boardクラス(石を置くロジックと石を取るロジック))

  1. 隣接する点のいずれかに呼吸点が残っているかどうかを確認する.
  2. 隣接する点に隣接する点のいずれかに呼吸てんが残っているかどうかを確認する.
  3. 隣接する点に隣接する点に隣接する点...と次々に調べる必要がある.

この手順では,完了するまでに数百のステップが必要になることがあるので,この処理を高速化するために,直接接続された全ての石を1つの構成単位として明示的に追跡することを考えます.



Deep Learning and the Game of Goの全てのコードはGItHubの方で公開されています.

 



0 件のコメント :

コメントを投稿