从模型生成奖励函数验证块水箱系统
这个例子展示了如何自动生成一个奖励函数模型中定义的性能需求®设计优化™模型验证。金宝app然后使用生成的回报函数训练强化学习代理。
介绍
您可以使用generateRewardFunction
生成一个奖励函数强化学习,从性能约束中指定一个仿真软件设计优化模型验证。金宝app得到的奖励信号加权惩罚约束违反的总和的当前状态的环境。
在本例中,您将把成本和约束规范中定义检查阶跃响应特性块水箱系统为一个奖励函数。然后使用奖励函数,用它来训练一个代理控制水箱。
对于这个示例指定参数。
% Watertank参数= 2;b = 5;= 20;%初始和最终的高度h0 = 1;高频= 2;%模拟和样品时间Tf = 10;t = 0.1;
这个例子是原始模型watertank仿金宝app真软件模型(金宝app仿真软件控制设计)。
打开模型。
open_system (“rlWatertankStepInput”)
该模型在这个例子中已经修改了强化学习。的目标是控制水平水箱里的水利用强化学习代理,同时满足定义的响应特性检查阶跃响应特性块。打开块视图所需的阶跃响应规范。
黑色=“rlWatertankStepInput / WaterLevelStepResponse”;open_system(黑色)
生成一个奖励函数
生成奖励函数代码的规范WaterLevelStepResponse块使用generateRewardFunction
。在MATLAB编辑器中显示的代码。
generateRewardFunction(黑色)
生成的奖励奖励设计函数是一个起点。你可以修改这个函数通过选择不同的惩罚函数和调整惩罚权重。对于这个示例,对所生成的代码进行以下更改:
默认的点球重量是1。重量设置为10。
默认的外部罚函数方法的步骤。改变的方法
二次
。
更改后,重量和处罚规范应该如下:
重量= 10;点球=总和(exteriorPenalty (x, Block1_xmin Block1_xmax,“二次”));
对于这个示例,修改后的代码已经被保存在文件的MATLAB函数rewardFunctionVfb.m
。显示生成的回报函数。
类型rewardFunctionVfb.m
函数奖励= rewardFunctionVfb (x, t) % REWARDFUNCTION生成奖励从模型块规格。金宝app% % x:输入watertank_stepinput_rl / WaterLevelStepResponse % t:仿真时间(s) %强化学习工具箱% 26 - 4月- 2021 13:05:16 % # codegen % %规范从watertank_stepinput_rl / WaterLevelStepResponse Block1_InitialValue = 1;Block1_FinalValue = 2;Block1_StepTime = 0;Block1_StepRange = Block1_FinalValue - Block1_InitialValue;Block1_MinRise = Block1_InitialValue + Block1_StepRange * 80/100;Block1_MaxSettling = Block1_InitialValue + Block1_StepRange * (1 + 2/100);Block1_MinSettling = Block1_InitialValue + Block1_StepRange * (1-2/100);Block1_MaxOvershoot = Block1_InitialValue + Block1_StepRange * (1 + 10/100);Block1_MinUndershoot = Block1_InitialValue - Block1_StepRange * 5/100; if t >= Block1_StepTime if Block1_InitialValue <= Block1_FinalValue Block1_UpperBoundTimes = [0,5; 5,max(5+1,t+1)]; Block1_UpperBoundAmplitudes = [Block1_MaxOvershoot,Block1_MaxOvershoot; Block1_MaxSettling,Block1_MaxSettling]; Block1_LowerBoundTimes = [0,2; 2,5; 5,max(5+1,t+1)]; Block1_LowerBoundAmplitudes = [Block1_MinUndershoot,Block1_MinUndershoot; Block1_MinRise,Block1_MinRise; Block1_MinSettling,Block1_MinSettling]; else Block1_UpperBoundTimes = [0,2; 2,5; 5,max(5+1,t+1)]; Block1_UpperBoundAmplitudes = [Block1_MinUndershoot,Block1_MinUndershoot; Block1_MinRise,Block1_MinRise; Block1_MinSettling,Block1_MinSettling]; Block1_LowerBoundTimes = [0,5; 5,max(5+1,t+1)]; Block1_LowerBoundAmplitudes = [Block1_MaxOvershoot,Block1_MaxOvershoot; Block1_MaxSettling,Block1_MaxSettling]; end Block1_xmax = zeros(1,size(Block1_UpperBoundTimes,1)); for idx = 1:numel(Block1_xmax) tseg = Block1_UpperBoundTimes(idx,:); xseg = Block1_UpperBoundAmplitudes(idx,:); Block1_xmax(idx) = interp1(tseg,xseg,t,'linear',NaN); end if all(isnan(Block1_xmax)) Block1_xmax = Inf; else Block1_xmax = max(Block1_xmax,[],'omitnan'); end Block1_xmin = zeros(1,size(Block1_LowerBoundTimes,1)); for idx = 1:numel(Block1_xmin) tseg = Block1_LowerBoundTimes(idx,:); xseg = Block1_LowerBoundAmplitudes(idx,:); Block1_xmin(idx) = interp1(tseg,xseg,t,'linear',NaN); end if all(isnan(Block1_xmin)) Block1_xmin = -Inf; else Block1_xmin = max(Block1_xmin,[],'omitnan'); end else Block1_xmin = -Inf; Block1_xmax = Inf; end %% Penalty function weight (specify nonnegative) Weight = 10; %% Compute penalty % Penalty is computed for violation of linear bound constraints. % % To compute exterior bound penalty, use the exteriorPenalty function and % specify the penalty method as 'step' or 'quadratic'. % % Alternaltely, use the hyperbolicPenalty or barrierPenalty function for % computing hyperbolic and barrier penalties. % % For more information, see help for these functions. Penalty = sum(exteriorPenalty(x,Block1_xmin,Block1_xmax,'quadratic')); %% Compute reward reward = -Weight * Penalty; end
集成这个奖励函数在水箱模型中,开放下的MATLAB功能块奖励子系统。
open_system (“rlWatertankStepInput /奖励/奖励函数”)
附加功能使用以下代码并保存模型。
r = rewardFunctionVfb (x, t);
MATLAB功能块将执行rewardFunctionVfb.m
计算奖励。
对于这个示例,MATLAB功能块已经修改并保存。
创造一个强化学习环境
水箱的环境动力学建模子系统。对于这个环境,
观测高度的参考
裁判
从过去的5步骤,高度误差犯错
=裁判
- - - - - -H
。行动是电压
V
应用于泵。样品时间
Ts
是0.1
年代。
对环境创建的观察和操作规范。
numObs = 6;numAct = 1;oinfo = rlNumericSpec ([numObs 1]);ainfo = rlNumericSpec ([numAct 1]);
创建使用强化学习环境rl金宝appSimulinkEnv
函数。
env = rl金宝appSimulinkEnv (“rlWatertankStepInput”,“rlWatertankStepInput / RL代理”、oinfo ainfo);
创建一个强化学习代理
修复再现性的随机种子。
rng (100)
代理在本例中是一个双延迟深决定性策略梯度(TD3)代理。
创建两个评论家表示。
%的批评家cnet = [featureInputLayer numObs,“归一化”,“没有”,“名字”,“状态”)fullyConnectedLayer (128,“名字”,“fc1”)concatenationLayer (1、2、“名字”,“concat”)reluLayer (“名字”,“relu1”)fullyConnectedLayer (128,“名字”,“一个fc3”文件)reluLayer (“名字”,“relu2”)fullyConnectedLayer (1,“名字”,“CriticOutput”));actionPath = [featureInputLayer numAct,“归一化”,“没有”,“名字”,“行动”)fullyConnectedLayer (8,“名字”,“取得”));criticNetwork = layerGraph (cnet);criticNetwork = addLayers (criticNetwork actionPath);criticNetwork = connectLayers (criticNetwork,“取得”,“concat / in2”);criticOptions = rlRepresentationOptions (“LearnRate”1 e - 3,“GradientThreshold”1);摘要= rlQValueRepresentation (criticNetwork oinfo ainfo,…“观察”,{“状态”},“行动”,{“行动”},criticOptions);critic2 = rlQValueRepresentation (criticNetwork oinfo ainfo,…“观察”,{“状态”},“行动”,{“行动”},criticOptions);
创建一个演员表示。
actorNetwork = [featureInputLayer numObs,“归一化”,“没有”,“名字”,“状态”)fullyConnectedLayer (128,“名字”,“actorFC1”)reluLayer (“名字”,“relu1”)fullyConnectedLayer (128,“名字”,“actorFC2”)reluLayer (“名字”,“relu2”)fullyConnectedLayer (numAct“名字”,“行动”));actorOptions = rlRepresentationOptions (“LearnRate”1 e - 3,“GradientThreshold”1);演员= rlDeterministicActorRepresentation (actorNetwork oinfo ainfo,…“观察”,{“状态”},“行动”,{“行动”},actorOptions);
使用指定代理选项rlTD3AgentOptions
。代理列车从一种体验缓冲区的最大容量1随机选择mini-batches e6的大小256年
。折现系数0.99
有利于长期的回报。
agentOpts = rlTD3AgentOptions (“SampleTime”Ts,…“DiscountFactor”,0.99,…“ExperienceBufferLength”1 e6,…“MiniBatchSize”,256);
探索在这个TD3代理是高斯模型。噪声模型添加一个统一的随机值的动作在训练。设置噪声的标准差0.5
。标准差的速度衰减1 e-5
每剂一步到的最小值0
。
agentOpts.ExplorationModel。StandardDeviation = 0.5;agentOpts.ExplorationModel。StandardDeviationDecayRate = 1 e-5;agentOpts.ExplorationModel。StandardDeviationMin = 0;
创建TD3代理使用演员和评论家表示。TD3代理的更多信息,请参阅rlTD3Agent
。
代理= rlTD3Agent(演员,[摘要,critic2], agentOpts);
火车代理
培训代理商,首先使用指定培训选项rlTrainingOptions
。对于这个示例,使用以下选项:
运行培训最多100集,每集持久的最多
装天花板(Tf / Ts)
时间步长,总的仿真时间特遣部队
是10
年代。停止训练当代理接收到平均累积奖励大于
5
在20.
连续集。在这一点上,代理可以跟踪参考高度。
trainOpts = rlTrainingOptions (…“MaxEpisodes”,100,…“MaxStepsPerEpisode”装天花板(Tf / Ts),…“StopTrainingCriteria”,“AverageReward”,…“StopTrainingValue”5,…“ScoreAveragingWindowLength”,20);
火车代理使用火车
函数。培训这个代理是一个计算密集型的过程可能需要几分钟才能完成。节省时间在运行这个例子中,加载一个pretrained代理设置doTraining
来假
。训练自己代理,集doTraining
来真正的
。
doTraining = false;如果doTraining trainingStats =火车(代理,env, trainOpts);其他的负载(“rlWatertankTD3Agent.mat”)结束
培训的快照进步是如下图所示。你可以期待不同的结果由于训练过程中固有的随机性。
验证闭环反应
模拟闭环阶跃响应模型视图。强化学习代理能够跟踪参考高度,同时满足了阶跃响应约束。
sim卡(“rlWatertankStepInput”);
关闭模式。
close_system (“rlWatertankStepInput”)