主要内容

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

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

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

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

有关创建强化学习环境的更多信息,请参见创建MATLAB强化学习环境创建Simul万博1manbetxink强化学习环境

Cart-Pole MATLAB环境

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

对于这个环境:

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

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

  • 来自代理到环境的力动作信号为-10至10 n。

  • 来自环境的观察是推车位置,推车速度,摆角和摆角衍生物。

  • 剧集终止如果杆从垂直杆大于12度,或者如果电车从原始位置移动超过2.4米。

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

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

观察和行动规范

来自环境的观察是推车位置,推车速度,摆角和摆角衍生物。

ObservationInfo = rlNumericSpec([4 1]);ObservationInfo。Name =“CartPole州”;观察invfo.description =x dx d '

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

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,arg2);stephandle = @(动作,loggedSignals)MyStepFunction(操作,记录,arg1,arg2);

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

使用额外的输入参数可以创建更有效的环境实现。例如,myStepFunction2.m包含一个定义一步将环境常量作为输入参数的函数(舒适)。通过这样做,此功能避免重新定义每个步骤的环境常量。

类型myStepFunction2.m
函数[extobs,right,Isdone,loggedSignals] = MyStepFunction2(动作,loggediaNnals,envonconstants)%自定义步骤功能构建函数%句柄情况的Cart-Pole环境。该函数将给定的动作应用到环境中,并对一个仿真步骤的系统动力学进行评估。检查给定的操作是否有效。如果〜ismember(动作,[ -  envonstantant.maxforce envonconstants.maxForce])错误('操作必须是左边的%g和右边的%g.',...  -  envconstants.maxforce,envconstants.maxforce);end Force = Action;%从记录的信号中解包状态向量。状态= LoggedSignals.State;XDot =状态(2);(3)θ=状态;(4) ThetaDot =状态; % 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 ^ 2的重力导致的%加速度envConstants。重力= 9.8;推车的质量envConstants。MassCart = 1.0;磁极的质量envConstants。MassPole = 0.1;是竿子长度的一半envonstants.length = 0.5;输入所能施加的最大力envConstants。MaxForce = 10;% 采样时间envConstants。t = 0.02;失败情节的角度envonstants.thetathresholdradians = 12 * pi / 180;距离在哪里失败的插曲envConstants。XThreshold = 2.4;%奖励每一步车杆平衡envConstants。RewardForNotFalling = 1;当卡车杆未能平衡时%罚款envConstants。PenaltyForFalling = 5;

为自定义创建一个匿名函数句柄一步函数,通过舒适作为额外的输入参数。因为舒适在那个时间有空吗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.0315 0
[extobs,奖励,isdone,loggediaikals] =步骤(env,10);德国人
NextObs =4×10 0.1947 0.0315 -0.2826

验证使用功能句柄创建的环境。

rng (0);InitialObs2 =重置(env2)
initialobs2 =4×10 0 0.0315 0
[nextobs2,right2,isdone2,loggedsignals2] =步骤(env2,10);德国人
NextObs =4×10 0.1947 0.0315 -0.2826

这两个环境都成功初始化和模拟,产生相同的状态值德国人

另请参阅

相关话题