创建MATLAB环境中使用自定义函数
这个例子展示了如何创建一个cart-pole MATLAB®环境提供定制的动态函数。
使用rlFunctionEnv
功能,您可以创建一个MATLAB强化学习环境的观测规范,动作规范,和用户定义的一步
和重置
功能。你可以训练强化学习代理在这个环境中。必要的一步
和重置
已经为这个例子中定义的函数。
创建一个环境使用自定义函数是非常有用的对于环境减少复杂的动力学,环境没有特殊的可视化要求,或与第三方库的接口环境。对于更复杂的环境中,您可以创建一个环境对象使用一个模板类。有关更多信息,请参见从模板创建定制的MATLAB环境。
在创造强化学习环境的更多信息,见创建MATLAB强化学习环境和创建模型强化学金宝app习环境。
Cart-Pole MATLAB环境
cart-pole环境是极连接到一个unactuated联合手推车,沿着一个无摩擦的轨道。培训的目标是使钟摆直立,没有跌倒。
对于这个环境:
向上的平衡摆位置
0
弧度,向下悬挂位置π
弧度。钟摆开始与一个初始角直立在-0.05和0.05之间。
力行动信号从代理环境从-10年到10 N。
来自环境的观察车的位置,车速度,摆角和摆角的导数。
这一事件终止如果从垂直杆是超过12度,或者如果购物车从原始位置移动超过2.4。
+ 1的奖励提供了每一个时间步,北极保持正直。-10年应用摆的一个点球。
关于这个模型的更多信息,请参阅负载预定义的控制系统环境。
观察和操作规范
来自环境的观察车的位置,车速度,摆角和摆角的导数。
ObservationInfo = rlNumericSpec (1 [4]);ObservationInfo。Name =“CartPole州”;ObservationInfo。描述=“x, dx,θ,dtheta”;
环境一个离散的行动空间,两种可能的力值的代理可以应用一个购物车:-10年
或10
N。
ActionInfo = rlFiniteSetSpec (-10 [10]);ActionInfo。Name =“CartPole行动”;
在指定环境操作和观察的更多信息,明白了rlNumericSpec
和rlFiniteSetSpec
。
使用函数名创建环境
先定义一个自定义环境,指定自定义一步
和重置
功能。这些功能必须在你当前的工作目录或MATLAB路径。
自定义重置
环境的功能设置默认状态。这个函数必须有以下签名。
[InitialObservation, LoggedSignals] = myResetFunction ()
将信息从一个步骤,如环境状态,使用LoggedSignals
。对于这个示例,LoggedSignals
包含美国cart-pole环境:购物车的位置和速度,摆角和摆角的导数。的重置
函数将车角设置为一个随机值重置每次环境。
对于这个示例,使用自定义重置函数中定义myResetFunction.m
。
类型myResetFunction.m
函数[InitialObservation LoggedSignal] = myResetFunction() %重置功能定制cart-pole环境到一个随机%初始状态。%θ(随机)T0 = 2 * 0.05 * rand ()——0.05;% Thetadot Td0 = 0;% X X0 = 0;% Xdot Xd0 = 0;%返回初始环境状态变量记录信号。LoggedSignal。状态= (X0, Xd0; T0; Td0);InitialObservation = LoggedSignal.State;结束
自定义一步
函数指定环境进展到下一个状态是如何根据给定的行动。这个函数必须有以下签名。
(观察、奖励、结束,LoggedSignals) = myStepFunction(行动,LoggedSignals)
新状态,环境动态方程适用于存储在当前状态LoggedSignals
,这类似于一个微分方程的初始条件。新状态存储在LoggedSignals
和作为一个输出返回。
对于这个示例,使用自定义步骤中定义的函数myStepFunction.m
。实施简单,这个函数重新定义物理常数,如车质量,每一次一步
是执行。
类型myStepFunction.m
函数[NextObs、奖励、结束,LoggedSignals] = myStepFunction(行动,LoggedSignals) %自定义函数的阶跃函数来构造cart-pole环境%的名字。% %这个函数给定操作适用于环境和评估%的系统动力学仿真的步骤。%定义环境常数。%重力加速度在m / s ^ 2重力= 9.8;%的购物车CartMass = 1.0;%的质量极PoleMass = 0.1;%一半的长度杆HalfPoleLength = 0.5;%马克斯力输入可以应用MaxForce = 10;%样本时间t = 0.02;%的极角失败这一事件AngleThreshold = 12 *π/ 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
和最长
步和其他功能,使用以下代码。
[InitialObservation, LoggedSignals] = myResetFunction (__arg1、最长)[观察、奖励、结束,LoggedSignals] = myStepFunction(行动,LoggedSignals, __arg1、最长)
使用这些函数rlFunctionEnv
,你必须使用匿名函数处理。
ResetHandle = @ () myResetFunction (__arg1、最长);LoggedSignals StepHandle = @(行动)myStepFunction(行动,LoggedSignals, __arg1、最长);
有关更多信息,请参见匿名函数。
使用额外的输入参数可以创建一个更高效的环境中实现。例如,myStepFunction2.m
包含一个定义一步
函数接受环境常数作为输入参数(envConstants
)。通过这样做,这个函数避免了重新定义环境常数在每一步。
类型myStepFunction2.m
函数[NextObs、奖励、结束,LoggedSignals] = myStepFunction2(行动,LoggedSignals EnvConstants) %定制的阶跃函数构造函数%处理cart-pole环境情况。% %这个函数给定操作适用于环境和评估%的系统动力学仿真的步骤。%检查给定的行动是有效的。如果~ ismember(行动,[-EnvConstants。MaxForce EnvConstants.MaxForce])错误(“行动必须% g左右,% g。,…-EnvConstants.MaxForce EnvConstants.MaxForce);端面压力=行动;%解压缩的状态向量记录信号。状态= 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;%奖励每个时间步cart-pole是平衡的envConstants。RewardForNotFalling = 1;%点球cart-pole不能平衡envConstants。PenaltyForFalling = 5;
创建一个匿名函数处理自定义一步
函数,通过envConstants
作为一个额外的输入参数。因为envConstants
在的时间是可用的吗StepHandle
创建,该函数处理包含这些值。的值保存在函数处理即使你明确的变量。
LoggedSignals StepHandle = @(行动)myStepFunction2(行动,LoggedSignals, envConstants);
使用相同的重置
函数,指定它作为处理函数,而不是通过使用它的名称。
myResetFunction ResetHandle = @ ();
使用自定义函数处理创建环境。
env2 = rlFunctionEnv (ObservationInfo ActionInfo、StepHandle ResetHandle);
验证自定义函数
在你训练一个代理在您的环境中,最佳实践是验证您的自定义函数的行为。这样做,您可以初始化您的环境中使用重置
使用功能和运行一个模拟步骤一步
函数。再现性,验证之前设置随机发生器种子。
使用函数名创建验证环境。
rng (0);InitialObs =重置(env)
InitialObs =4×10.0315 0 0 0
[NextObs、奖励、结束,LoggedSignals] =步骤(env, 10);NextObs
NextObs =4×10 0.1947 0.0315 -0.2826
验证环境使用函数创建句柄。
rng (0);InitialObs2 =重置(env2)
InitialObs2 =4×10.0315 0 0 0
[NextObs2, Reward2 IsDone2 LoggedSignals2] = (env2, 10)步;NextObs2
NextObs2 =4×10 0.1947 0.0315 -0.2826
这两种环境中成功地初始化和模拟,产生相同的状态值NextObs
。