質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
強化学習

強化学習とは、ある環境下のエージェントが現状を推測し行動を決定することで報酬を獲得するという見解から、その報酬を最大限に得る方策を学ぶ機械学習のことを指します。問題解決時に得る報酬が選択結果によって変化することで、より良い行動を選択しようと学習する点が特徴です。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

受付中

【AI】【強化学習】【Unity】【ML-Agents】車がうまく前に進んでくれない

omaetoomae
omaetoomae

総合スコア39

強化学習

強化学習とは、ある環境下のエージェントが現状を推測し行動を決定することで報酬を獲得するという見解から、その報酬を最大限に得る方策を学ぶ機械学習のことを指します。問題解決時に得る報酬が選択結果によって変化することで、より良い行動を選択しようと学習する点が特徴です。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

0回答

0評価

0クリップ

222閲覧

投稿2022/06/17 09:21

編集2022/06/26 09:57

実行したいこと

現在、Unityで,マップ内の建物をよけながら車を運転するBotをML-Agentsで実装しているのですが、自分が作ったBotの車がうまく進んでもらえず、ずっとその場でくるくる回っているだけです。

報酬内容

  • 前進、後退をするごとに報酬(0.001)を与える
  • くるくる回るのを防ぐため、 ハンドルを動かすと罰(-0.001)を与える
  • スポーンから300秒すると強制的にリスポーン
  • 死亡または壁にぶつかると罰(-10)を与える

毎回100万回ほど学習させていました。

コード

C#(Bot_ML.cs)

using System.Collections; using System.Collections.Generic; using UnityEngine; using Unity.MLAgents; using Unity.MLAgents.Sensors; using Unity.MLAgents.Actuators; public class Bot_ML : Agent //Agentクラスを継承する { public Bot bot_script; public BotCar botcar_script; public GameObject guns; private void Awake() { } //インスタンス生成時に呼ばれるメソッド public override void Initialize() { } public override void OnEpisodeBegin() { } // 観察の収集 public override void CollectObservations(VectorSensor sensor) { } public override void OnActionReceived(ActionBuffers vectorAction){ //操縦 int move_action = (int)vectorAction.ContinuousActions[0]; if(move_action == 1){ //前進 botcar_script.moveint = 1; AddReward(0.001f); } if(move_action == 2){ //後退 botcar_script.moveint = 2; //AddReward(0.001f); } int turn_action = (int)vectorAction.ContinuousActions[1]; if(turn_action == 1){ botcar_script.turn_int = 1; //左折 AddReward(-0.001f); } if(turn_action == 2){ botcar_script.turn_int = 2; //右折 AddReward(-0.001f); } } public void dead(){ AddReward(-10f); //エピソード終了 EndEpisode(); return; } }

C#(BotCar.cs)

using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEngine.UI; using Random = UnityEngine.Random; [System.Serializable] public class AxleInfo { public WheelCollider leftWheel; public WheelCollider rightWheel; public bool motor; public bool steering; } public class BotCar : MonoBehaviour { public List<AxleInfo> axleInfos; public float maxMotorTorque; public float maxSteeringAngle; private float NomalMotorTorque; private float ADSMotorTorque; private float BoostMotorTorque; public sys sys_script; //===settings=========================// public int moveint = 1; public int turn_int = 0; //=================================// //Bot_ML public Bot_ML ml_script; void Start() { NomalMotorTorque = maxMotorTorque; } // 対応する視覚的なホイールを見つけます // Transform を正しく適用します public void ApplyLocalPositionToVisuals(WheelCollider collider){ if (collider.transform.childCount == 0) { return; } Transform visualWheel = collider.transform.GetChild(0); Vector3 position; Quaternion rotation; collider.GetWorldPose(out position, out rotation); visualWheel.transform.position = position; visualWheel.transform.rotation = rotation; } private float motor; private float steering; public void FixedUpdate(){ foreach (AxleInfo axleInfo in axleInfos) { if (axleInfo.steering) { axleInfo.leftWheel.steerAngle = steering; axleInfo.rightWheel.steerAngle = steering; } if (axleInfo.motor) { axleInfo.leftWheel.motorTorque = motor; axleInfo.rightWheel.motorTorque = motor; } ApplyLocalPositionToVisuals(axleInfo.leftWheel); ApplyLocalPositionToVisuals(axleInfo.rightWheel); } } void Update(){ switch(moveint){ //移動 case 1: //前進 motor += maxMotorTorque * Time.deltaTime; //StartCoroutine("RandomMoveint"); break; case 2: //後退 motor -= maxMotorTorque * Time.deltaTime; //StartCoroutine("RandomMoveint"); break; } switch(turn_int){ case 1: //左折 if(steering <= -maxSteeringAngle){ steering -= maxSteeringAngle * Time.deltaTime; //StartCoroutine("RandomMoveint"); } if(steering <= maxSteeringAngle){ steering = -maxSteeringAngle; } break; case 2: //右折 if(steering <= maxSteeringAngle){ steering += maxSteeringAngle * Time.deltaTime; //StartCoroutine("RandomMoveint"); } if(steering <= maxSteeringAngle){ steering = maxSteeringAngle; } break; } } }

C#(Bot.cs(一部のみ抜粋))

private IEnumerator autoRespawn(){ yield return new WaitForSeconds(300f); StartCoroutine("dead"); //死亡処理 } public void atDead(){ StartCoroutine("dead"); //死亡処理 }

試したこと

こちらのサイトを参考にして上記の報酬を設定したのですが、うまく動作しませんでした。


説明の不足などがあれば追記します。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

Bongo

2022/06/26 00:57

「くるくる回るのを防ぐため、 ハンドルを動かすと罰(-0.001)を与える」とのことですが、ご提示のコードを拝見しますに、いったんハンドルを切った以降はハンドルを動かさなければ減点なしでずっと回り続けることができるかもしれません。ハンドルを動かしたときに減点するよりも、毎フレームsteeringの絶対値に比例して減点するルールにした方がまっすぐ走るようになるんじゃないでしょうか。 とはいえ、まだ私の方で実際に動かして確認したわけではないため追記依頼欄でのコメントにとどめることにいたしました。もしかすると他の原因があるかもしれず、なるべくご質問者さんのシーンを忠実に再現して試さないと食い違いが生じてしまいそうです。 もしハンドル操作時の減点ルールの調整で改善すれば問題ないのですが、ダメそうでしたらもっと詳しく調べてみようと思います。その場合は、プロジェクトをどこかにアップロードしていただけるとありがたいです(おそらくシーンの作りや障害物の配置なども含めて詳しくご説明いただくには、質問投稿欄だけではきついんじゃないでしょうか)。 ※なお、ちょっと見た感じですとBotCar.csのステアリング部分の条件が奇妙なように感じました。turn_intを切り替えたときに意図通りにホイールが動いているでしょうかね?

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

強化学習

強化学習とは、ある環境下のエージェントが現状を推測し行動を決定することで報酬を獲得するという見解から、その報酬を最大限に得る方策を学ぶ機械学習のことを指します。問題解決時に得る報酬が選択結果によって変化することで、より良い行動を選択しようと学習する点が特徴です。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。