主要内容

创建自定义MATLAB环境从模板

您可以定义一个自定义的强化学习环境环境创建和修改一个模板类。您可以使用一个自定义模板环境:

  • 实现更复杂的动态环境。

  • 添加自定义可视化环境。

  • 创建一个接口,第三方库中定义语言(如c++, Java®,或者Python®。有关更多信息,请参见外部语言接口

关于创建MATLAB的更多信息®类,看到用户定义的类

您可以创建更复杂的自定义使用自定义功能,强化学习环境中描述创建MATLAB环境中使用自定义函数

创建模板类

定义定制的环境,首先创建模板类文件,指定类的名称。对于本例,类名称MyEnvironment

rlCreateEnvTemplate (“MyEnvironment”)

该软件创建和打开模板类文件。模板类的一个子类rl.env.MATLABEnvironment抽象类,类定义中所示的模板文件。这个抽象类是相同的其他MATLAB强化学习环境所使用的对象。

classdefMyEnvironment < rl.env.MATLABEnvironment

默认情况下,模板类实现了一个简单的cart-pole平衡模型类似于cart-pole预定义的环境中描述负载预定义的控制系统环境

定义您的环境动力学修改模板类,指定以下:

  • 环境属性

  • 需要环境的方法

  • 可选环境方法

环境属性

属性部分的模板,指定任何参数创建和模拟环境的必要条件。这些参数包括:

  • 物理常数——样本环境定义了重力加速度(重力)。

  • 环境几何——样本环境定义了车和钢管质量(CartMassPoleMass)和杆的半身像(HalfPoleLength)。

  • 环境约束——样本环境定义了极角和车距离阈值(AngleThresholdDisplacementThreshold)。环境训练集时使用这些值来检测完成。

  • 评估环境——样本所需变量环境定义了状态向量(状态)和一个标志指示当完成一集(结束)。

  • 常量定义的行动或观测空间——样本环境定义的最大力量行动空间(MaxForce)。

  • 常数计算奖励的信号——样本环境定义常量RewardForNotFallingPenaltyForFalling

属性%指定环境和初始化必要的属性%重力加速度在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构造函数创建的环境:

  • 定义操作和观测规范。创建这些规范的更多信息,请参阅rlNumericSpecrlFiniteSetSpec

  • 调用抽象基类的构造函数。

函数这个= 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)

验证环境对象后,您可以使用它来训练强化学习代理。培训代理商的更多信息,请参阅强化学习培训代理

另请参阅

|

相关的话题