主要内容

使用自定义功能创建MATLAB环境

此示例显示如何通过在MATLAB®中提供自定义动态功能来创建购物车环境。

使用rlFunctionEnv功能,您可以从观察规范,动作规范和用户定义的MATLAB强化学习环境创建MATLAB强化学习环境重置功能。然后,您可以在这种环境中培训钢筋学习代理。必要重置已经为此示例定义了函数。

使用自定义功能创建环境对于具有较差的动态的环境非常有用,没有特殊可视化要求的环境,或具有第三方库的接口的环境。对于更复杂的环境,您可以使用模板类创建环境对象。有关更多信息,请参阅创建自定义MATLAB环境从模板

有关创建强化学习环境的更多信息,请参阅为强化学习创建MATLAB环境创建强化学习的金宝appSimulink环境

车杆Matlab环境

推车杆环境是连接到推车上的unisuated接头的杆,其沿着无摩擦轨道移动。培训目标是使摆锤直立直立而不会摔倒。

对于这个环境:

  • 向上平衡的摆锤位置是0弧度和向下悬挂的位置是π弧度。

  • 钟摆开始直立,初始角度在-0.5和0.05之间。

  • agent对环境的力作用信号为-10到10 N。

  • 从环境中观察到的是车的位置、车的速度、摆角和摆角的导数。

  • 如果杆距垂直方向超过12度,或者车距初始位置超过2.4米,则该集终止。

  • 当杆保持直立时,奖励为+1。当钟摆下降时施加-10的惩罚。

有关此模型的更多信息,请参阅加载预定义的控制系统环境

观察和行动规范

从环境中观察到的是车的位置、车的速度、摆角和摆角的导数。

观察invo = rlnumericspec([4 1]);观察info.name ='cartpole状态';ObservationInfo。描述=x dx d '

该环境有一个离散的动作空间,其中agent可以对购物车施加两个可能的力值之一:-1010N。

ActionInfo = rlfinitesetspec([ -  10 10]);ActionInfo.name =.“CartPole行动”

有关指定环境操作和观察的更多信息,请参阅rlnumericspec.rlfinitesetspec.

使用函数名创建环境

要定义自定义环境,首先指定自定义重置功能。这些函数必须在您当前的工作文件夹或MATLAB路径中。

自定义重置函数设置环境的默认状态。此函数必须具有以下签名。

[InitialObservation, LoggedSignals] = myResetFunction ()

要将信息从一个步骤传递到下一个步骤,例如环境状态,请使用LoggedSignals.对于这个示例,LoggedSignals包含车杆环境的状态:车的位置和速度,摆角,以及摆角的导数。的重置函数在每次重置环境时将购物车的角度设置为一个随机值。

对于本例,使用中定义的自定义reset函数myResetFunction.m

类型myResetFunction.m
函数[InitialObServation,loggedSignal] = MyResetFunction()%重置功能将自定义购物车杆环境放入随机%初始状态。%THETA(随机化)T0 = 2 * 0.05 * RAND() -  0.05;%thetadot td0 = 0;%x x0 = 0;%xdot xd0 = 0;%返回初始环境状态变量作为记录信号。loggedSignal.state = [x0; xd0; t0; td0];initialobservation = loggedsignal.state;结尾

自定义函数指定环境基于给定操作的方式对下一个状态的进步。此函数必须具有以下签名。

[观察,奖励,ISDONE,LoggedSignals] = MyStepFunction(动作,loggedSignals)

为了获得新状态,环境将动态方程应用于存储的当前状态LoggedSignals,这类似于给微分方程一个初始条件。新状态存储在LoggedSignals并作为输出返回。

对于本例,使用中定义的自定义step函数mystepfunction.m ...为了实现简单,该函数每次都重新定义物理常量,比如购物车质量是执行。

类型mystepfunction.m ..
%自定义步长函数,为函数% name case构建车杆环境。该函数将给定的动作应用到环境中,并对一个仿真步骤的系统动力学进行评估。定义环境常量。%重力加速度,m/s^2重力= 9.8;%购物车质量CartMass = 1.0;%极点质量极点质量= 0.1;%半极长度HalfPoleLength = 0.5;% MaxForce输入可以应用MaxForce = 10;%采样时间Ts = 0.02;= 12 * pi/180; % Cart distance at which to fail the episode DisplacementThreshold = 2.4; % Reward each time step the cart-pole is balanced RewardForNotFalling = 1; % Penalty when the cart-pole fails to balance PenaltyForFalling = -10; % Check if the given action is valid. if ~ismember(Action,[-MaxForce MaxForce]) error('Action must be %g for going left and %g for going right.',... -MaxForce,MaxForce); end Force = Action; % Unpack the state vector from the logged signals. State = LoggedSignals.State; XDot = State(2); Theta = State(3); ThetaDot = State(4); % Cache to avoid recomputation. CosTheta = cos(Theta); SinTheta = sin(Theta); SystemMass = CartMass + PoleMass; temp = (Force + PoleMass*HalfPoleLength*ThetaDot*ThetaDot*SinTheta)/SystemMass; % Apply motion equations. ThetaDotDot = (Gravity*SinTheta - CosTheta*temp) / ... (HalfPoleLength*(4.0/3.0 - PoleMass*CosTheta*CosTheta/SystemMass)); XDotDot = temp - PoleMass*HalfPoleLength*ThetaDotDot*CosTheta/SystemMass; % Perform Euler integration. LoggedSignals.State = State + Ts.*[XDot;XDotDot;ThetaDot;ThetaDotDot]; % Transform state to observation. NextObs = LoggedSignals.State; % Check terminal condition. X = NextObs(1); Theta = NextObs(3); IsDone = abs(X) > DisplacementThreshold || abs(Theta) > AngleThreshold; % Get reward. if ~IsDone Reward = RewardForNotFalling; else Reward = PenaltyForFalling; end end

使用已定义的观察规范、操作规范和函数名构造自定义环境。

env = rlFunctionEnv (ObservationInfo ActionInfo,'mystepfunction'“myResetFunction”);

要验证环境的操作,rlFunctionEnv自动调用验证环境创建环境后。

使用函数句柄创建环境

您还可以定义自定义函数,这些函数具有超出最小所需设置的额外输入参数。例如,传递附加参数arg1.arg2.对于step和rest函数,请使用以下代码。

[InitialObServation,loggedSignals] = MyResetFunction(arg1,arg2)[观察,奖励,Isdone,loggedSignals] = MyStepFunction(操作,记录,记录,arg1,arg2)

使用这些功能rlFunctionEnv,必须使用匿名功能句柄。

ResetHandle = @ () myResetFunction (__arg1、最长);StepHandle = @(Action,LoggedSignals) myStepFunction(Action,LoggedSignals,arg1,arg2);

有关更多信息,请参阅匿名函数

使用其他输入参数可以创建更高效​​的环境实现。例如,myStepFunction2.m包含一个定义将环境常量作为输入参数的函数(envConstants).通过这样做,该函数避免了在每一步重新定义环境常量。

类型myStepFunction2.m
%自定义步长函数,为函数%句柄情况构建车杆环境。该函数将给定的动作应用到环境中,并对一个仿真步骤的系统动力学进行评估。检查给定的操作是否有效。如果~ ismember(行动,[-EnvConstants。MaxForce EnvConstants.MaxForce])错误('Action must be %g for going left and %g for going right.',…-EnvConstants.MaxForce EnvConstants.MaxForce);end Force = Action;%从记录的信号中解包状态向量。状态= LoggedSignals.State;XDot =状态(2); Theta = State(3); ThetaDot = State(4); % Cache to avoid recomputation. CosTheta = cos(Theta); SinTheta = sin(Theta); SystemMass = EnvConstants.MassCart + EnvConstants.MassPole; temp = (Force + EnvConstants.MassPole*EnvConstants.Length*ThetaDot*ThetaDot*SinTheta)/SystemMass; % Apply motion equations. ThetaDotDot = (EnvConstants.Gravity*SinTheta - CosTheta*temp)... / (EnvConstants.Length*(4.0/3.0 - EnvConstants.MassPole*CosTheta*CosTheta/SystemMass)); XDotDot = temp - EnvConstants.MassPole*EnvConstants.Length*ThetaDotDot*CosTheta/SystemMass; % Perform Euler integration. LoggedSignals.State = State + EnvConstants.Ts.*[XDot;XDotDot;ThetaDot;ThetaDotDot]; % Transform state to observation. NextObs = LoggedSignals.State; % Check terminal condition. X = NextObs(1); Theta = NextObs(3); IsDone = abs(X) > EnvConstants.XThreshold || abs(Theta) > EnvConstants.ThetaThresholdRadians; % Get reward. if ~IsDone Reward = EnvConstants.RewardForNotFalling; else Reward = EnvConstants.PenaltyForFalling; end end

创建包含环境常量的结构。

%重力加速度,单位为m/s^2envConstants。重力= 9.8;%大量的购物车envconstants.masscart = 1.0;磁极的质量envconstants.masspole = 0.1;杆的长度的一半envConstants。长度= 0.5;输入所能施加的最大力envconstants.maxforce = 10;%样品时间envconstants.ts = 0.02;失败情节的角度envConstants。的taThresholdRadians = 12 * pi/180;%距离失败的剧集envconstants.xthreshold = 2.4;%奖励每一步车杆平衡envConstants。RewardForNotFalling = 1;当车杆无法平衡时罚分envConstants。PenaltyForFalling = 5;

为自定义创建匿名功能句柄函数,通过envConstants作为额外的输入参数。因为envConstants在那个时间有空吗StepHandle是创建的,函数句柄包括这些值。即使您清除变量,值仍然存在于函数处理中。

stephandle = @(动作,loggedSignals)mystepfunction2(动作,loggedSignals,envonconstants);

使用相同重置函数,将其指定为函数句柄而不是使用其名称。

ResetHandle = @myResetFunction;

使用自定义函数句柄创建环境。

Env2 = rlfunctionenv(观察info,afticeinfo,stephandle,resethandle);

验证自定义函数

在您的环境中培训代理之前,最佳实践是验证自定义函数的行为。方法初始化环境重置函数并使用函数。为了重现性,在验证前设置随机发生器种子。

验证使用函数名创建的环境。

rng (0);InitialObs =重置(env)
InitialObs =4×10 0 0
[NextObs、奖励、结束,LoggedSignals] =步骤(env, 10);NextObs
nextobs =4×10 0.1947 0.0315 -0.2826

验证使用函数句柄创建的环境。

rng (0);InitialObs2 =重置(env2)
InitialObs2 =4×10 0 0
[NextObs2, Reward2 IsDone2 LoggedSignals2] = (env2, 10)步;NextObs
nextobs =4×10 0.1947 0.0315 -0.2826

这两个环境都成功初始化和模拟,在NextObs

也可以看看

相关的话题