这个例子展示了如何通过在MATLAB®中提供定制的动态函数来创建一个车杆环境。
使用rlfunctionenv.
函数,可以从观察规范、动作规范和用户定义创建一个MATLAB强化学习环境一步
和重置
功能。然后您可以在这个环境中训练一个强化学习代理。必要的一步
和重置
本例中已经定义了一些函数。
使用自定义函数创建环境对于动态不太复杂的环境、没有特殊可视化需求的环境或具有第三方库接口的环境非常有用。对于更复杂的环境,可以使用模板类创建环境对象。有关更多信息,请参见从模板创建自定义MATLAB环境.
有关创建强化学习环境的更多信息,请参见创建MATLAB强化学习环境和创建Simul万博1manbetxink强化学习环境.
车杆环境是一个连接在车的非驱动关节上的杆,沿着无摩擦的轨道移动。训练目标是使钟摆直立而不摔倒。
对于这个环境:
向上平衡的摆位为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
或者10
N.
ActionInfo = rlFiniteSetSpec([-10 10]);ActionInfo。Name ='cartpole行动';
有关指定环境操作和观察的更多信息,请参见rlNumericSpec
和rlFiniteSetSpec
.
要定义自定义环境,首先指定自定义一步
和重置
功能。这些函数必须在您当前的工作文件夹或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
这两个环境都成功初始化和模拟,产生相同的状态值德国人
.