前回の記事において、三目並べにおける推奨の手を学習したマシンを作成し、成績もよかったように見えました。
しかし、その成績とは、自身で準備したシミュレーション環境におけるものであり、井の中の蛙である可能性があります。
そこで、今回は、前回学習した「三目並べマシン」を、外部の環境(=Googleが提供している無料ゲーム)で勝負させてみようと思います。前回の記事にも書きましたが、Google検索で「三目並べ」と検索すると見つかります。そして、手動操作の手間を省くため、この環境の利用をオープンソースRPAソフトである「SikuliX」を用いて、自動化してみます。
1.SikuliXについて
SikuliXは、OpenCVを利用したGUIオートメーションツールで、Java実行環境の上で動作します。また、スクリプトをJythonかJRubyで記述でき、例えば、Jythonであれば、Python2のコードでJavaを操作することになります。
(イメージ図: 引用:How Sikuli Works)
このソフトウェアは、MITのUser Interface Design Groupが始めたOSS「Sikuli」が大本らしく、そのプロジェクトが終了した後に、RaiMan氏が開発とサポートを引き継ぎ「SikuliX」として公開しているようです。
(参考: Sikuli is God’s Eye)
※その他、参考ページ:
2.SikuliXのインストール
SikuliXのインストール手順を説明します。
【環境】
・Windows 10 pro
・java version “10.0.2” 2018-07-17
- Sikuliより、インストーラ「sikulixsetup-1.1.3.jar」をダウンロードします
※執筆時点の最新バージョンは「1.1.4」のようなのですが、
インストールが簡単であるとの記事がネット上で見受けられたので、「1.1.3」を利用しました。 - 「sikulixsetup-1.1.3.jar」を実行します
- 「はい」をクリックします
- 「1-Pack1」「2-Pack2」をONにします
※プロキシ環境下で利用する場合は「Hostname or IP-Address」、「Portnumber」も設定します - 「はい」をクリックします
- 「はい」をクリックします
- インストール成功時のメッセージ
- インストーラのあったフォルダに、以下のようにファイルが展開されます。
3.実装内容(1):学習済み重みの出力と推論処理の作成
学習内容の詳細は、下記の「暗記学習(Rote Learning)で三目並べを強くする」の記事を参照頂ければと思いますが、今回は、その中でも、「先攻/後攻マシンを同時に最初から学習させる」というものを利用しました。
次に、学習済み重みを基に、「盤面の状況から次の手を推奨する」処理を作成します。
-
サンプルコード:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667# -*- coding: utf-8 -*-import sysimport osimport numpy as npimport pickleimport random# 学習データの読み込み#learning_weight_name = "learning_weight.pickle"learning_weight_name = "learning_weight_for_python2_7.pickle"if os.path.exists(learning_weight_name):with open(learning_weight_name, mode='rb') as f_ld:learning_weight = pickle.load(f_ld)else:# 初期化learning_weight = {}learning_weight.clear()def select_position(key, used_position):"""(学習された重みを利用して)局面での指し手を決めるArgs:key (str) :局面のキー(関数make_keyで作成)used_position (list):既に打たれている手の場所Returns:int:次の指し手{0~8:次の指し手、-1:次の指し手がない場合}"""global learning_weightif key not in learning_weight:learning_weight[key] = np.ones(9, dtype=int) # 初期化# 局面の重みを取得target_weight = learning_weight[key]values = []i = 0for weight in target_weight:if i in used_position:weight = 0 # 使用済みの場所を指せないようにするvalues.extend([i]*weight) # 学習時のアルゴリズムi += 1# 指し手の選択if len(values) == 0:return -1 # 次に選択できる指し手が存在しない場合else:random.shuffle(values)return np.random.choice(values)## -----------------------------## main 処理## -----------------------------if __name__ == "__main__":try:# 引数の受け取りargs = sys.argvkey = args[1]# 初期化init_value = 0 # 盤面の初期状態# 既に打たれている手の場所の取得used_position = list(np.where(np.array(list(map(int, key.split(",")))) != init_value)[0])ret = select_position(key, used_position)print(ret) # 正常終了の場合:-1~8except:print(-2) # 異常終了の場合:-2
4.実装内容(2):RPA部分の開発
SikuliXではJythonが利用でき、Pythonコードでコードが書けるということですが、やはり完全にPythonと同じように利用できるわけではありません。前述の実装内容(1)でpyファイルを作成しましたが、このモジュールをJythonでImportして利用することができませんでした。理由は、Pythonでライブラリ「Numpy」を利用していますが、Jythonでは「Numpy」をImportできなかったからです。その為、外部Pythonプログラムとして実行して、その結果を受け取るようにしました。
SikuliXのコードは以下のようになりました。
上記コードを見てもらったら分かるように、画像がコード内に挿入されています。
例えば、以下は、画面上から碁盤の画像を探し出し(類似度30%以上)、その座標を取得という処理であり、
以下は、画面上から「ゲームを再開」という画像を探し出し、その中心座標をクリックするという処理になります。
5.動作デモ
それでは、実装が全て完了したので、いよいよRPAを用いて、前回開発した「三目並べマシン」をGoogleのゲームと勝負をさせてみます。
-
- 今回のRPAを実行する前の準備作業として、ブラウザで三目並べの画面を表示しておきます
- 作成済みのRPAを実行します
- 最初に、三目並べを連続で何回対戦させたいかを、ポップアップさせた画面に入力します
- 以降は、指定した回数分だけ、RPAが処理を実行します
- 最後に、処理結果(勝率、勝ち数、引き分け数)を表示して、終了になります
6.最後に
今回のRPA開発では、処理対象を画像を基に特定していくことになったので、盤面のクリックする位置がずれてしまうし、テストケースの実行準備に手間がかかったりしました。このような、処理毎に画像が変化していくことへの考慮といったRPA特有の対応処理が必要でした。
また、SikuliXの今回のバージョンでは、IDEでの入力補助がありませんでしたし、Jythonにおいては、普段使い慣れているPythonライブラリを利用できず、コーディングに手間取りました。開発中ではありますが、Pythonからpy4jを用いてSikuliXを動かすというプロジェクトも存在しているようですし、これがうまくいくと、さらに便利に使えるようになりそうです。
それから、暗記学習で学習した「三目並べマシン」の性能ですが、デモの動画を見ても分かるように、あまりよろしくないことが明確になりました。ゲームの難易度を「低」にすれば、なんとか勝てましたが、「中」以上ではほとんど勝てませんでした。やはり強化学習でやってみないといけませんね。
執筆者プロフィール
- 入社以来、C/S型の業務システム開発に従事してきました。ここ数年は、SalesforceやOutSystemsなどの製品や、スクラム開発手法に取り組み、現在のテーマは、DeepLearning/機械学習です。
この執筆者の最新記事
- Pick UP!2021.11.11VoTTを複数人で使って、アノテーションを行いたい!(ファイル移行を用いて)
- Pick UP!2020.11.20AIoTデバイス「M5StickV」、はじめの一歩
- RPA2019.08.15「OSSのRPA」+「自作の三目並べマシン」でGoogleに挑む!
- AI2019.04.22暗記学習(Rote Learning)で三目並べを強くする