创建自定义MATLAB环境从模板
您可以定义一个自定义的强化学习环境环境创建和修改一个模板类。您可以使用一个自定义模板环境:
实现更复杂的动态环境。
添加自定义可视化环境。
创建一个接口,第三方库中定义语言(如c++, Java®,或者Python®。有关更多信息,请参见外部语言接口。
关于创建MATLAB的更多信息®类,看到用户定义的类。
您可以创建更复杂的自定义使用自定义功能,强化学习环境中描述创建MATLAB环境中使用自定义函数。
创建模板类
定义定制的环境,首先创建模板类文件,指定类的名称。对于本例,类名称MyEnvironment
。
rlCreateEnvTemplate (“MyEnvironment”)
该软件创建和打开模板类文件。模板类的一个子类rl.env.MATLABEnvironment
抽象类,类定义中所示的模板文件。这个抽象类是相同的其他MATLAB强化学习环境所使用的对象。
classdefMyEnvironment < rl.env.MATLABEnvironment
默认情况下,模板类实现了一个简单的cart-pole平衡模型类似于cart-pole预定义的环境中描述负载预定义的控制系统环境。
定义您的环境动力学修改模板类,指定以下:
环境属性
需要环境的方法
可选环境方法
环境属性
在属性
部分的模板,指定任何参数创建和模拟环境的必要条件。这些参数包括:
物理常数——样本环境定义了重力加速度(
重力
)。环境几何——样本环境定义了车和钢管质量(
CartMass
和PoleMass
)和杆的半身像(HalfPoleLength
)。环境约束——样本环境定义了极角和车距离阈值(
AngleThreshold
和DisplacementThreshold
)。环境训练集时使用这些值来检测完成。评估环境——样本所需变量环境定义了状态向量(
状态
)和一个标志指示当完成一集(结束
)。常量定义的行动或观测空间——样本环境定义的最大力量行动空间(
MaxForce
)。常数计算奖励的信号——样本环境定义常量
RewardForNotFalling
和PenaltyForFalling
。
属性%指定环境和初始化必要的属性%重力加速度在m / s ^ 2重力= 9.8%车的质量CartMass = 1.0%的质量PoleMass = 0.1%杆的长度的一半HalfPoleLength = 0.5%马克斯力输入可以应用MaxForce = 10%样品时间t = 0.02%失败这一事件的角度(弧度)AngleThreshold = 12 *π/ 180%距离失败这一事件DisplacementThreshold = 2.4%奖励每个时间步cart-pole是平衡的RewardForNotFalling = 1%点球cart-pole不能平衡PenaltyForFalling = -10结束属性%初始化系统状态(x, dx,θ,dtheta)”状态= 0 (4,1)结束属性(访问=保护)%初始化内部标记来表示事件终止结束= false结束
所需的功能
强化学习环境需要以下功能定义。的getObservationInfo
,getActionInfo
,sim卡
,validateEnvironment
已经基本抽象类中定义的函数。创建您的环境,您必须定义构造函数,重置
,一步
功能。
函数 | 描述 |
---|---|
getObservationInfo |
返回的信息环境的观察 |
getActionInfo |
返回的信息环境的行动 |
sim卡 |
模拟环境与一个代理 |
validateEnvironment |
通过调用验证环境重置 功能和模拟时间步使用环境一步 |
重置 |
初始化和清理任何可视化环境状态 |
一步 |
应用一个动作,为一步模拟环境,并输出观测和奖励;同时,设置一个标志表明这一事件是否完成 |
构造函数 | 一个函数与类相同的名称创建类的实例 |
样本构造函数
示例cart-pole构造函数创建的环境:
定义操作和观测规范。创建这些规范的更多信息,请参阅
rlNumericSpec
和rlFiniteSetSpec
。调用抽象基类的构造函数。
函数这个= MyEnvironment ()%初始化设置观察ObservationInfo = rlNumericSpec (1 [4]);ObservationInfo。Name =“CartPole州”;ObservationInfo。描述=“x, dx,θ,dtheta”;%初始化动作设置ActionInfo = rlFiniteSetSpec ([1]);ActionInfo。Name =“CartPole行动”;%以下线实现了RL环境的内置函数这= this@rl.env.MATLABEnvironment (ObservationInfo ActionInfo);%初始化属性值和预先执行必要的值updateActionInfo(这个);结束
这个示例构造函数不包括任何输入参数。然而,您可以为您的自定义添加输入参数的构造函数。
样本重置
函数
示例cart-pole重置函数集模型的初始条件和返回的初始值观测。它还生成一个通知,环境已经更新通过调用envUpdatedCallback
函数,它是有用的为更新环境可视化。
%重置环境初始状态并返回最初的观察函数InitialObservation =重置(这)θ(+ - % . 05 rad)T0 = 2 * 0.05 *兰德- 0.05;% ThetadotTd0 = 0;% XX0 = 0;% XdotXd0 = 0;InitialObservation = (X0, Xd0; T0; Td0);这一点。状态= InitialObservation;%(可选)使用notifyEnvUpdated信号%更新环境(例如,更新可视化)notifyEnvUpdated(这个);结束
样本一步
函数
示例cart-pole一步
功能:
流程的输入动作。
评估环境动态方程为一个时间步。
计算并返回更新后的观察。
计算并返回奖励的信号。
检查这一事件是否完成并返回
结束
适当的信号。生成一个通知,环境已经被更新了。
函数(观察、奖励、结束,LoggedSignals) =步骤(这一点,行动)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.HalfPoleLength * (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);θ=观察(3);结束= abs (X) >。DisplacementThreshold||abs(Theta) > this.AngleThreshold; this.IsDone = IsDone;%得到奖励奖励= getReward(这个);%(可选)使用notifyEnvUpdated信号%环境已经更新(例如,更新可视化)notifyEnvUpdated(这个);结束
可选功能
您可以定义中的任何其他函数模板类。例如,您可以创建辅助功能调用一步
或重置
。cart-pole模板模型实现getReward
函数在每个时间步长计算奖励。
函数奖励= getReward(这)如果~。结束Reward = this.RewardForNotFalling;其他的奖励= this.PenaltyForFalling;结束结束
环境可视化
您可以添加定制环境通过实现可视化情节
函数。在情节
功能:
创建一个人物或一个可视化工具类的一个实例的实现。对于这个示例,您将创建一个图和存储环境中的图对象的句柄。
调用
envUpdatedCallback
函数。
函数情节(这)%初始化可视化这一点。图=图(“可见”,“上”,“HandleVisibility”,“关闭”);甘氨胆酸公顷= (this.Figure);哈哈。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(哈,“标签”,“cartplot”);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 =翻译(cartpoly [x]);cartplot =情节(哈,cartpoly,“FaceColor”[0.8500 0.3250 0.0980]);cartplot。标签=“cartplot”;%初始化极阴谋L = this.HalfPoleLength * 2;polepoly = 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.4470 - 0.7410 [0]);poleplot。标签=“poleplot”;其他的cartpoly = cartplot.Shape;polepoly = poleplot.Shape;结束%计算新的购物车和领先地位[cartposx ~] =质心(cartpoly);[poleposx, poleposy] =质心(polepoly);dx = x - cartposx;dtheta =θ-量化(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;%刷新呈现在图窗口drawnow ();结束结束
环境要求envUpdatedCallback
可视化功能,因此更新,每次更新环境。
创建自定义环境
定义您的自定义环境类之后,MATLAB的工作区中创建一个实例。在命令行中,键入以下。
env = MyEnvironment;
如果你的构造函数输入参数,指定类名之后。例如,MyEnvironment (__arg1、最长)
。
在您创建您的环境,最佳实践是验证环境动力学。为此,使用validateEnvironment
函数,它打印一个错误命令窗口,如果您的环境中实现有任何问题。
validateEnvironment (env)
验证环境对象后,您可以使用它来训练强化学习代理。培训代理商的更多信息,请参阅强化学习培训代理。