创建Simulink环境和Train Agent
这个例子展示了如何转换PI控制器watertank
Simulink®模型的强化学习深度确定性策略梯度(DDPG)代理。有关在MATLAB®中训练DDPG代理的例子,请参见训练DDPG代理控制双积分器系统.
水箱模型
本例的原始模型是水箱模型。目标是控制水箱的水位。有关水箱模型的更多信息,请参见watertank仿真软件模型(仿真软件控制设计).
对原始模型进行如下修改:
删除PID控制器。
插入RL Agent块。
连接观察向量 ,在那里 是水箱的高度, , 为参考高度。
设置奖励 .
配置终止信号,使模拟停止,如果 或 .
得到的模型是rlwatertank.slx
.有关此模型和更改的更多信息,请参见创建Simulink强化学习环境.
open_system (“rlwatertank”)
创建环境接口
创建环境模型包括定义以下内容:
代理用来与环境交互的动作和观察信号。有关更多信息,请参见
rlNumericSpec
而且rlFiniteSetSpec
.代理用来衡量成功的奖励信号。有关更多信息,请参见定义奖励信号.
定义观察规范obsInfo
和行为规范actInfo
.
obsInfo = rlNumericSpec([3 1],...LowerLimit=[-inf -inf 0]',...UpperLimit=[inf inf inf]');obsInfo。Name =“观察”;obsInfo。描述=综合误差、误差和测量高度;actInfo = rlNumericSpec([1 1]);actInfo。Name =“流”;
构建环境接口对象。
env = rlSimulinkEnv (“rlwatertank”,“rlwatertank / RL代理”,...obsInfo actInfo);
设置一个自定义重置函数,该函数将模型的参考值随机化。
env。ResetFcn = @(在)localResetFcn(的);
指定模拟时间特遣部队
和代理采样时间Ts
在几秒钟内。
t = 1.0;Tf = 200;
固定随机生成器种子的再现性。
rng (0)
创建一个评论家
给定观察和行动,DDPG代理使用价值函数近似器作为评价,近似长期奖励。
创建一个深度神经网络来近似评价中的价值函数。要创建具有两个输入(观察和动作)和一个输出(值)的网络,请使用三个不同的路径,并将每个路径指定为层对象的行向量。,可获得观察和动作空间的尺寸obsInfo
而且actInfo
规范。
statePath = [featureInputLayer(obsInfo.Dimension(1),Name= . featureInputLayer“netObsIn”fulllyconnectedlayer (25,Name= .“CriticStateFC2”));actionPath = [featureInputLayer(actInfo.Dimension(1),Name= . featureInputLayer“netActIn”Name =) fullyConnectedLayer(25日“CriticActionFC1”));commonPath = [additionLayer(2,Name= .“添加”) reluLayer fullyConnectedLayer (Name =“CriticOutput”));criticNetwork = layerGraph ();criticNetwork = addLayers (criticNetwork statePath);criticNetwork = addLayers (criticNetwork actionPath);criticNetwork = addLayers (criticNetwork commonPath);criticNetwork = connectLayers (criticNetwork,...“CriticStateFC2”,...“添加/三机一体”);criticNetwork = connectLayers (criticNetwork,...“CriticActionFC1”,...“添加/ in2”);
查看批评家网络配置。
图绘制(criticNetwork)
将网络转换为adlnetwork
对象,并总结其属性。
criticNetwork = dlnetwork (criticNetwork);总结(criticNetwork)
初始化:true可学习数:1.5k输入:1 'netObsIn' 3 features 2 'netActIn' 1 features
使用指定的深度神经网络、环境规范对象以及与观察和行动通道相关联的网络输入的名称创建批评家近似器对象。
评论家= rlQValueFunction (criticNetwork obsInfo actInfo,...ObservationInputNames =“netObsIn”,...ActionInputNames =“netActIn”);
有关q值函数对象的更多信息,请参见rlQValueFunction
.
用随机输入的观察和行动检查批评者。
getValue(评论家,...{兰德(obsInfo.Dimension)},...{兰德(actInfo.Dimension)})
ans =单-0.1631
有关创建批评者的更多信息,请参见创建政策和价值功能.
创建一个演员
给定观察结果,DDPG代理使用确定性策略决定采取哪个操作,该策略由参与者实现。
创建一个深度神经网络来近似参与者内部的策略。为了创建一个具有一个输入(观察)和一个输出(操作)(层对象的行向量)的网络。,可获得观察和动作空间的尺寸obsInfo
而且actInfo
规范。
actorNetwork = [featureInputLayer(obsInfo.Dimension(1)) fullyConnectedLayer(3) tanhLayer fullyConnectedLayer(actInfo.Dimension(1))];
将网络转换为adlnetwork
对象,并总结其属性。
actorNetwork = dlnetwork (actorNetwork);总结(actorNetwork)
可学习的数量:16输入:1 '输入' 3个特性
使用指定的深度神经网络、环境规范对象和要与观测通道相关联的网络输入的名称创建actor近似器对象。
演员= rlContinuousDeterministicActor (actorNetwork obsInfo actInfo);
有关更多信息,请参见rlContinuousDeterministicActor
.
用随机输入观察检查行动者。
getAction(演员,{兰德(obsInfo.Dimension)})
ans =1 x1单元阵列{[-0.3408]}
有关创建批评者的更多信息,请参见创建政策和价值功能.
创建DDPG Agent
使用指定的参与者和批评家近似器对象创建DDPG代理。
代理= rlDDPGAgent(演员、批评);
有关更多信息,请参见rlDDPGAgent
.
使用点符号为代理、演员和评论家指定选项。
代理。SampleTime = t;agent.AgentOptions.TargetSmoothFactor = 1 e - 3;agent.AgentOptions.DiscountFactor = 1.0;agent.AgentOptions.MiniBatchSize = 64;agent.AgentOptions.ExperienceBufferLength = 1 e6;agent.AgentOptions.NoiseOptions.Variance = 0.3;agent.AgentOptions.NoiseOptions.VarianceDecayRate = 1 e-5;agent.AgentOptions.CriticOptimizerOptions.LearnRate = 1 e 03;agent.AgentOptions.CriticOptimizerOptions.GradientThreshold = 1; agent.AgentOptions.ActorOptimizerOptions.LearnRate = 1e-04; agent.AgentOptions.ActorOptimizerOptions.GradientThreshold = 1;
方法指定代理选项rlDDPGAgentOptions
对象。
用随机输入观察检查代理。
getAction(代理,{兰德(obsInfo.Dimension)})
ans =1 x1单元阵列{[-0.7926]}
火车代理
要培训代理,首先要指定培训选项。对于本例,使用以下选项:
每次训练最多跑一次
5000
集。指定每一集最多持续时间装天花板(Tf / Ts)
(即200
)时间的步骤。在“集训管理器”对话框中显示训练进度
情节
选项)并禁用命令行显示(设置详细的
选项假
)。当代理收到的平均累积奖励大于时停止训练
800
在20.
连续集。在这一点上,代理可以控制水箱中的水位。
有关更多信息,请参见rlTrainingOptions
.
trainOpts = rlTrainingOptions (...MaxEpisodes = 5000,...MaxStepsPerEpisode =装天花板(Tf / Ts),...ScoreAveragingWindowLength = 20,...Verbose = false,...情节=“训练进步”,...StopTrainingCriteria =“AverageReward”,...StopTrainingValue = 800);
训练代理使用火车
函数。训练是一个计算密集的过程,需要几分钟才能完成。要在运行此示例时节省时间,请通过设置加载预先训练过的代理doTraining
来假
.亲自训练探员,设doTraining
来真正的
.
doTraining = false;如果doTraining培训代理。trainingStats =火车(代理,env, trainOpts);其他的为示例加载预先训练过的代理。负载(“WaterTankDDPG.mat”,“代理”)结束
验证培训代理
通过仿真验证学习到的agent在模型中的有效性。
simOpts = rlSimulationOptions (MaxSteps =装天花板(Tf / Ts) StopOnError =“上”);经验= sim (env,代理,simOpts);
本地函数
函数= localResetFcn(中)随机化参考信号黑色= sprintf (“rlwatertank /期望\ nWater级别”);H = 3*randn + 10;而H <= 0 || H >= 20 H = 3*randn + 10;结束在= setBlockParameter(黑色,“价值”num2str (h));%随机初始高度H = 3*randn + 10;而H <= 0 || H >= 20 H = 3*randn + 10;结束黑色=“rlwatertank /水箱系统/ H”;在= setBlockParameter(黑色,“InitialCondition”num2str (h));结束