从零开始学MATLAB强化学习工具箱使用(五):Simulink+强化学习设计器

建立Simulink环境,导入强化学习设计器里,添加代理,进行训练

1. 建立Simulink环境

首先准备好你的Simulink模型,这里还用上节用到的水箱模型。
在这里插入图片描述

RL Agent模块报错是由于还没有给其绑定代理,后续会在强化学习设计器里配置,暂时不用理会。

下一步,在MATLAB命令行窗口或脚本里为环境指定状态空间和动作空间以及复位函数,然后创建环境。

% 观测空间形状及每个变量取值上下限
obsInfo = rlNumericSpec([3 1],...
    LowerLimit=[-inf -inf 0  ]',...
    UpperLimit=[ inf  inf inf]');
% Name and description are optional and not used by the software
obsInfo.Name = "observations";
obsInfo.Description = "integrated error, error, and measured height";

% Action info
actInfo = rlNumericSpec([1 1]);
actInfo.Name = "flow";
% 创建环境对象
env = rlSimulinkEnv("rlwatertank","rlwatertank/RL Agent",...
    obsInfo,actInfo);
% 指定环境复位函数,这里是自定义函数
env.ResetFcn = @(in)localResetFcn(in);
% 指定仿真时间T f TfTf和代理采样时间T s TsTs,单位是s,这里只是该Simulink模型用到的参数:
Ts = 1.0;
Tf = 200;

新建函数文件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

运行上述代码,使环境对象env出现在工作区。
在这里插入图片描述

2. 将环境导入RL设计器

命令行运行如下语句打开RL设计器,选择导入环境env。

reinforcementLearningDesigner

在这里插入图片描述
导入后如图所示,环境面板增加了环境env。
在这里插入图片描述

3. 配置代理

为导入的环境配置代理。在Reinforcement Learning标签页点击New,在弹出的窗口里,修改隐藏层神经元数量为50,默认的环境即为导入的环境,选择DDPG算法,点击OK。
在这里插入图片描述
建立好的代理如下图,按需修改参数:
在这里插入图片描述

可以查看Actor和Critic的结构,下图是Actor的:
在这里插入图片描述

4. 训练并导出训练结果

转到Train选项卡,修改训练参数,然后开始训练。

在这里插入图片描述
训练完成后如图所示,点击Accept保存训练结果。
在这里插入图片描述
导出训练结果agent1_Trained。
在这里插入图片描述
成功导出到MATLAB工作区。
在这里插入图片描述

5. 在Simulink里仿真

在Simulink模块里双击RL Agent模块,为模块绑定训练好的代理。
在这里插入图片描述
点击Simulink运行仿真,仿真结果如图。
在这里插入图片描述
当然,也可以通过MATLAB命令行运行仿真。

rng(1) % 固定随机数种子方便复现结果
simOpts = rlSimulationOptions(MaxSteps=ceil(Tf/Ts),StopOnError="on");
experiences = sim(env,agent1_Trained,simOpts);

当然,不导出训练结果,直接在RL设计器里运行也是可以的。如下:
先配置仿真参数:
在这里插入图片描述
仿真完成后,会展示每轮奖励以及所有轮奖励均值和标准差。
在这里插入图片描述
点击Inspect Simulation Data查看仿真结果,也可以点击Clear and Inspect Simulation Data预先清除在上一个会话中加载的任何数据。可以在不同的图中选择查看每一轮仿真的不同的数据。
在这里插入图片描述
回到仿真对话窗体,同样点击Accept保存仿真结果,在Results面板自动添加一条experience,双击它可以再次查看上述结果。

在这里插入图片描述
最后,保存会话后退出就可以了,后续可以用RL设计器再次打开此会话。

Tips

本节展示了如何用Simulink模型在RL设计器里进行训练,同样地,可以在RL设计器里建立好代理之后导出需要的内容(可导出的内容如下图所示)到MATLAB工作区,然后通过MATLAB脚本进行训练,省去了在MATLAB脚本建立代理的部分过程,而且可以通过脚本修改更多的参数。
在这里插入图片描述

当然,综合来看,还是像本节这样直接使用RL设计器更方便更直观,解决一般的问题足够。

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值