创建水箱强化学习模型
- 问题描述
- 行动与观测
- 奖励信号
- 终止信号
- 创建环境对象
- 重置函数
本示例说明如何创建一个水箱强化学习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')
就可以开始水箱模型的强化学习训练啦
训练水箱模型