主要内容

使用自定义函数创建MATLAB环境

这个例子展示了如何通过在MATLAB®中提供定制的动态函数来创建一个车杆环境。

使用rlFunctionEnv函数,可以从观察规范、动作规范和用户定义创建一个MATLAB强化学习环境一步重置功能。然后您可以在这个环境中训练一个强化学习代理。必要的一步重置本例中已经定义了一些函数。

使用自定义函数创建环境对于动态不太复杂的环境、没有特殊可视化需求的环境或具有第三方库接口的环境非常有用。对于更复杂的环境,可以使用模板类创建环境对象。有关更多信息,请参见创建自定义MATLAB环境从模板

有关创建强化学习环境的更多信息,请参见创建MATLAB强化学习环境创建Simul金宝appink强化学习环境

Cart-Pole MATLAB环境

车杆环境是一个连接在车的非驱动关节上的杆,沿着无摩擦的轨道移动。训练目标是使钟摆直立而不摔倒。

对于这个环境:

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

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

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

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

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

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

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

观察和行动规范

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

ObservationInfo = rlNumericSpec([4 1]);ObservationInfo。Name =“CartPole州”;ObservationInfo。描述=x dx d '

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

ActionInfo = rlFiniteSetSpec([-10 10]);ActionInfo。Name =“CartPole行动”

有关指定环境操作和观察的更多信息,请参见rlNumericSpecrlFiniteSetSpec

使用函数名创建环境

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

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

[InitialObservation, LoggedSignals] = myResetFunction ()

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

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

类型myResetFunction.m
重置函数将自定义的车杆环境放入随机的%初始状态。% Theta (randomize) T0 = 2 * 0.05 * rand() - 0.05;% ttadot Td0 = 0;% x x = 0;% Xdot Xd0 = 0;返回初始环境状态变量作为记录的信号。LoggedSignal。状态= (X0, Xd0; T0; Td0);InitialObservation = LoggedSignal.State;结束

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

(观察、奖励、结束,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自动调用validateEnvironment在创建环境之后。

使用函数句柄创建环境

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

[观察,奖励,IsDone,LoggedSignals] = myStepFunction(Action,LoggedSignals,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。t = 0.02;失败情节的角度envConstants。的taThresholdRadians = 12 * pi/180;距离在哪里失败的插曲envConstants。XThreshold = 2.4;%奖励每一步车杆平衡envConstants。RewardForNotFalling = 1;当车杆无法平衡时罚分envConstants。PenaltyForFalling = 5;

为自定义创建一个匿名函数句柄一步函数,通过envConstants作为额外的输入参数。因为envConstants在那个时间有空吗StepHandle创建时,函数句柄包含这些值。即使清除变量,这些值也会在函数句柄中保存。

StepHandle = @(Action,LoggedSignals) myStepFunction2(Action,LoggedSignals,envConstants);

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

ResetHandle = @() myResetFunction;

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

env2 = rlFunctionEnv (ObservationInfo ActionInfo、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)步;NextObs2
NextObs2 =4×10 0.1947 0.0315 -0.2826

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

另请参阅

相关的话题