创建水箱强化学习模型

  • 问题描述
  • 行动与观测
  • 奖励信号
  • 终止信号
  • 创建环境对象
  • 重置函数

 本示例说明如何创建一个水箱强化学习Simulink®环境,该环境包含一个RL Agent块来代替用于水箱中水位的控制器。要模拟此环境,必须创建一个智能体并在RL智能体块中指定该智能体。

问题描述
如果直接在matlab使用

open_system('rlwatertank')

则会报错

No system or file called ‘rlwatertank’ found. ‘rlwatertank’ 用于
Create Simulink Environment and Train Agent
Validate Simulink Environment
Water Tank Reinforcement Learning Environment Model。

或者

在这里插入图片描述

需要先对智能体进行创建。

mdl = 'rlwatertank';
open_system(mdl)


在这里插入图片描述

该模型已经包含一个RL Agent块,该块连接到以下信号:

标量动作输出信号

观测输入信号的向量

标量奖励输入信号

逻辑输入信号,用于停止仿真

行动与观测


强化学习环境从智能体接收动作信号,并响应于这些动作生成观察信号。要创建和训练智能体,必须创建操作和观察规范对象。

在这种环境下的作用信号是发送到工厂的流量控制信号。要为此连续动作信号创建规格对象,请使用rlNumericSpec功能。

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

如果动作信号采用一组离散的可能值之一,则使用该rlFiniteSetSpec函数创建规格。

对于此环境,有三个发送到代理的观察信号,指定为矢量信号。观察向量是[ ∫ e   d t   e   h ] T 其中:

h 是水箱中水的高度。

2.e = r − h ,r 是水高的参考值。

在生成观测子系统中计算观测信号。

open_system([mdl '/generate observations'])

在这里插入图片描述

创建观察规范的三元素向量。将水高度的下限指定为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功能创建规格。

奖励信号


构造一个标量奖励信号。对于此示例,请指定以下奖励。

奖励= 10 ( ∣ e ∣ < 0.1 ) − 1 ( ∣ e ∣ ≥ 0.1 ) − 100 ( h ≤ 0 ∣ ∣ h ≥ 20 ) 

当误差低于误差时,奖励为正,0.1否则为负。此外,有一个大的奖励惩罚当水高度为外0给20范围。

在计算奖励子系统中构造此奖励。

open_system([mdl '/calculate reward'])


在这里插入图片描述


终止信号


要终止训练情节和模拟,请向模块的isdone输入端口指定逻辑信号。对于此示例,如果h ≤ 0 h≤0h≤0 要么 h ≥ 20 h≥20h≥20.

在停止模拟子系统中计算该信号。

open_system([mdl '/stop simulation'])


在这里插入图片描述


创建环境对象


为Simulink创建一个环境对象

env = rlSimulinkEnv(mdl,[mdl '/RL Agent'],observationInfo,actionInfo);

重置函数


您还可以创建一个自定义重置功能,以随机化模型的参数,变量或状态。在此示例中,重置功能将参考信号和初始水位随机化,并设置相应的块参数。

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


在本地创建函数 localResetFcn.m ,在文件中添加

function in = localResetFcn(in)

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

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

end


此时 rlwatertank 环境创建完毕
重新执行

open_system('rlwatertank')

就可以开始水箱模型的强化学习训练啦

训练水箱模型