主要内容

创建自定义MATLAB模板中的环境

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

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

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

  • 创建到用c++、Java等语言定义的第三方库的接口®,或Python®.有关更多信息,请参见外部语言接口

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

您可以使用自定义函数创建不太复杂的自定义强化学习环境,如中所述使用自定义函数创建MATLAB环境

创建模板类

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

rlCreateEnvTemplate (“MyEnvironment”

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

classdefMyEnvironment < rl.env.MATLABEnvironment

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

要定义环境动态修改模板类,请指定以下内容:

  • 环境属性

  • 所需的环境方法

  • 可选环境方法

环境属性

属性部分,指定创建和模拟环境所需的任何参数。这些参数包括:

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

  • 环境几何结构——样例环境定义推车和杆子质量(CartMass而且PoleMass)和杆子的半长(HalfPoleLength).

  • 环境约束——样例环境定义了杆角和小车距离阈值(AngleThreshold而且DisplacementThreshold).环境使用这些值来检测训练集何时结束。

  • 评估环境所需的变量——样例环境定义状态向量(状态)和表示某一集何时结束的标志(结束).

  • 定义动作或观察空间的常量——示例环境定义动作空间的最大力(MaxForce).

  • 计算奖励信号的常量——样本环境定义了常量RewardForNotFalling而且PenaltyForFalling

属性指定并初始化环境的必要属性%重力加速度,单位为m/s^2重力= 9.8手推车的%质量CartMass = 1.0%极点的质量PoleMass = 0.1杆子长度的一半HalfPoleLength = 0.5输入可以施加的最大力MaxForce = 10%采样时间Ts = 0.02插曲失败的角度%(弧度)AngleThreshold = 12 * pi/180%插曲失败的距离DisplacementThreshold = 2.4%奖励每一步平衡车杆RewardForNotFalling = 1当横担未能平衡时,%扣分跌倒惩罚= -10结束属性初始化系统状态[x,dx,theta,dtheta]'状态= 0 (4,1)结束属性(Access = protected)初始化内部标志以指示插曲终止IsDone = false结束

所需的功能

强化学习环境需要定义以下函数。的getObservationInfogetActionInfosim卡,validateEnvironment函数已经在基抽象类中定义。要创建环境,必须定义构造函数,重置,一步功能。

函数 描述
getObservationInfo 返回关于环境观测的信息
getActionInfo 返回有关环境操作的信息
sim卡 使用代理模拟环境
validateEnvironment 方法验证环境重置功能和模拟环境的一次步使用一步
重置 初始化环境状态并清理任何可视化
一步 应用一个动作,模拟一个步骤的环境,并输出观察结果和奖励;此外,设置一个标志,指示情节是否完成
构造函数 与创建该类实例的类同名的函数

示例构造函数

样例cart-pole构造函数通过以下方式创建环境:

  • 定义动作和观察规范。有关创建这些规范的详细信息,请参见rlNumericSpec而且rlFiniteSetSpec

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

函数this = MyEnvironment()初始化观察设置ObservationInfo = rlNumericSpec([4 1]);ObservationInfo。Name =“CartPole州”;ObservationInfo。描述='x, dx, d '初始化操作设置ActionInfo = rlFiniteSetSpec([-1 1]);ActionInfo。Name =“CartPole行动”下面一行实现了RL环境的内置函数this = this@rl.env.MATLABEnvironment(ObservationInfo,ActionInfo);初始化属性值并预计算必要的值updateActionInfo(这个);结束

这个示例构造函数不包括任何输入参数。但是,您可以为自定义构造函数添加输入参数。

样本重置函数

样本车杆复位函数设置模型的初始条件并返回观测值的初始值。方法生成环境已更新的通知envUpdatedCallback函数,该函数对于更新环境可视化非常有用。

将环境重置为初始状态并返回初始观测值函数InitialObservation = reset(this)% Theta (+- .05 rad)T0 = 2 * 0.05 * rand - 0.05;% ThetadotTd0 = 0;% XX0 = 0;% XdotXd0 = 0;InitialObservation = [X0;Xd0;T0;Td0];这一点。State = InitialObservation;%(可选)使用notifyEnvUpdated表示%环境更新(例如,更新可视化)notifyEnvUpdated(这个);结束

样本一步函数

扁担样品一步功能:

  • 处理输入操作。

  • 计算一个时间步长的环境动力学方程。

  • 计算并返回更新后的观察值。

  • 计算并返回奖励信号。

  • 方法检查集是否完整并返回结束适当地发出信号。

  • 生成环境已更新的通知。

函数[观察,奖励,IsDone,LoggedSignals] = step(this,Action) LoggedSignals = [];%采取行动Force = getForce(this,Action);解包状态向量XDot = this.State(2);Theta = this.State(3);ThetaDot = this.State(4);%缓存以避免重新计算CosTheta = cos(Theta);SinTheta = sin(Theta);SystemMass = this。CartMass+ this.PoleMass; temp = (Force + this.PoleMass*this.HalfPoleLength*ThetaDot^2*SinTheta).../ SystemMass;应用运动方程ThetaDotDot =(这个。重力*SinTheta - CosTheta*temp).../ (this. halfpolelth *(4.0/3.0 - this.PoleMass*CosTheta*CosTheta/SystemMass));XDotDot = temp - this.PoleMass*this. halfpolelth *ThetaDotDot*CosTheta/SystemMass;%欧拉积分观察=这个。状态+ this.Ts.*[XDot;XDotDot;ThetaDot;ThetaDotDot];更新系统状态这一点。状态=观察;检查终端状况X =观测(1);Theta =观察(3);IsDone = abs(X) >这个。DisplacementThreshold||abs(Theta) > this.AngleThreshold; this.IsDone = IsDone;%获得奖励Reward = getReward(这个);%(可选)使用notifyEnvUpdated表示%环境已更新(例如,更新可视化)notifyEnvUpdated(这个);结束

可选功能

您可以根据需要在模板类中定义任何其他函数。例如,您可以创建由任何一方调用的helper函数一步重置.马车杆模板模型实现了一个getReward函数用于计算每个时间步的奖励。

函数Reward = getReward(这个)如果~。结束Reward = this.RewardForNotFalling;其他的Reward = this. punishment for falling;结束结束

环境可视化

控件可以将可视化添加到自定义环境中情节函数。在情节功能:

  • 创建您自己实现的可视化器类的图形或实例。对于本例,您将创建一个图形,并在环境对象中存储该图形的句柄。

  • 调用envUpdatedCallback函数。

函数情节(这)%启动可视化这一点。Figure = Figure (“可见”“上”“HandleVisibility”“关闭”);ha = gca(this.Figure);哈哈。XLimMode =“手动”;哈哈。YLimMode =“手动”;哈哈。XLim = [-3 3];哈哈。YLim = [-1 2];(哈,“上”);%更新可视化envUpdatedCallback(这)结束

对于本例,将图的句柄存储为环境对象的受保护属性。

属性(Access = protected)初始化内部标志以指示插曲终止IsDone = false%数字句柄数字结束

envUpdatedCallback,将可视化绘制到图形或使用自定义可视化器对象。例如,检查图形句柄是否已设置。如果有,那么绘制可视化图。

函数envUpdatedCallback(这)如果~isempty(this.Figure) &&是有效的(this.Figure)将可视化图形设置为当前图形ha = gca(this.Figure);提取推车位置和杆角x = this.State(1);theta = this.State(3);Cartplot = findobj(哈,“标签”“cartplot”);Poleplot = findobj(ha,“标签”“poleplot”);如果Isempty (cartplot) || ~isvalid(cartplot)...||为空(poleplot) || ~为有效(poleplot)初始化购物车图形Cartpoly = polyhape ([-0.25 -0.25 0.25 0.25],[-0.125 0.125 0.125 -0.125]);Cartpoly = translate(Cartpoly,[x 0]);Cartplot = plot(哈,cartpoly,“FaceColor”,[0.8500 0.3250 0.0980]);cartplot。标签=“cartplot”初始化极点图L = this.HalfPoleLength*2;聚多相=多相([-0.1 -0.1 0.1 0.1],[0 L L 0]);Polepoly = translate(Polepoly,[x,0]);Polepoly = rotate(Polepoly,rad2deg(theta),[x,0]);Poleplot = plot(ha,polepoly, polepoly)“FaceColor”,[0 0.4470 0.7410]);poleplot。标签=“poleplot”其他的cartpoly = cartplot.Shape;polepoly = poleplot.Shape;结束计算新的小车和杆位[cartposx,~] =质心(cartpoly);[poleposx,poleposy] =质心(poleposx);Dx = x - cartposx;Dtheta = theta - atan2(cartposx-poleposx,poleposy-0.25/2);Cartpoly =翻译(Cartpoly,[dx,0]);Polepoly = translate(Polepoly,[dx,0]);Polepoly = rotate(Polepoly,rad2deg(dtheta),[x,0.25/2]);更新图上的推车和杆位cartplot。形状= cartpoly;poleplot。形状= polepoly;在图形窗口刷新渲染drawnow ();结束结束

环境呼唤envUpdatedCallback函数,因此每当环境更新时都会更新可视化。

创建自定义环境

定义自定义环境类后,在MATLAB工作区中创建它的实例。在命令行中输入以下内容。

env = MyEnvironment;

如果构造函数有输入参数,请在类名之后指定它们。例如,MyEnvironment (__arg1、最长)

创建环境之后,最佳实践是验证环境动态。要做到这一点,请使用validateEnvironment函数,如果环境实现有任何问题,该函数会将错误打印到命令窗口。

validateEnvironment (env)

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

另请参阅

|

相关的话题