主要内容

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

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

  • 实现更复杂的环境动力学。

  • 将自定义可视化添加到您的环境中。

  • 创建一个接口,用C++语言定义的第三方库,如java、Java®,或Python®. 有关详细信息,请参阅外部语言接口

有关创建MATLAB的详细信息,请参见®类,请参见用户定义类

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

创建模板类

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

rlCreateEnvTemplate(“MyEnvironment”

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

classdefMyEnvironment < rl.env.MATLABEnvironment

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

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

  • 环境属性

  • 所需的环境方法

  • 可选环境方法

环境属性

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

  • 物理常数-样本环境定义了重力引起的加速度(重力).

  • 环境几何-示例环境定义购物车和极点质量(卡特马斯极地)还有杆的一半长度(HalfPoleLength).

  • 环境约束-示例环境定义了极点角度和小车距离阈值(角度阈值DisplacementThreshold).环境使用这些值来检测训练集何时结束。

  • 评估环境所需的变量——示例环境定义了状态向量(状态)以及一个标志,用于指示一集何时结束(结束).

  • 定义动作或观察空间的常量。示例环境定义动作空间的最大力(马克斯福斯).

  • 用于计算奖励信号的常数-示例环境定义了这些常数奖赏不落堕落的惩罚

性质%指定并初始化环境的必要属性%重力引起的加速度,单位为m/s^2重力= 9.8%车的质量CartMass=1.0%极点质量极性=0.1%杆的一半长度半极长度=0.5%输入可以应用的最大力最大力=10%采样时间t = 0.02失败集的角度(弧度)角度阈值= 12 * pi/180%这一集失败的距离位移阈值=2.4%每走一步,都要奖励平衡的车杆RewardForNotFalling = 1%当手推车杆无法平衡时的罚款PenaltyForFalling = -10结束性质%初始化系统状态[x,dx,θ,dtheta]'状态= 0 (4,1)结束属性(访问=受保护)%初始化内部标志以指示事件终止IsDone=false结束

所需的功能

强化学习环境要求定义以下功能。这个获取观测信息getActionInfosim卡,及验证环境函数已经在基抽象类中定义。要创建环境,必须定义构造函数,重置,及功能。

作用 描述
获取观测信息 返回有关环境观测的信息
getActionInfo 返回关于环境操作的信息
sim卡 使用代理模拟环境
验证环境 通过调用重置函数,并使用
重置 初始化环境状态并清除任何可视化
应用一个动作,模拟一个步骤的环境,并输出观察结果和奖励;另外,设置一个标志,指示插曲是否完成
构造函数 与创建类实例的类同名的函数

示例构造函数函数

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

  • 定义行动和观察规范。有关创建这些规范的更多信息,请参阅rlNumericSpecrlFiniteSetSpec

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

功能this=MyEnvironment()%初始化观察设置ObservationInfo=rlNumericSpec([4 1]);ObservationInfo.Name=“CartPole州”; 观测信息描述=x dx d '%初始化操作设置ActionInfo=rlFiniteSetSpec([-1]);ActionInfo.Name=“卡特波尔行动”%下一行实现了RL环境的内置功能这=this@rl.env.MATLABEnvironment(观测信息、行动信息);%初始化属性值并预计算必要的值updateActionInfo(本文件);结束

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

样品重置作用

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

%将环境重置为初始状态并返回初始观察功能初始观察=重置(此)%θ(+-.05拉德)T0 = 2 * 0.05 * rand - 0.05;%塔多特Td0=0;%XX0=0;% XdotXd0=0;初始观测=[X0;Xd0;T0;Td0];状态=初始观察;%(可选)使用notifyEnvUpdated来表示%环境更新(例如,更新可视化)(此)更新的通知;结束

样品作用

样品车杆功能:

  • 处理输入操作。

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

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

  • 计算并返回奖励信号。

  • 检查事件是否完成并返回结束视情况发出信号。

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

功能[观察、奖励、IsDone、LoggedSignals]=步骤(此操作)LoggedSignals=[];%采取行动力= getForce(这个动作);%解压状态向量XDot=该状态(2);θ=该状态(3);ThetaDot=该状态(4);%缓存以避免重新计算CosTheta = cos(θ);SinTheta =罪(θ);SystemMass =。卡特马斯+ this.PoleMass; temp = (Force + this.PoleMass*this.HalfPoleLength*ThetaDot^2*SinTheta).../系统质量;应用运动方程ThetaDotDot=(该.Gravity*SinTheta-成本theta*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);IsDone=abs(X)>this.DisplacementThreshold | | abs(θ)>this.AngleThreshold;this.IsDone=IsDone;%获得奖励奖励= getReward(这个);%(可选)使用notifyEnvUpdated来表示%环境已更新(例如,更新可视化)(此)更新的通知;结束

可选功能

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

功能奖励= getReward(这)如果~。结束Reward = this.RewardForNotFalling;其他的奖励= this.PenaltyForFalling;结束结束

环境可视化

通过实现情节功能。在情节功能:

  • 创建自己实现的可视化工具类的图形或实例。对于本例,将创建地物并在环境对象中存储地物的句柄。

  • 打电话给envUpdatedCallback函数。

功能情节(这)%开始可视化这个。数字=数字(“可见的”“上”“可操作性”“关”); ha=gca(本图);ha.XLimMode=“手册”; 羟基磷灰石=“手册”;哈哈。XLim = [-3 3];哈哈。YLim = [-1 2];(哈,“上”);%更新可视化envUpdatedCallback(这)结束

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

属性(访问=受保护)%初始化内部标志以指示事件终止IsDone=false%数字句柄图形结束

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

功能envUpdatedCallback(这)如果~isempty(this.Figure)&&isvalid(this.Figure)%将可视化图形设置为当前图形甘氨胆酸公顷= (this.Figure);%提取购物车位置和杆角度x=该状态(1);θ=该状态(3);cartplot=findobj(ha,“标签”“cartplot”);poleplot = findobj(哈,“标签”“poleplot”);如果isempty (cartplot) | | ~ isvalid (cartplot)...||isempty(poleplot)| | ~ isvalid(poleplot)%初始化购物车绘图carpoly = polyhape ([-0.25 -0.25 0.25],[-0.125 0.125 0.125 -0.125]);carpoly = translate(carpoly,[x 0]);cartplot =情节(哈,cartpoly,“FaceColor”[0.8500 0.3250 0.0980]);cartplot。标签=“cartplot”%初始化极点图L = this.HalfPoleLength * 2;poly = polyhape ([-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]); poleplot.标签=“poleplot”其他的cartpoly = cartplot.Shape;polepoly = poleplot.Shape;结束计算新的推车和杆位[cartposx,~]=质心(cartpoly)[poleposx,poleposy]=质心(polepoly);dx=x-cartposx;dtheta=θ-atan2(cartposx-poleposx,poleposy-0.25/2);cartpoly=translate(cartpoly[dx,0]);polepoly=translate(polepoly[dx,0]);polepoly=旋转(polepoly,rad2deg(dtheta),[x,0.25/2]);%在地图上更新推车和杆位cartplot。形状= cartpoly;poleplot。形状= polepoly;%刷新图形窗口中的渲染drawnow();结束结束

环境称之为envUpdatedCallback函数,并因此在环境更新时更新可视化。

创建自定义环境

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

环境=我的环境;

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

创建环境后,最佳做法是验证环境动力学。为此,请使用验证环境函数,如果环境实现有任何问题,该函数将向命令窗口打印错误。

验证环境(env)

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

另请参阅

|

相关话题