前提・実現したいこと
ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
こんにちは、UnityでML-Agentsを触り始めて3か月程度の初心者です。 現在、火災が発生した際に人が避難する様子をシミュレーションするために、その練習として人(エージェント)が避難口(ターゲット)を見つけるとそこへ向かい、到達すると避難完了というような仕組みを作っています。 Unityではじめる機械学習強化学習Unity ML-Agents実践ゲームプログラミングv1.1対応版という本を教材として、強化学習を進めていたのですが、どうしても解決できない問題が出てきたので質問させていただきます。 観察はできるだけ人間の感覚に近いものを使おうと考え、RayPerceptionSensor3Dを用いているのですが、エージェントが複数のターゲットを補足したときに迷ってしまい、なかなかターゲットにたどり着かないという状況になっています(根気よく待てばターゲットのほうへ向かってくれますが、必ずしも一番近いターゲットとは限らないです)。 最終的には火災時の避難シミュレーションが目的なので時間をかけず素早くターゲットへ向かってほしいところなのですが、どうもうまくいきません。 例えばRayPerceptionSensor3Dを用いて把握したターゲットと、エージェントとの距離を取得してできるだけ距離の近いほうのターゲットへ迷わずに向かうというような方法があれば教えていただけないでしょうか? もしくは、学習方法が悪いのではないか、この方法を使ったほうが良いのではないかなどの指摘があればお願いしたいです。 何卒宜しくお願い致します。
該当のソースコード
C#
1using System.Collections.Generic; 2using UnityEngine; 3using Unity.MLAgents; 4using Unity.MLAgents.Sensors; 5 6// RollerAgent 7public class Normal : Agent 8{ 9 Rigidbody rBody; 10 11 // 初期化時に呼ばれる 12 public override void Initialize() 13 { 14 this.rBody = GetComponent<Rigidbody>(); 15 } 16 17 // エピソード開始時に呼ばれる 18 public override void OnEpisodeBegin() 19 { 20 // RollerAgentの位置と速度をリセット 21 this.rBody.angularVelocity = Vector3.zero; 22 this.rBody.velocity = Vector3.zero; 23 this.transform.localPosition = new Vector3(Random.value * 36 - 18, 0.5f, Random.value * 36 - 18); 24 25 } 26 27 // 行動実行時に呼ばれる 28 public override void OnActionReceived(float[] vectorAction) 29 { 30 // RollerAgentに力を加える 31 Vector3 controlSignal = Vector3.zero; 32 controlSignal.x = vectorAction[0]; 33 controlSignal.z = vectorAction[1]; 34 rBody.AddForce(controlSignal * 25); 35 36 // RollerAgentが床から落下した時 37 if (this.transform.localPosition.y < 0) 38 { 39 EndEpisode(); 40 } 41 42 //スペースキーを押したらエピソード終了 43 if (Input.GetKey(KeyCode.Space)) 44 { 45 EndEpisode(); 46 } 47 48 } 49 50 private void OnCollisionEnter(Collision collision) 51 { 52 //ゲームタグ"Target"にぶつかったら報酬 53 if (collision.gameObject.CompareTag("Target")) 54 { 55 AddReward(1.0f); 56 EndEpisode(); 57 } 58 } 59 60 public void FixedUpdate() 61 { 62 AddReward(-0.001f); 63 } 64 // ヒューリスティックモードの行動決定時に呼ばれる 65 public override void Heuristic(float[] actionsOut) 66 { 67 actionsOut[0] = Input.GetAxis("Horizontal"); 68 actionsOut[1] = Input.GetAxis("Vertical"); 69 } 70} 71 72 73```###学習用のPPOファイル 74behaviors: 75 Normal: 76 trainer_type: ppo 77 hyperparameters: 78 batch_size: 10 79 buffer_size: 100 80 learning_rate: 0.0003 81 beta: 0.005 82 epsilon: 0.2 83 lambd: 0.95 84 num_epoch: 3 85 learning_rate_schedule: linear 86 network_settings: 87 normalize: true 88 hidden_units: 128 89 num_layers: 2 90 vis_encode_type: simple 91 reward_signals: 92 extrinsic: 93 gamma: 0.99 94 strength: 1.0 95 keep_checkpoints: 5 96 max_steps: 500000 97 time_horizon: 64 98 summary_freq: 1000 99 threaded: true 100
### 試したこと 複数あるターゲットの大きさや位置を変えてみる →複数あるターゲット同士にある程度の距離があると迷わずに向かっていく ターゲットを複数でなく一つにしてみる →迷わずに一直線にターゲットへ向かっていく 時間が経つごとにマイナスの報酬を与えてみる →特に変化なし ### 補足情報(FW/ツールのバージョンなど) Unityのバージョン:2019.4.1f1 mlagentsのバージョン:Release8 以下学習結果のグラフです。 上からCumulative Reward,Episode Lengthのグラフとなっています。 ![イメージ説明](92e371b364bdb81bbe1f6c616b81172b.png) 以下学習モデルです。 青色のエージェントが4隅の黄色いターゲットへ向かっていく想定をしています。 ![イメージ説明](593ea4e354d5bbaade596c0acfddd8be.jpeg) ![イメージ説明](fcc3585fc29cd83221feb141e344eb73.jpeg)
あなたの回答
tips
プレビュー