这个例子展示了如何训练一个深度q学习网络(DQN)代理摆动和平衡一个在Simulink®中建模的摆。万博1manbetx
有关DQN代理商的更多信息,请参阅深Q-Network代理.有关在Matlab®中列出DQN代理的示例,请参阅培训DQN员工平衡车杆系统.
本例的强化学习环境是一个简单的无摩擦摆,最初挂在一个向下的位置。训练目标是用最小的控制力使钟摆直立而不倾倒。
打开模型。
mdl ='rlsimplepeneylummodel';Open_System(MDL)
对于这个模型:
向上平衡的摆锤位置是0弧度,向下悬挂位置是PI.
弧度。
agent对环境的力矩动作信号为-2 ~ 2n·m。
从环境中观察到的是摆角的正弦值,摆角的余弦值,以及摆角的导数值。
奖励 ,在每个时间步骤中提供,为
在这里:
为从垂直位置位移的角度。
是位移角度的衍生物。
是上一个时间步骤的控制工作。
有关此模型的更多信息,请参阅加载预定义的Simulink环境万博1manbetx.
为摆锤创建预定义的环境界面。
env = rlPredefinedEnv (“SimplePendulumModel-Discrete”)
Env = 万博1manbetxSimulinkenvwithAgent with属性:型号:rlsimplepentulummodel agentblock:rlsimpleveptulummodel / rl代理resetfcn:[] UseFastrest:ON
该界面有一个离散的动作空间,在该空间中,agent可以向摆施加三个可能的扭矩值之一:-2、0或2 N·m。
若要定义摆的初始状态为向下悬挂,请使用匿名函数句柄指定环境复位函数。这个重置函数设置模型工作区变量theta0
来PI.
.
env。ResetFcn = @(在)setVariable (,'theta0',pi,'工作区',mdl);
从环境中获取观察和行动规范信息
ObsInfo = getobservationInfo(ENV)
obsInfo = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf Name: "observations" Description: [0x0 string] Dimension: [3 1] DataType: "double"
actInfo = getActionInfo (env)
ACTINFO = RLFINITESETSPEC具有属性:元素:[3x1双]名称:“转矩”描述:[0x0字符串]尺寸:[1 1]数据类型:“双”
指定模拟时间特遣部队
和代理采样时间Ts
在几秒钟内。
t = 0.05;Tf = 20;
修复随机发生器种子以进行再现性。
rng (0)
一个DQN代理使用价值功能批评家来近似给定的观察和行动的长期奖励。
由于DQN具有离散动作空间,它可以依赖于多输出批评估计仪,这通常是比依赖于可比的单输出近似器更高效的选项。多输出近似器仅具有作为输入和具有多个元素的输入和输出向量,作为可能的离散动作的数量。每个输出元素代表在拍摄相应的离散动作时从给出的观察结果之后的预期累积长期奖励。
要创建评论家,首先创建一个具有三个元素的输入向量的深神经网络(对于摆锤角度的正弦,余弦和导数),以及一个具有三个元素(-2,0或2nm动作)的一个输出矢量.有关创建深度神经网络值函数表示的更多信息,请参阅创建策略和价值功能表示.
dnn = [featureInputLayer(3,'正常化',“没有”,“名字”,'状态')全康校长(24,“名字”,'批评福尔福克') reluLayer (“名字”,'rictrelu1')全连接列(48,“名字”,'批评福尔2') reluLayer (“名字”,'批判杂志') fullyConnectedLayer (3“名字”,“输出”)];
查看critical网络配置。
图绘制(layerGraph(款)
为使用的批评家表示指定选项rlRepresentationOptions
.
批评= rlrepresentationOptions(“LearnRate”, 0.001,'gradientthreshold',1);
使用指定的深度神经网络和选项创建批评家表示。您还必须为评论家指定观察和行动信息。有关更多信息,请参见rlQValueRepresentation
.
评论家= rlqvalueerepresentation(DNN,Obsinfo,Actinfo,“观察”,{'状态'},批评);
要创建DQN代理,首先使用rldqnagentoptions.
.
代理选项= rldqnagentoptions(...'采样时间',ts,...'targetsmoothfactor'1 e - 3,...“ExperienceBufferLength”,3000,...“UseDoubleDQN”,错误的,...'贴花因子',0.9,...“MiniBatchSize”, 64);
然后,使用指定的批评批准表示和代理选项创建DQN代理。有关更多信息,请参见rldqnagent.
.
代理= rlDQNAgent(评论家,agentOptions);
要培训代理,首先指定培训选项。对于此示例,请使用以下选项。
每次运行每个培训,最多可持续每一次剧集500
时间的步骤。
在“插曲管理器”对话框中显示培训进度(设置情节
选项),并禁用命令行显示(设置verb
选择假
)。
当代理在连续五次集中收到大于-1100的平均累积奖励时停止训练。此时,代理商可以使用最小的控制工作快速平衡摆锤的摆锤。
为累积奖励大于-1100的每一集保存一份代理副本。
有关更多信息,请参见rltringOptions.
.
trysertingoptions = rltringOptions(...'maxepisodes', 1000,...'maxstepperepisode', 500,...“ScoreAveragingWindowLength”,5,...'verbose',错误的,...“阴谋”,“训练进步”,...“StopTrainingCriteria”,'AverageReward',...'stoptriningvalue', -1100,...“SaveAgentCriteria”,“EpisodeReward”,...“SaveAgentValue”,-1100);
使用该代理商培训火车
功能。培训此代理是一个计算密集型进程,需要几分钟才能完成。要在运行此示例的同时节省时间,请通过设置加载预制代理doTraining
来假
.训练代理人,套装doTraining
来真的
.
dotraining = false;如果doTraining培训代理商。trainingStats =火车(代理,env, trainingOptions);别的%加载示例的预训练代理。负载(“万博1manbetxSimulinkPendulumDQNMulti.mat”,“代理”);结束
为了验证训练过的代理的性能,在摆环境中模拟它。有关代理模拟的更多信息,请参见RlsimulationOptions.
和sim卡
.
simoptions = rlsimulation选项('maxsteps', 500);经验= sim (env,代理,simOptions);