Main Content

貯水タンクの強化学習環境モデル

この例では、タンクの水位コントローラーの代わりに RL Agent ブロックを含む貯水タンクの強化学習 Simulink® 環境を作成する方法を示します。この環境をシミュレーションするには、エージェントを作成し、そのエージェントを RL Agent ブロックで指定しなければなりません。この環境を使用してエージェントに学習させる例については、Create Simulink Environment and Train Agentを参照してください。

mdl = "rlwatertank";
open_system(mdl)

このモデルには、次の信号に接続する RL Agent ブロックが既に含まれています。

  • スカラー アクション出力信号

  • 観測入力信号のベクトル

  • スカラー報酬入力信号

  • シミュレーション停止用の logical 入力信号

アクションと観測値

強化学習環境は、エージェントからアクション信号を受け取り、それらのアクションに応じて観測信号を生成します。エージェントを作成してそれに学習させるには、アクション仕様オブジェクトと観測仕様オブジェクトを作成しなければなりません。

この環境のアクション信号は、プラントに送信される流量制御信号です。連続信号を搬送するアクション チャネルの仕様オブジェクトを作成するには、rlNumericSpec を使用します。

actionInfo = rlNumericSpec([1 1]);
actionInfo.Name = "flow";

可能な値の離散集合からアクション信号が取られる場合、関数 rlFiniteSetSpec を使用して仕様を作成します。

この環境では、エージェントに送信される 3 つの観測信号があり、ベクトル信号として指定されます。観測ベクトルは [e dteh]T です。ここで、次のようになります。

  • h はタンク内の水位。

  • e=r-h。ここで、r は水位の基準値。

generate observations サブシステムで観測信号を計算します。

open_system(mdl + "/generate observations")

観測仕様から成る 3 要素ベクトルを作成します。水位の下限として 0 を指定し、他の観測信号は無制限のままにします。

observationInfo = rlNumericSpec([3 1],...
    LowerLimit=[-inf -inf 0  ]',...
    UpperLimit=[ inf  inf inf]');
observationInfo.Name = "observations";
observationInfo.Description = "integrated error, error, and measured height";

アクションまたは観測値がバス信号で表される場合は、関数 bus2RLSpec を使用して仕様を作成します。

報酬信号

スカラー報酬信号を構成します。この例では、次の報酬を指定します。

reward=10(|e|<0.1)-1(|e|0.1)-100(h0||h20)

誤差が 0.1 未満の場合、報酬は正となり、それ以外の場合は負になります。また、水位が 020 の範囲外の場合は、大きな報酬ペナルティが発生します。

この報酬を calculate reward サブシステムで構成します。

open_system(mdl + "/calculate reward")

停止信号

学習エピソードとシミュレーションを終了するには、ブロックの isdone 入力端子に logical 信号を指定します。この例では、h0 または h20 の場合にエピソードを終了します。

この信号を stop simulation サブシステムで計算します。

open_system(mdl + "/stop simulation")

環境オブジェクトの作成

Simulink モデル用の環境オブジェクトを作成します。

env = rlSimulinkEnv(mdl,mdl + "/RL Agent",observationInfo,actionInfo);

リセット関数

モデルのパラメーター、変数、または状態をランダム化するカスタム リセット関数を作成することもできます。この例では、リセット関数が基準信号と初期水位をランダム化し、対応するブロック パラメーターを設定します。

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

ローカル関数

function in = localResetFcn(in)

% Randomize reference signal
h = 3*randn + 10;
while h <= 0 || h >= 20
    h = 3*randn + 10;
end
in = setBlockParameter(in, ...
    "rlwatertank/Desired \nWater Level", ...
    Value=num2str(h));

% Randomize initial height
h = 3*randn + 10;
while h <= 0 || h >= 20
    h = 3*randn + 10;
end
in = setBlockParameter(in, ...
    "rlwatertank/Water-Tank System/H", ...
    InitialCondition=num2str(h));

end

参考

関数

関連するトピック