中的PI控制器进行转换watertank
金宝app基于Simulink模型的强化学习深度确定性策略梯度(DDPG)代理。有关在MATLAB®中训练DDPG代理的示例,请参见训练DDPG Agent控制双积分系统.
本例的原始模型是水箱模型。目标是控制水箱中的水位。有关水箱模型的更多信息,请参见水箱Simulink金宝app模型(金宝appSimulink控制设计).
对原始模型进行如下修改:
删除PID控制器。
插入RL代理块。
连接观察向量 ,在那里 是容器的高度, , 是参考高度。
设置奖励 .
配置终止信号,使模拟在以下情况下停止 或 .
得到的模型是rlwatertank.slx
.有关此模型和更改的更多信息,请参见创建Simul金宝appink强化学习环境.
open_system (“rlwatertank”)
创建环境模型包括定义以下内容:
代理用于与环境交互的动作和观察信号。有关更多信息,请参见rlNumericSpec
而且rlFiniteSetSpec
.
智能体用来衡量成功的奖励信号。有关更多信息,请参见定义奖励信号.
定义观察规范obsInfo
以及行为规范actInfo
.
obsInfo = rlNumericSpec([3 1],...“LowerLimit”,[-inf -inf 0]',...“UpperLimit”,[inf inf inf]');obsInfo。Name =“观察”;obsInfo。描述=积分误差,误差和测量高度;numObservations = obsInfo.Dimension(1);actInfo = rlNumericSpec([1 1]);actInfo。Name =“流”;numActions = actInfo.Dimension(1);
构建环境接口对象。
环境= rlSi金宝appmulinkEnv(“rlwatertank”,“rlwatertank / RL代理”,...obsInfo actInfo);
设置自定义重置函数,该函数将模型的参考值随机化。
env。ResetFcn = @ localResetFcn(in);
指定模拟时间特遣部队
以及代理取样时间Ts
在几秒钟内。
Ts = 1.0;Tf = 200;
固定随机生成器种子的再现性。
rng (0)
给定观察和行动,DDPG代理使用临界值函数表示近似长期奖励。为了创建评论家,首先创建一个具有两个输入的深度神经网络,即观察和行动,以及一个输出。有关创建深度神经网络值函数表示的更多信息,请参见创建策略和值函数表示.
statePath = [featureInputLayer(numObservations,“归一化”,“没有”,“名字”,“状态”) fullyConnectedLayer (50,“名字”,“CriticStateFC1”) reluLayer (“名字”,“CriticRelu1”) fullyConnectedLayer (25,“名字”,“CriticStateFC2”));actionPath = [featureInputLayer(numActions,“归一化”,“没有”,“名字”,“行动”) fullyConnectedLayer (25,“名字”,“CriticActionFC1”));commonPath = [addtionlayer (2,“名字”,“添加”) reluLayer (“名字”,“CriticCommonRelu”) fullyConnectedLayer (1,“名字”,“CriticOutput”));criticNetwork = layerGraph();criticNetwork = addLayers(criticNetwork,statePath);criticNetwork = addLayers(criticNetwork,actionPath);criticNetwork = addLayers(criticNetwork,commonPath);临界网络= connectLayers(临界网络,“CriticStateFC2”,“添加/三机一体”);临界网络= connectLayers(临界网络,“CriticActionFC1”,“添加/ in2”);
查看关键网络配置。
图绘制(criticNetwork)
使用指定评论家表示的选项rlRepresentationOptions
.
criticOpts = rlRepresentationOptions(“LearnRate”1 e 03“GradientThreshold”1);
使用指定的深度神经网络和选项创建评论家表示。您还必须为评论家指定操作和观察规范,这些都是从环境接口获得的。有关更多信息,请参见rlQValueRepresentation
.
评论= rlQValueRepresentation(批评网络,obsInfo,actInfo,“观察”, {“状态”},“行动”, {“行动”}, criticOpts);
给定观察结果,DDPG代理使用参与者表示来决定采取何种操作。要创建行动者,首先要创建一个深度神经网络,它有一个输入(观察)和一个输出(动作)。
用与评论家相似的方式来构建演员。有关更多信息,请参见rlDeterministicActorRepresentation
.
actorNetwork = [featureInputLayer(numObservations,“归一化”,“没有”,“名字”,“状态”) fullyConnectedLayer (3“名字”,“actorFC”) tanhLayer (“名字”,“actorTanh”) fullyConnectedLayer (numActions“名字”,“行动”));actorOptions = rlRepresentationOptions(“LearnRate”1 e-04“GradientThreshold”1);actor = rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,“观察”, {“状态”},“行动”, {“行动”}, actorOptions);
要创建DDPG代理,首先使用指定DDPG代理选项rlDDPGAgentOptions
.
agentOpts = rlDDPGAgentOptions(...“SampleTime”Ts,...“TargetSmoothFactor”1 e - 3,...“DiscountFactor”, 1.0,...“MiniBatchSize”, 64,...“ExperienceBufferLength”1 e6);agentoptions . noiseoptions . variance = 0.3;agentoptions . noiseoptions . variancedecayrate = 1e-5;
然后,使用指定的参与者表示、评论家表示和代理选项创建DDPG代理。有关更多信息,请参见rlDDPGAgent
.
agent = rlDDPGAgent(actor,批评家,agentOpts);
要培训代理,首先指定培训选项。对于本例,使用以下选项:
每次训练最多跑一次5000
集。指定每个插曲最多持续一段时间装天花板(Tf / Ts)
(即200
)时间步长。
在“事件管理器”对话框中显示培训进度情节
选项)并禁用命令行显示(设置详细的
选项假
).
当代理收到的平均累积奖励大于800
在20.
连续集。此时,药剂可以控制水箱中的水位。
有关更多信息,请参见rlTrainingOptions
.
Maxepisodes = 5000;maxsteps = ceil(Tf/Ts);trainOpts = rlTrainingOptions(...“MaxEpisodes”maxepisodes,...“MaxStepsPerEpisode”maxsteps,...“ScoreAveragingWindowLength”, 20岁,...“详细”假的,...“阴谋”,“训练进步”,...“StopTrainingCriteria”,“AverageReward”,...“StopTrainingValue”, 800);
培训代理使用火车
函数。训练是一个计算密集型的过程,需要几分钟才能完成。为了在运行此示例时节省时间,请通过设置加载预训练的代理doTraining
来假
.要亲自训练特工,请设置doTraining
来真正的
.
doTraining = false;如果doTraining培训代理。trainingStats = train(agent,env,trainOpts);其他的为示例加载预训练的代理。负载(“WaterTankDDPG.mat”,“代理”)结束
通过仿真验证所学习的智能体与模型的关系。
simOpts = rlSimulationOptions(“MaxSteps”maxsteps,“StopOnError”,“上”);experiences = sim(env,agent,simOpts);
函数in = localResetFcn(in)随机化参考信号BLK = sprintf('rlwatertank/期望水位');H = 3*randn + 10;而|| H >= 20 H = 3*randn + 10;结束in = setBlockParameter(in,blk,“价值”num2str (h));%随机初始高度H = 3*randn + 10;而|| H >= 20 H = 3*randn + 10;结束黑色=“rlwatertank /水箱系统/ H”;in = setBlockParameter(in,blk,“InitialCondition”num2str (h));结束