メインコンテンツ

SimulinkEnvWithAgent

Simulink で実装された動的モデルによる強化学習環境

説明

SimulinkEnvWithAgent オブジェクトは、Simulink® で実装された動的モデルを使用する強化学習環境を表します。環境オブジェクトはインターフェイスとして機能します。sim または train を呼び出すと、これらの関数が (コンパイル済みの) Simulink モデルを呼び出してエージェントの経験を生成します。

作成

SimulinkEnvWithAgent オブジェクトを作成するには、次のいずれかの関数を使用します。

  • rlSimulinkEnv — 少なくとも 1 つの RL Agent ブロックを含む Simulink モデルを使用して環境を作成します。

  • createIntegratedEnv — 参照モデルを強化学習環境として使用します。

  • rlPredefinedEnv — 事前定義済みの強化学習環境を作成します。

プロパティ

すべて展開する

Simulink モデル名。string または文字ベクトルとして指定します。指定したモデルには、1 つ以上の RL Agent ブロックが含まれていなければなりません。

エージェント ブロックのパス。string または string 配列として指定します。

Model に学習用の単一の RL Agent ブロックが含まれている場合、AgentBlock はブロックのパスを含む string になります。

Model に学習用の複数の RL Agent ブロックが含まれている場合、AgentBlock は各要素に 1 つのエージェント ブロックのパスを含む string 配列になります。

Model には、AgentBlock にパスが含まれていない RL Agent ブロックを含めることができます。このようなエージェント ブロックは環境の一部として動作し、現在の方策に基づいてアクションを選択します。sim または train を呼び出す際、これらのエージェントの経験は返されず、方策も更新されません。

エージェント ブロックはモデル参照の中に置くことができます。強化学習用のエージェント ブロックの構成の詳細については、RL Agent を参照してください。

環境のリセット動作。関数ハンドルまたは無名関数ハンドルとして指定します。関数は、1 つの Simulink.SimulationInput 入力引数と 1 つの Simulink.SimulationInput 出力引数をもたなければなりません。Simulink シミュレーション入力オブジェクトの詳細については、Simulink.SimulationInput (Simulink) を参照してください。

リセット関数は、Simulink 環境の初期状態を設定します。たとえば、各学習エピソードが異なる初期条件から開始されるように、特定のブロック状態をランダム化するリセット関数を作成できます。

MATLAB® パス上に既存のリセット関数 myResetFunction がある場合は、関数へのハンドルを使用して ResetFcn を設定します。

env.ResetFcn = @(in)myResetFunction(in);

リセット動作が単純な場合は、無名関数ハンドルを使用して実装できます。たとえば、次のコードでは、setVariable (Simulink) を使用して、Simulink.SimulationInput (Simulink) オブジェクト in 内の変数 x0 をランダムな値に設定します。シミュレーションまたは学習の期間中、モデル ワークスペース内の既存の x0 の値は、指定した x0 の値でオーバーライドされます。シミュレーションまたは学習が完了すると、x0 の値は元に戻ります。

env.ResetFcn = @(in) setVariable(in,'x0',rand());

ResetFcn プロパティが空の SimulinkEnvWithAgent オブジェクトのリセット関数を呼び出すと、未変更の Simulink モデルの Simulink.SimulationInput が返されます。

sim 関数は、各シミュレーションの開始時に環境をリセットするためにリセット関数を呼び出し、train 関数は、各学習エピソードの開始時にリセット関数を呼び出します。

高速リスタートを切り替えるオプション。"on" または "off" として指定します。高速リスタートを使用すると、毎回モデルをコンパイルしたりシミュレーションを終了したりすることなく、反復シミュレーションを実行できます。

高速リスタートの詳細については、高速リスタートによる反復的なシミュレーションの改善 (Simulink)を参照してください。

オブジェクト関数

trainTrain reinforcement learning agents within a specified environment
simSimulate trained reinforcement learning agents within specified environment
getObservationInfoObtain observation data specifications from reinforcement learning environment, agent, or experience buffer
getActionInfoObtain action data specifications from reinforcement learning environment, agent, or experience buffer

すべて折りたたむ

DDPG エージェントを使用したタンク内の水位の制御の例にある学習済みエージェントと対応する Simulink モデルを使用して、Simulink 環境を作成します。

エージェントを MATLAB® ワークスペースに読み込みます。

load rlWaterTankDDPGAgent

RL Agent ブロックを含む rlwatertank モデルの環境を作成します。ブロックで使用されるエージェントは既にワークスペース内にあるため、環境を作成するために観測仕様とアクション仕様を渡す必要はありません。

env = rlSimulinkEnv("rlwatertank","rlwatertank/RL Agent")
env = 
SimulinkEnvWithAgent with properties:

           Model : rlwatertank
      AgentBlock : rlwatertank/RL Agent
        ResetFcn : []
  UseFastRestart : on

2 つのサンプル時間に対して短いシミュレーションを実行して、環境を検証します。

validateEnvironment(env)

これで、trainsim をそれぞれ使用して、環境内でエージェントの学習およびシミュレーションを行うことができるようになりました。

この例では、rlSimplePendulumModel Simulink® モデルを検討します。モデルは、初期状態で下向きにぶら下がっている摩擦がない単純な振子です。

モデルを開きます。

mdl = "rlSimplePendulumModel";
open_system(mdl)

観測仕様とアクション仕様にそれぞれ rlNumericSpec オブジェクトと rlFiniteSetSpec オブジェクトを作成します。

観測値は、角度の正弦、余弦、時間微分の 3 つの信号を含むベクトルです。

obsInfo = rlNumericSpec([3 1]) 
obsInfo = 
  rlNumericSpec with properties:

     LowerLimit: -Inf
     UpperLimit: Inf
           Name: [0×0 string]
    Description: [0×0 string]
      Dimension: [3 1]
       DataType: "double"

アクションはトルクを表すスカラーであり、-2 Nm、0 Nm、2 Nm の 3 つの値のいずれかになります。

actInfo = rlFiniteSetSpec([-2 0 2])
actInfo = 
  rlFiniteSetSpec with properties:

       Elements: [3×1 double]
           Name: [0×0 string]
    Description: [0×0 string]
      Dimension: [1 1]
       DataType: "double"

ドット表記を使用して、rlNumericSpec オブジェクトと rlFiniteSetSpec オブジェクトのプロパティ値を割り当てることができます。

obsInfo.Name = "observations";
actInfo.Name = "torque";

エージェント ブロックのパス情報を割り当て、前の手順で抽出した情報を使用して Simulink モデルの強化学習環境を作成します。

agentBlk = mdl + "/RL Agent";
env = rlSimulinkEnv(mdl,agentBlk,obsInfo,actInfo)
env = 
SimulinkEnvWithAgent with properties:

           Model : rlSimplePendulumModel
      AgentBlock : rlSimplePendulumModel/RL Agent
        ResetFcn : []
  UseFastRestart : on

ドット表記を使用してリセット関数を指定することもできます。この例では、モデル ワークスペースの theta0 をランダムに初期化します。

env.ResetFcn = @(in) setVariable(in,"theta0",randn,"Workspace",mdl)
env = 
SimulinkEnvWithAgent with properties:

           Model : rlSimplePendulumModel
      AgentBlock : rlSimplePendulumModel/RL Agent
        ResetFcn : @(in)setVariable(in,"theta0",randn,"Workspace",mdl)
  UseFastRestart : on

Train Multiple Agents to Perform Collaborative Taskの例から Simulink モデル用の環境を作成します。

エージェントを含むファイルを読み込みます。この例では、非集中学習を使用して学習済みのエージェントを読み込みます。

load decentralizedAgents.mat

2 つのエージェント ブロックをもつ rlCollaborativeTask モデルの環境を作成します。2 つのブロック (agentAagentB) で使用されるエージェントは既にワークスペース内にあるため、環境を作成するためにそれらの観測仕様およびアクション仕様を渡す必要はありません。

env = rlSimulinkEnv( ...
    "rlCollaborativeTask", ...
    ["rlCollaborativeTask/Agent A","rlCollaborativeTask/Agent B"])
env = 
SimulinkEnvWithAgent with properties:

           Model : rlCollaborativeTask
      AgentBlock : [
                     rlCollaborativeTask/Agent A
                     rlCollaborativeTask/Agent B
                   ]
        ResetFcn : []
  UseFastRestart : on

各エピソードの開始時にエージェントがランダムな初期位置から開始するように、環境のリセット関数を指定することを推奨します。例については、Train Multiple Agents to Perform Collaborative Taskで定義されている関数 resetRobots を参照してください。

これで、sim または train をそれぞれ使用して、環境内でエージェントのシミュレーションや学習を行うことができるようになりました。

事前定義済みのキーワード "SimplePendulumModel-Continuous" を使用して、連続型単純振子モデルの強化学習環境を作成します。

env = rlPredefinedEnv("SimplePendulumModel-Continuous")
env = 
SimulinkEnvWithAgent with properties:

           Model : rlSimplePendulumModel
      AgentBlock : rlSimplePendulumModel/RL Agent
        ResetFcn : []
  UseFastRestart : on

この例では、createIntegratedEnv を使用し、エージェントがやり取りするシステムを実装した、エージェント ブロックをもたない Simulink モデルから環境オブジェクトを作成する方法を示します。このようなシステムは、"プラント""開ループ" システム、または "参照" システムと呼ばれることが多く、エージェントを含む全体 (統合) システムは "閉ループ" システムと呼ばれることがよくあります。

この例では、滑走ロボットを制御するための DDPG エージェントの学習で説明されている飛行ロボット モデルを参照 (開ループ) システムとして使用します。

飛行ロボット モデルを開きます。

open_system("rlFlyingRobotEnv")

状態変数とサンプル時間を初期化します。

% initial model state variables
theta0 = 0;
x0 = -15;
y0 = 0;

% sample time
Ts = 0.4;

エージェント ブロックに閉ループで接続された飛行ロボット モデルを含む Simulink モデル myIntegratedEnv を作成します。この関数は、学習に使用される強化学習環境オブジェクト env も返します。

env = createIntegratedEnv( ...
    "rlFlyingRobotEnv", ...
    "myIntegratedEn")
env = 
SimulinkEnvWithAgent with properties:

           Model : myIntegratedEn
      AgentBlock : myIntegratedEn/RL Agent
        ResetFcn : []
  UseFastRestart : on

この関数は、新しい統合モデル内の RL Agent ブロックへのブロック パス、および参照モデルの観測仕様とアクション仕様を返すこともできます。

[~,agentBlk,observationInfo,actionInfo] = ...
    createIntegratedEnv( ...
    "rlFlyingRobotEnv","myIntegratedEnv")
agentBlk = 
"myIntegratedEnv/RL Agent"
observationInfo = 
  rlNumericSpec with properties:

     LowerLimit: -Inf
     UpperLimit: Inf
           Name: "observation"
    Description: [0×0 string]
      Dimension: [7 1]
       DataType: "double"

actionInfo = 
  rlNumericSpec with properties:

     LowerLimit: -Inf
     UpperLimit: Inf
           Name: "action"
    Description: [0×0 string]
      Dimension: [2 1]
       DataType: "double"

ブロック パスと仕様を返すことは、observationInfo および actionInfo の説明、制限、または名前を変更する必要がある場合に役立ちます。仕様を変更した後、rlSimulinkEnv 関数を使用して統合モデル IntegratedEnv から環境を作成できます。

バージョン履歴

R2019a で導入