通过创建和修改模板环境类,可以定义自定义强化学习环境。您可以使用自定义模板环境:
实现更复杂的环境动态。
向您的环境中添加自定义可视化。
创建一个接口到用c++、Java等语言定义的第三方库®,或者Python®.有关更多信息,请参见外部语言接口.
有关创建MATLAB的更多信息®类,看到用户定义的类.
您可以使用自定义函数创建不那么复杂的自定义强化学习环境,如中所述使用自定义功能创建MATLAB环境.
要定义自定义环境,首先创建模板类文件,指定类的名称。对于此示例,请为类命名MyEnvironment
.
rlCreateEnvTemplate (“MyEnvironment”)
该软件创建并打开模板类文件。模板类是一个子类rl.env.MATLABEnvironment
抽象类,如模板文件开始的类定义中所示。此抽象类是其他MATLAB加强学习环境对象使用的类。
Classdef.MyEnvironment < rl.env.MATLABEnvironment
默认情况下,模板类实现了一个类似于上面描述的购物车预定环境的简单推车杆平衡模型加载预定义的控制系统环境.
要定义环境动态,请修改模板类,请指定以下内容:
环境属性
必要的环境方法
可选环境方法
在属性
节中指定创建和模拟环境所需的任何参数。这些参数包括:
物理常数-样本环境定义了重力加速度(重力
).
环境几何-样本环境定义了车和极点质量(CartMass
和Polimass.
)和杆的半长(HalfPoleLength
).
环境约束-样本环境定义了极点角度和车距阈值(AngleThreshold
和DisplacementThreshold
).环境使用这些值来检测训练集何时结束。
评估环境所需的变量——示例环境定义了状态向量(状态
),以及指示某一集何时结束的标志(结束
).
定义动作或观察空间的常量-样本环境定义动作空间的最大力(Maxiforce.
).
用于计算奖励信号的常量——样本环境定义了这些常量Remandfornotfalling.
和PenaltyForFalling
.
属性%指定并初始化环境的必要属性%重力加速度,单位是m/s^2重力= 9.8%大量的购物车Cartmass = 1.0%磁极质量PoleMass = 0.1杆的长度的一半Halfpolenth = 0.5%输入可以应用的最大强制maxforce = 10.% 采样时间t = 0.02%失败的角度(弧度)AngleThreshold = 12 * pi/180距离在哪里失败的插曲DisplacementThreshold = 2.4奖励每一步推车杆是平衡的RewardForNotFalling = 1当卡车杆未能平衡时%处罚PenaltyForFalling = -10结束属性%初始化系统状态[x,dx,theta,dtheta]'状态= 0 (4,1)结束属性(访问=保护)%初始化内部标志以指示剧集终端结束= false结束
增强学习环境需要定义以下功能。这getObservationInfo
,getActionInfo.
,sim卡
,验证环境
函数已经在基抽象类中定义。要创建您的环境,您必须定义构造函数,重启
,步
职能。
函数 | 描述 |
---|---|
getObservationInfo |
返回有关环境观测的信息 |
getActionInfo. |
返回有关环境操作的信息 |
sim卡 |
使用代理模拟环境 |
验证环境 |
通过调用来验证环境重启 使用和模拟环境一次性步骤步 |
重启 |
初始化环境状态并清除任何可视化 |
步 |
应用一个动作,模拟一个步骤的环境,并输出观察结果和奖励;此外,设置一个标志,表明该集是否完成 |
构造函数 | 与类同名的函数,创建类的实例 |
cart-pole构造函数示例通过以下方式创建环境:
定义动作和观察规范。有关创建这些规范的更多信息,请参见rlNumericSpec
和rlfinitesetspec.
.
调用基抽象类的构造函数。
函数这个= MyEnvironment ()%初始化观察设置观察invo = rlnumericspec([4 1]);观察info.name =“CartPole州”;ObservationInfo。描述='x dx d ';%初始化操作设置ActionInfo = rlfinitesetspec([ - 1 1]);ActionInfo.name =.'cartpole行动';%下面的行实现了RL环境的内置函数这= this@rl.env.MATLABEnvironment (ObservationInfo ActionInfo);%初始化属性值并预计算必要值UpdateActionInfo(此);结束
这个示例构造函数不包含任何输入参数。但是,您可以为自定义构造函数添加输入参数。
重启
函数样本车极复位函数设置模型的初始条件并返回观测值的初始值。控件还生成环境已更新的通知envUpdatedCallback
函数,这对于更新环境可视化非常有用。
%重置环境到初始状态并返回初始观察函数InitialObservation =重置(这)%THETA(+ - .05 rad)T0 = 2 * 0.05 * rand - 0.05;%thetadot.td0 = 0;% Xx0 = 0;% XdotXd0 = 0;InitialObservation = (X0, Xd0; T0; Td0);这一点。状态= InitialObservation;%(可选)使用notifyEnvUpdated来表示%环境被更新(例如,更新可视化)Notifyenvupdated(这);结束
步
函数示例cart-pole步
功能:
处理输入动作。
评估环境动态方程一次步骤。
计算并返回更新后的观测结果。
计算并返回奖励信号。
属性,并返回结束
信号适当。
生成一个通知环境已更新。
函数[观察,奖励,IsDone,LoggedSignals] = step(this,Action) LoggedSignals = [];%得到行动力= getForce(这个动作);%解压状态向量XDot = this.State (2);θ= this.State (3);ThetaDot = this.State (4);%缓存以避免重新计算CosTheta = cos(θ);SinTheta =罪(θ);SystemMass =。CartMass+ this.PoleMass; temp = (Force + this.PoleMass*this.HalfPoleLength*ThetaDot^2*SinTheta).../ systemmass;%应用运动方程ThetaDotDot =(。重力*SinTheta - CosTheta*temp).../ (this. halfpolellength *(4.0/3.0 - this.PoleMass*CosTheta*CosTheta/SystemMass));XDotDot = temp - this.PoleMass*this.HalfPoleLength*ThetaDotDot*CosTheta/SystemMass;%欧拉集成观察=。状态+ this.Ts.*[XDot;XDotDot;ThetaDot;ThetaDotDot];%更新系统状态这一点。状态=观察;%检查终端状态x =观察(1);Theta =观察(3);ISDONE = ABS(x)> This.displacementThreshold ||abs(θ)> this.anglethreshold;this.isdone = Isdone;%得到奖励奖励= getReward(这个);%(可选)使用notifyEnvUpdated来表示%环境已被更新(例如,更新可视化)Notifyenvupdated(这);结束
您可以根据需要在模板类中定义任何其他函数。例如,您可以创建任何一方调用的助手函数步
或重启
.推车杆模板模型实现了一个得到奖励
在每个时间步计算奖励的函数。
函数奖励= getReward(这)如果~。结束Reward = this.RewardForNotFalling;其他的奖励= this.PenaltyForFalling;结束结束
您可以通过实现来为自定义环境添加可视化情节
函数。在情节
功能:
创建自己实现的Visualizer类的图形或实例。对于此示例,您创建一个图并将句柄存储到环境对象中的图形。
调用envUpdatedCallback
函数。
函数情节(这)%启动可视化this.figure = figure('可见的',“上”,“HandleVisibility”,'离开');甘氨胆酸公顷= (this.Figure);ha.xlimmode =“手动”;哈哈。YLimMode =“手动”;哈哈。XLim = [3 3];哈哈。YLim = [1 2];(哈,“上”);%更新可视化envUpdatedCallback(这)结束
对于本例,将图形的句柄存储为环境对象的受保护属性。
属性(访问=保护)%初始化内部标志以指示剧集终端结束= false图形的句柄数字结束
在envUpdatedCallback
,将可视化绘制为图形,或者使用自定义可视化工具对象。例如,检查是否设置了图形手柄。如果有,那么绘制可视化图。
函数envUpdatedCallback(这)如果~ isempty (this.Figure) & & (this.Figure)是否是可用的。%将可视化图设置为当前数字甘氨胆酸公顷= (this.Figure);提取推车位置和电杆角度x = this.State (1);θ= this.State (3);cartplot = findobj(哈,'标签','卡图');poleplot = findobj(哈,'标签',“poleplot”);如果isempty (cartplot) | | ~ isvalid (cartplot)...|| isempty(poleplot) || ~isvalid(poleplot)%初始化购物车情节Cartpoly = polyshape([-0.25 -0.25 . 0.25 . 0.25],[-0.125 0.125 0.125 -0.125]);Cartpoly = translate(Cartpoly,[x 0]);cartplot =情节(哈,cartpoly,“FaceColor”[0.8500 0.3250 0.0980]);cartplot。标签='卡图';%初始化极点图L = this.HalfPoleLength * 2;polpoly = polyshape([-0.1 -0.1 0.1 0.1],[0 L L 0]);polepoly =翻译(polepoly (x, 0));polepoly =旋转(polepoly rad2deg(θ),[x, 0]);poleplot =情节(哈,polepoly,“FaceColor”,[0 0.4470 0.7410]);Playplot.tag =.“poleplot”;其他的cartpoly = cartplot.Shape;polepoly = poleplot.Shape;结束%计算新的推车和杆位[cartposx ~] =质心(cartpoly);[poleposx, poleposy] =质心(polepoly);Dx = x - cartposx;Dtheta = theta - atan2(cartposx-poleposx,poleposy-0.25/2);cartpoly =翻译(cartpoly (dx, 0));polepoly =翻译(polepoly (dx, 0));polepoly =旋转(polepoly rad2deg (dtheta), [x, 0.25 / 2]);%在标绘图上更新推车和杆子位置cartplot。形状= cartpoly;poleplot。形状= polepoly;%刷新显示在图窗口rawing();结束结束
环境称之为envUpdatedCallback
函数,因此在更新环境时更新可视化。
定义了自定义环境类之后,在MATLAB工作空间中创建一个它的实例。在命令行中,键入以下内容。
env = MyEnvironment;
如果构造函数有输入参数,请在类名之后指定它们。例如,myenvironment(arg1,arg2)
.
创建环境后,最佳实践是验证环境动态。为此,使用验证环境
函数,如果您的环境实现有任何问题,它将向命令窗口打印一个错误。
验证环境(ENV)
在验证了环境对象之后,您可以使用它来训练强化学习代理。有关培训代理的更多信息,请参见训练强化学习代理.