主要内容

generateRewardFunction

生成一个奖励函数控制规范训练强化学习代理

自从R2021b

    描述

    例子

    generateRewardFunction (mpcobj)生成一个MATLAB®奖励基于成本函数和约束线性或非线性MPC中定义的对象mpcobj。生成的回报函数显示在一个新的编辑器窗口,您可以使用它作为一个起点奖励设计。您可以调整权重,使用不同的罚函数,然后使用结果回报函数在一个环境来训练一个代理。

    这个语法需要模型预测控制工具箱™软件。

    例子

    generateRewardFunction (黑色)生成一个MATLAB奖励功能基于性能约束模型验证块中定义的组块中指定的路径黑色

    这个语法需要万博1manbetx®优化设计™软件。

    generateRewardFunction (___“FunctionName”,myFcnName)指定生成的回报函数的名称,并将它保存到一个文件中使用相同的名称。它还覆盖任何现有的文件在当前目录名称相同的。提供这个名字后的前一个输入参数。

    例子

    全部折叠

    这个例子展示了如何生成一个强化学习奖励函数MPC的对象。

    定义植物和创建MPC控制器

    创建一个随机的工厂使用rss功能和设置直通的矩阵为零。

    工厂= rss (4、3、2);工厂。d = 0;

    指定的植物信号操纵变量,测量干扰,测量输出和无边无际的输出。

    植物= setmpcsignals(植物,“MV”,1“医学博士”2,“莫”(1 - 2),“UO”3);

    创建一个MPC控制器样品时间为0.1,预测和控制视野的10和3步骤,分别。

    mpcobj = mpc(3)植物,0.1,10日;
    - - >“权重。ManipulatedVariables”是空的。假设默认的0.00000。- - >“权重。ManipulatedVariablesRate”是空的。假设默认的0.10000。- - >“权重。OutputVariables”是空的。假设默认的1.00000。输出(s) y1输出(s)和零重量y2 y3

    设置限制和操纵变量的比例因子。

    mpcobj.ManipulatedVariables。Min = 2;mpcobj.ManipulatedVariables。Max = 2;mpcobj.ManipulatedVariables。ScaleFactor = 4;

    为二次成本函数设置权重。

    mpcobj.Weights。OutputVariables = (10 1 0.1);mpcobj.Weights。ManipulatedVariablesRate = 0.2;

    生成奖励函数

    生成奖励函数代码的规范货币政策委员会对象使用generateRewardFunction。在MATLAB编辑器中显示的代码。

    generateRewardFunction (mpcobj)

    对于这个示例,是保存在MATLAB函数文件myMpcRewardFcn.m。显示生成的回报函数。

    类型myMpcRewardFcn.m
    函数奖励= myMpcRewardFcn (y, refy, mv, refmv lastmv) % myMpcRewardFcn从MPC规范产生回报。% % % %的描述输入参数:y:输出变量从植物k + 1% refy步:参考输出变量k + 1% mv步:被控变量在k % refmv步:参考被控变量在k % lastmv步:被控变量在k - 1步% %的局限性(MPC和NLMPC): % -奖励计算基于预测地平线的第一步。%因此,信号预览和控制层设置将被忽略。%,不支持在线更新成本和约束。万博1manbetx% - - - - - -自定义不考虑成本和约束规范。%——时变不支持重量和成本约束。万博1manbetx% -混合约束规范不考虑(MPC)。%强化学习工具箱% 27 - 2021年5月——14:47:29 % # codegen从MPC对象% % %规范标准线性范围规定‘州’,‘OutputVariables’,和%的ManipulatedVariables属性ymin =(负负无穷到负无穷到);ymax =(正正无穷正);mvmin = 2; mvmax = 2; mvratemin = -Inf; mvratemax = Inf; % Scale factors as specified in 'States', 'OutputVariables', and % 'ManipulatedVariables' properties Sy = [1 1 1]; Smv = 4; % Standard cost weights as specified in 'Weights' property Qy = [10 1 0.1]; Qmv = 0; Qmvrate = 0.2; %% Compute cost dy = (refy(:)-y(:)) ./ Sy'; dmv = (refmv(:)-mv(:)) ./ Smv'; dmvrate = (mv(:)-lastmv(:)) ./ Smv'; Jy = dy' * diag(Qy.^2) * dy; Jmv = dmv' * diag(Qmv.^2) * dmv; Jmvrate = dmvrate' * diag(Qmvrate.^2) * dmvrate; Cost = Jy + Jmv + Jmvrate; %% Penalty function weight (specify nonnegative) Wy = [1 1 1]; Wmv = 10; Wmvrate = 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'. % % Alternaltively, use the hyperbolicPenalty or barrierPenalty function for % computing hyperbolic and barrier penalties. % % For more information, see help for these functions. % % Set Pmv value to 0 if the RL agent action specification has % appropriate 'LowerLimit' and 'UpperLimit' values. Py = Wy * exteriorPenalty(y,ymin,ymax,'step'); Pmv = Wmv * exteriorPenalty(mv,mvmin,mvmax,'step'); Pmvrate = Wmvrate * exteriorPenalty(mv-lastmv,mvratemin,mvratemax,'step'); Penalty = Py + Pmv + Pmvrate; %% Compute reward reward = -(Cost + Penalty); end

    计算奖励只取决于当前值的输入和输出信号和参考价值,它是由两部分组成的。

    第一个是负成本,取决于所需的平方的区别和当前输入和输出。这部分使用成本函数中指定权重MPC对象。第二部分是一个点球,作为负奖励每当当前植物信号违反约束。

    生成的奖励奖励设计函数是一个起点。您可以调整权重或使用一个不同的罚函数来定义一个更合适的奖励你强化学习代理。

    这个例子展示了如何生成一个强化学习奖励函数从一个仿真软件设计优化模型验证。万博1manbetx

    对于这个示例,打开仿真软件模型万博1manbetxLevelCheckBlock.slx,其中包含一个检查阶跃响应特性块命名水平检查

    open_system (“LevelCheckBlock”)

    图检查阶跃响应特性[1]级检查包含一个坐标轴对象和其他对象类型的uiflowcontainer, uimenu uitoolbar。坐标轴对象包含9块类型的对象。

    生成奖励函数代码的规范水平检查块,用generateRewardFunction。在MATLAB编辑器中显示的代码。

    generateRewardFunction (“LevelCheckBlock /水平检查”)

    对于这个示例,代码保存在文件的MATLAB函数myBlockRewardFcn.m

    显示生成的回报函数。

    类型myBlockRewardFcn.m
    函数奖励= myBlockRewardFcn (x, t) % myBlockRewardFcn生成奖励从模型块规格。万博1manbetx% % x:输入LevelCheckBlock /水平检查% t:仿真时间(s) %强化学习工具箱% 27 - 2021年5月——16:45:27 % # codegen % %规范从LevelCheckBlock /水平检查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 = 1; %% 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'. % % Alternaltively, 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,'step')); %% Compute reward reward = -Weight * Penalty; end

    生成的回报函数作为输入参数的当前值验证块输入信号和仿真时间。负奖励计算使用加权惩罚违反行为每当当前块输入信号线性约束验证块中定义的约束。

    生成的奖励奖励设计函数是一个起点。您可以调整权重或使用一个不同的罚函数来定义一个更合适的奖励你强化学习代理。

    关闭仿真软件模型。万博1manbetx

    close_system (“LevelCheckBlock”)

    输入参数

    全部折叠

    线性或非线性MPC对象,指定为一个货币政策委员会(模型预测控制工具箱)对象或一个nlmpc(模型预测控制工具箱)对象,分别。

    注意:

    • 生成的函数计算奖励使用信号值在当前时间。预测未来值、信号预览和控制层设置不用于奖励计算。

    • 利用时变重量和成本约束,不支持在线或更新它们,。万博1manbetx

    • 标准二次成本函数,描述优化问题(模型预测控制工具箱),支持。万博1manbetx因此,对于货币政策委员会不支持对象,使用混合约束规范。万博1manbetx同样的,对nlmpc对象,不支持自定义成本和约束规范。万博1manbetx

    例子:mpc (tf ([1], [1 2 0]), 0.1)

    路径模型验证块,指定为字符数组,细胞数组或字符串数组。所支持的万博1manbetx万博1manbetx仿真软件优化设计模型验证块以下的。

    生成的回报函数作为输入参数的当前值验证块输入信号和仿真时间。负奖励计算使用加权惩罚违反行为每当当前块输入信号线性约束验证块中定义的约束。

    例子:“my万博1manbetxSimulinkModel02 /核对参考”

    函数名称,指定为一个字符串对象或特征向量。

    例子:“reward03epf_step”

    提示

    默认情况下,外部罚函数exteriorPenalty用于计算罚款。另外,计算双曲线和屏障处罚,您可以使用hyperbolicPenaltybarrierPenalty功能。

    版本历史

    介绍了R2021b