Unityでガイスターを作って、原始モンテカルロ法のAIを実装した

ドイツで考案されたボードゲームであり、ゲーム理論において二人零和有限確定不完全情報ゲームに分類されるガイスターをUnityで作りました。
このページで遊べます→ガイスター(Geister) | UnityGameUploader

f:id:ogamita777:20150608020816p:plain

今回、合法手の中からランダムで1つ選択するAIと思考時間が1秒と5秒の原始モンテカルロ法のAIの計3つを実装し、100回ずつ対戦させてみました。原始モンテカルロ法は簡単に言うと、ランダムなシミュレーションを用いて最も勝つ確率が高そうな手を算出するアルゴリズムです。

対戦結果

先手 対戦結果 後手
ランダム 53 - 47 ランダム
原始モンテカルロ法(1秒) 82 - 18 ランダム
原始モンテカルロ法(5秒) 92 - 8 ランダム
原始モンテカルロ法(1秒) 21 - 79 原始モンテカルロ法(5秒)

考察と展望

原始モンテカルロ法のAIは思考時間が数秒単位の間は時間が長いほど強くなりそうです。思考時間を長くしても強くならない頭打ちがあると考えられますが、それを調べようとすると膨大な時間が掛かりそうなのでやりません(原始モンテカルロ法(1秒) VS 原始モンテカルロ法(5秒) の結果を出すのに半日ほど掛かってます..)。
時間があれば、原始モンテカルロ法を発展させたUCT*1などのアルゴリズムを実装したAIを作ってみたいと思います。

Unityで逆ジオコーディングしてみた

ogamita777/unity-geocoding-test

↑が今回制作したものです。
Unity 4.6.3f1 + Nexus 5(Android 5.0.1) で動作確認済みです。

1. GPS情報を取得する

Unityで位置情報を取得 - チラ裏Unityを参考したらできました。

2. GPS情報を逆ジオコーディングする

簡易逆ジオコーディングサービスで緯度と経度をURLで指定することにより住所のJSONデータを取得できました。

double latitude = Input.location.lastData.latitude;
double longitude = Input.location.lastData.longitude;
WWW results = new WWW("http://www.finds.jp/ws/rgeocode.php?json&lat=" + latitude + "&lon=" + longitude); // 逆ジオコーディング

yield return results;

3. 取得したJSONデータをUnityで扱えるようにする

MiniJSONを使いました。

var search  = Json.Deserialize(results.text) as IDictionary;
var result = search["result"] as IDictionary;
var prefecture = result["prefecture"] as IDictionary;
var municipality = result["municipality"] as IDictionary;
string currentPosition = prefecture["pname"] as string + municipality["mname"] as string;

4. uGUIのTextに取得した住所を代入

GameObject.Find("Text").GetComponent<Text>().text = currentPosition;