您可以通过创建和修改模板环境类来定义自定义的强化学习环境。你可以使用自定义模板环境:
实现更复杂的环境动力学。
将自定义可视化添加到您的环境中。
创建一个接口,用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结束
强化学习环境要求定义以下功能。这个获取观测信息
,getActionInfo
,sim卡
,及验证环境
函数已经在基抽象类中定义。要创建环境,必须定义构造函数,重置
,及步
功能。
作用 | 描述 |
---|---|
获取观测信息 |
返回有关环境观测的信息 |
getActionInfo |
返回关于环境操作的信息 |
sim卡 |
使用代理模拟环境 |
验证环境 |
通过调用重置 函数,并使用步 |
重置 |
初始化环境状态并清除任何可视化 |
步 |
应用一个动作,模拟一个步骤的环境,并输出观察结果和奖励;另外,设置一个标志,指示插曲是否完成 |
构造函数 | 与创建类实例的类同名的函数 |
示例cart pole构造函数通过以下方式创建环境:
定义行动和观察规范。有关创建这些规范的更多信息,请参阅rlNumericSpec
和rlFiniteSetSpec
.
调用基抽象类的构造函数。
功能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)
验证环境对象后,可以使用它来训练强化学习代理。有关培训代理的更多信息,请参阅训练强化学习代理.