0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Kaijo Physics ClubAdvent Calendar 2024

Day 23

ML-AgentsでAIにゲームをさせてみた

Last updated at Posted at 2024-12-22

はじめに

この記事では、文化祭に展示していた、AIがプレイしているゲームのAIをどう作ったかを説明していきます

作ったもの

りんごと爆弾が上から落ちてくるシンプルなゲームを作成し、AIに「りんごを取る」「爆弾を避ける」行動を学習させました。

スクリーンショット 2024-11-29 12.35.37.png

作品作成の流れ

以下の4つの手順でゲームを作成しました:

  1. Unityで基本的なゲームを作成する
  2. ML-Agentsをインストールしてセットアップする
  3. AIが学習できる環境と設定を作る
  4. 深層強化学習を使ってAIをトレーニングする

各ステップの詳細を順に説明していきます。

1. Unityでゲームをつくる

本当に少しUnity(およびC#)の知識があれば簡単なゲームは作れます。

プログラム面では今回は、りんご・爆弾を管理するプログラム(FallController.cs)、プレイヤーを操作するプログラム(AgentController.cs)を作成しました。

FallController.csでは、落とすオブジェクトの種類(りんごか爆弾か)や、オブジェクトの位置(プレイヤーとの当たり判定で使う)などを管理し、プレイヤーと当たったかどうかを確認して、当たったら上から落とす関数などを作り、

AgentController.csでは、パソコンの矢印キーで動くようにし、りんごに触れたらポイントを増やし、爆弾に触れたら減らす関数などを作っています。

2. ML-AGentsをインストール

ML-Agentsは、UnityでAIをトレーニングしたり、ゲーム内で動作させたりするためのフレームワークです。これを使用することで、深層強化学習を手軽に導入できます。

現在公開されているのは、「ML-Agents-Release-22」というバージョンなのですが、僕は「ML-Agents-Release-20」を使いました(特に理由はありません)

3.0. 深層強化学習とは

深層強化学習では、AIが動いた動きがどれくらい良いか、どれくらい悪いかを評価していくことでAIの行動をどんどん改善させていく手法です。

まず最初に、AIに情報を与える設定をします。

次に、どんな時に報酬を与えるかの設定を考えます。

これで学習すると、この条件で高得点を取るようにAIが行動を改善していってくれます。

3. AIの設定と学習の準備

AIが学習できるように、ゲームのプログラムを少し変更する必要があります。

全部説明すると長いので、簡単に説明します。


2. AIに与える情報を設定

AIはゲーム環境の情報を元に行動を決定します。そのため、CollectObservations関数というものをつかってAIに与える情報の設定をしました。

与えた情報としては、今回の場合は、落ちてくるものをとった時のポイント、落ちてくるものの速さ、場所を設定しました。

public override void CollectObservations(VectorSensor sensor)
{
    sensor.AddObservation(Apple.transform.position.x); // りんごのx座標
    sensor.AddObservation(Bomb.transform.position.x);  // 爆弾のx座標
    sensor.AddObservation(transform.position.x);       // プレイヤーのx座標
}

↑プログラムイメージ


3. AIの行動を受け取る

AIが選んだ行動に応じて、プレイヤーを操作します。

AIは-1~1の値で行動を表してくるので、適切に動くようなプログラムをかきます。

今回はAIは右・左にだけ動くので値が大きいほど右に、小さいほど左に動かすようにしました。

public override void OnActionReceived(ActionBuffers actions)
{
    float moveX = actions.ContinuousActions[0]; // AIが選択した行動
    transform.Translate(moveX * Time.deltaTime * speed, 0, 0); // プレイヤーを移動
}

↑プログラムイメージ


4. 報酬の設定

AIに行動の良し悪しを教えるために、「報酬」の設定をします。

例えば、今回は、りんごを取ったら+1, 爆弾を取ったら-5, りんごを無視したら-0.1, 爆弾を取ったら+0.5という得点をAIに与えるようにしています。

if (hitApple)
{
    AddReward(1.0f); // りんごを取ったら +1
}
if (hitBomb)
{
    AddReward(-5.0f); // 爆弾を取ったら -5
}
if (missedApple)
{
    AddReward(-0.1f); // りんごを無視したら -0.1
}
if (avoidedBomb)
{
    AddReward(0.5f); // 爆弾を回避したら +0.5
}

↑プログラムイメージ


5. エピソードを終了する

ゲームが終了したとき、AIのプレイを強制的に終わらせてあげます

AIは、何千万回もプレイを繰り返す中で少しずつ上達していきます。この1プレイ(エピソード)の間に、どんな行動が良かったか、悪かったかを評価し、それを基に次のプレイで行動を改善していきます。

鬼ごっこなどは鬼に捕まったら終わりなのに対し、今回は明確な終わりが存在しません。なので、AIが~回行動を選択したら終わらせる、のような設定にしました。

if (gameOver)
{
    EndEpisode(); // ゲーム終了
}

↑プログラムイメージ

4. AIの学習

あとは先ほどのプログラムと、AIの学習方法(どれくらい複雑な学習をするのか、深層強化学習の中の種類、AIを何回に一回保存するか、AIに何回プレイさせるか)などの設定を作り、それをもとにコマンドで学習したら完成です!

おわりに

どうでしたか?ML-Agentsでは簡単にAIを使ったゲームが作れるような色々なものが用意されているため、相当簡単にゲームにAIを実装することができます!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?