メインコンテンツ

SimulinkEnvWithAgent

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

説明

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

作成

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

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

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

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

プロパティ

すべて展開する

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 関数は、各学習エピソードの開始時にリセット関数を呼び出します。

詳細については、Reset Function for Simulink Environmentsを参照してください。

例: env.ResetFcn = @myResetFunction; は、SimulinkEnvWithAgent オブジェクト envResetFcn プロパティを、既存の関数 myResetFunction のハンドルに設定します。

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

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

例: env.UseFastRestart="off" は、SimulinkEnvWithAgent オブジェクト envUseFastRestart プロパティを "off" に設定します。

オブジェクト関数

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 WaterTankDDPG

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

この例では、rlNumericSpec を使用して、3 要素ベクトルを伝送する単一のチャネルで構成される観測空間を定義します。次に、rlFiniteSetSpec を使用して、3 つの可能な値のうち 1 つだけをもつ単一のチャネルで構成される行動空間を定義します。次に、これらの観測仕様とアクション仕様を使用して、rlSimplePendulumModel Simulink モデルに依存するカスタム Simulink® 環境を作成します。

モデルは、初期状態で下向きにぶら下がっている摩擦がない単純な振子を表します。モデルを開きます。

mdl = "rlSimplePendulumModel";
open_system(mdl)

rlNumericSpec オブジェクトは、連続集合に属する信号 (アクションまたは観測値) を伝送する環境チャネルを指定します。対照的に、rlFiniteSetSpec オブジェクトは、有限集合 (有限個の要素のみを含む集合) に属する信号を伝送するチャネルを指定します。

既存の環境がある場合は、getActionInfo関数またはgetObservationInfo関数を使用して、その環境のアクション仕様または観測仕様 (一般に rlNumericSpec オブジェクトと rlFiniteSetSpec オブジェクトから成るベクトル) を抽出できます。

この例では、代わりに新しいカスタム環境を作成する必要があります。そのためには、まず、環境のアクション チャネルと観測チャネルを定義しなければなりません。

観測空間を表すチャネルを定義するには、rlNumericSpec を使用します。このチャネルは、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"

行動空間を表すチャネルを定義するには、rlFiniteSetSpec を使用します。このチャネルはトルクを表すスカラーを伝送し、-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 環境を作成するには、rlSimulinkEnvを使用します。最初の引数として Simulink モデルを指定し、2 番目の引数としてエージェント ブロックのパスを指定します。さらに、前の手順で作成した観測仕様とアクション仕様を指定します。カスタム Simulink 環境の詳細については、Create Custom Simulink Environmentsを参照してください。

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

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

ドット表記を使用してリセット関数を指定します。この例では、setVariable (Simulink)関数を使用して、モデル ワークスペースの 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

ここで、inSimulink.SimulationInput (Simulink)オブジェクトです。シミュレーションまたは学習の期間中、モデル ワークスペース内の既存の theta0 の値は、指定した theta0 の値でオーバーライドされます。シミュレーションまたは学習が完了すると、theta0 の値は元に戻ります。リセット関数の詳細については、Reset Function for Simulink Environmentsを参照してください。

組み込み関数 train および sim の引数として、(エージェント オブジェクトと組み合わせて) env を使用できるようになりました。これらの関数は、この環境内でエージェントの学習とシミュレーションを行います。

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 で導入