v3.0】自作シンプルゲームをAIに攻略させる以前から機械学習などに興味があったものの、難しそうでためらっていたのですが、Unityで強化学習ができるML-Agentsというものがあると知り、理論についてほぼ何も知識のない自分でも、なんだかいけそうだと思って試してみました。src="https://qiita-image-store.s3.amazonaws.com/0/223765/9ab97616-ae93-5561-0412-36aa5a091930.png">まずは[公式サンプルゲーム](https://github.com/Unity-Technologies/ml-agents)を動かしてみたのですが、何か自作ゲームを学習させてみないと理解が進まないと思い、なるべくシンプルで最小限の構成になるようなゲームを考えました。Unityを使うので物理演算も入れたい。![bounce-player.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/223765/4aa58df9-7947-b285-427e-54968c6969ee.gif)そこで考えたのが、上から降ってくる物体をヘディングのようにバウンドさせるゲームです。人間がプレイするとこんな感じになります。これを強化学習させて攻略させてみました。これ以下の内容はML-Agentsの公式サンプルを動かすところまで出来る方が対象です。Qiitaにも他の方が書いた記事があるので参考にして下さい。src="https://qiita-image-store.s3.amazonaws.com/0/223765/228184a8-79ba-6934-0099-877a155a4622.png">-上からボールが降ってきて、下の大きいボール(Player)で跳ね返します。操作は左右キーのみです。+左右の壁とボール(小)、Player(ボール大)のみです。ボールは反発係数1にしてあるのでよく弾みます。いうか、弾むたびに微妙に動きが大きくなります。?でも割と面白いのでそのままにしています。何度も弾ませたり、壁を使って連続で弾ませると、壁を超えてしまいます。それをクリア条件にすればよかった、と後から思いつきました、が本題ではないので省いてます。++このゲームのセットを1つのAgentとして、8つのAgentsを配置し学習を開始します。++シーンをスタートすると、Playerの上からボールが降ってきて、下の大きいボール(Player)で跳ね返します。操作は左右キーのみです。→MoveAgentに記述-ボールを下に落とすとDone()が呼ばれてリセットされます。+ボールをPlayerのy座標よりも下に落とすと、Done()が呼ばれてリセットされます。→AgentActionに記述+取得する状態数は1つだけ。ボールとPlayerのx座標の相対位置を取得します。+→CollectObservations()に記述++報酬はボールを跳ね返したら1点追加します。+→OnCollisionEnter()にSetReward(1f)を記述++ボールを落とした場合に報酬を減らす方法も試しましたが、うまくいかなかったのでコメントアウトしています。0);}}}```-状態数は1つだけ。ボールとPlayerのx座標の相対位置を取得します。-→CollectObservations()に記述--報酬はボールを跳ね返したら1点追加します。-→OnCollisionEnter()にSetReward(1f)を記述--ボールを落とした場合に報酬を減らす方法も試しましたが、うまくいきませんでした。src="https://qiita-image-store.s3.amazonaws.com/0/223765/343b4d2b-6cfe-6e9e-aa88-2cb99a1bb937.png">10万回学習させたところ、7回ぐらい跳ね返せるようになりました。src="https://qiita-image-store.s3.amazonaws.com/0/223765/87d67b15-3a7b-b17d-dd86-fcfec4331ea9.png">その他の値はこのようになっています。これらが何を意味しているのかよくわかっていないので、分かる方はぜひ教えてください。今回の学習結果では、ボールのx座標に追従するような動きになっています。このような動きは、わざわざ強化学習でなく、コードを書くだけでも似たような動きが実現できると思います。人間的な動きとしては、落下地点を予測してあらかじめ移動しておくものになるはずです。そのために、状態数や報酬の与え方を工夫する必要が有る、ということを実感できました。今回WebGL版をビルドしようとしましたが、エラーが出てビルドできませんでした。これについても詳しい方、コメント頂けると幸いです。#制作物macでとりあえず動きを見たい人用のappです。[http://mixsandwich.info/Bounce.zip](http://mixsandwich.info/Bounce.zip)ソースコードです。スクリプト見たり、ビルド&学習させたい時用。