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

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

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

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

Unity3D

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

機械学習

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

0回答

971閲覧

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

omaetoomae

総合スコア41

強化学習

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

Unity3D

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

機械学習

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2022/06/17 09:21

編集2022/06/17 09:23

実行したいこと

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

報酬内容

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

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

コード

C#(Bot_ML.cs)

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using Unity.MLAgents; 5using Unity.MLAgents.Sensors; 6using Unity.MLAgents.Actuators; 7 8public class Bot_ML : Agent //Agentクラスを継承する 9{ 10 public Bot bot_script; 11 public BotCar botcar_script; 12 13 public GameObject guns; 14 15 private void Awake() 16 { 17 18 } 19 20 //インスタンス生成時に呼ばれるメソッド 21 public override void Initialize() 22 { 23 24 } 25 26 public override void OnEpisodeBegin() { 27 28 } 29 30 31 // 観察の収集 32 public override void CollectObservations(VectorSensor sensor) { 33 } 34 public override void OnActionReceived(ActionBuffers vectorAction){ 35 36 //操縦 37 int move_action = (int)vectorAction.ContinuousActions[0]; 38 39 if(move_action == 1){ //前進 40 botcar_script.moveint = 1; 41 AddReward(0.001f); 42 } 43 if(move_action == 2){ //後退 44 botcar_script.moveint = 2; 45 //AddReward(0.001f); 46 } 47 48 int turn_action = (int)vectorAction.ContinuousActions[1]; 49 50 if(turn_action == 1){ 51 botcar_script.turn_int = 1; //左折 52 AddReward(-0.001f); 53 } 54 if(turn_action == 2){ 55 botcar_script.turn_int = 2; //右折 56 AddReward(-0.001f); 57 } 58 } 59 60 public void dead(){ 61 AddReward(-10f); 62 //エピソード終了 63 EndEpisode(); 64 return; 65 } 66 67}

C#(BotCar.cs)

1using UnityEngine; 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine.UI; 5using Random = UnityEngine.Random; 6 7[System.Serializable] 8public class AxleInfo { 9 public WheelCollider leftWheel; 10 public WheelCollider rightWheel; 11 public bool motor; 12 public bool steering; 13} 14 15public class BotCar : MonoBehaviour { 16 public List<AxleInfo> axleInfos; 17 public float maxMotorTorque; 18 public float maxSteeringAngle; 19 private float NomalMotorTorque; 20 private float ADSMotorTorque; 21 private float BoostMotorTorque; 22 public sys sys_script; 23 //===settings=========================// 24 public int moveint = 1; 25 public int turn_int = 0; 26 //=================================// 27 //Bot_ML 28 public Bot_ML ml_script; 29 30 void Start() 31 { 32 NomalMotorTorque = maxMotorTorque; 33 } 34 // 対応する視覚的なホイールを見つけます 35 // Transform を正しく適用します 36 public void ApplyLocalPositionToVisuals(WheelCollider collider){ 37 if (collider.transform.childCount == 0) { 38 return; 39 } 40 41 Transform visualWheel = collider.transform.GetChild(0); 42 43 Vector3 position; 44 Quaternion rotation; 45 collider.GetWorldPose(out position, out rotation); 46 47 visualWheel.transform.position = position; 48 visualWheel.transform.rotation = rotation; 49 } 50 51 private float motor; 52 private float steering; 53 public void FixedUpdate(){ 54 foreach (AxleInfo axleInfo in axleInfos) { 55 if (axleInfo.steering) { 56 axleInfo.leftWheel.steerAngle = steering; 57 axleInfo.rightWheel.steerAngle = steering; 58 } 59 if (axleInfo.motor) { 60 axleInfo.leftWheel.motorTorque = motor; 61 axleInfo.rightWheel.motorTorque = motor; 62 } 63 ApplyLocalPositionToVisuals(axleInfo.leftWheel); 64 ApplyLocalPositionToVisuals(axleInfo.rightWheel); 65 } 66 } 67 void Update(){ 68 switch(moveint){ //移動 69 case 1: //前進 70 motor += maxMotorTorque * Time.deltaTime; 71 //StartCoroutine("RandomMoveint"); 72 break; 73 case 2: //後退 74 motor -= maxMotorTorque * Time.deltaTime; 75 //StartCoroutine("RandomMoveint"); 76 break; 77 } 78 switch(turn_int){ 79 case 1: //左折 80 if(steering <= -maxSteeringAngle){ 81 steering -= maxSteeringAngle * Time.deltaTime; 82 //StartCoroutine("RandomMoveint"); 83 } 84 if(steering <= maxSteeringAngle){ 85 steering = -maxSteeringAngle; 86 } 87 break; 88 case 2: //右折 89 if(steering <= maxSteeringAngle){ 90 steering += maxSteeringAngle * Time.deltaTime; 91 //StartCoroutine("RandomMoveint"); 92 } 93 if(steering <= maxSteeringAngle){ 94 steering = maxSteeringAngle; 95 } 96 break; 97 } 98 } 99}

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

1private IEnumerator autoRespawn(){ 2 yield return new WaitForSeconds(300f); 3 StartCoroutine("dead"); //死亡処理 4} 5public void atDead(){ 6 StartCoroutine("dead"); //死亡処理 7}

試したこと

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


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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bongo

2022/06/26 00:57

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問