本示例说明如何训练深度确定性策略梯度(DDPG)智能体,并为飞行机器人生成轨迹。
此示例的强化学习环境是飞行机器人,其初始条件围绕半径为15 m的圆环随机化。 机器人的方向也是随机的。 机器人具有安装在主体侧面的两个推进器,用于推动和操纵机器人。 训练的目标是将机器人从初始状态驱动到面向东方的原点。
打开模型
mdl = 'rlFlyingRobotEnv';
open_system(mdl)
theta0 = 0;
x0 = -15;
y0 = 0;
定义采样时间Ts和仿真持续时间Tf。
Ts = 0.4;
Tf = 30;
对于此模型:
目标方向为 θ \theta θ度(机器人朝东)。
每个执行器的推力范围为-1至1 N 。
从环境中观察到的是机器人的位置,方向(方向的正弦和余弦),速度和角速度。
式中:
5. x t x_t xt为机器人沿x轴的位置。
6. y t y_t yt是机器人沿y轴的位置。
7. θ t \theta_t θt是机器人的方向。
8. L t − 1 L_{t-1} Lt−1是左侧推进器的控制力。
9. R t − 1 R_{t-1} Rt−1是右侧推进器的控制力。
10. r 1 r_1 r1是机器人接近目标时的奖励。
11. r 2 r_2 r2是机器人在x或y方向行驶超过20米的罚分。当 r 2 < 0 r_2 <0 r2<0时,仿真终止。
12. r 3 r_3 r3是QR惩罚,惩罚距离目标和控制作用的距离。
要为FlyingRobotEnv模型训练智能体,请使用createIntegratedEnv函数自动生成带有准备训练的RL智能体块的集成模型。
integratedMdl = 'IntegratedFlyingRobot';
[~,agentBlk,observationInfo,actionInfo] = createIntegratedEnv(mdl,integratedMdl);
在创建环境对象之前,请指定观察和动作规范的名称,并将推力动作限制在-1和1之间。
numObs = prod(observationInfo.Dimension);
observationInfo.Name = 'observations';
这个环境的动作信号是
numAct = prod(actionInfo.Dimension);
actionInfo.LowerLimit = -ones(numAct,1);
actionInfo.UpperLimit = ones(numAct,1);
actionInfo.Name = 'thrusts';
使用集成模型为飞行机器人创建环境界面。
env = rlSimulinkEnv(integratedMdl,agentBlk,observationInfo,actionInfo);
创建一个自定义重置函数,该函数将沿半径15 m的环和初始方向随机化机器人的初始位置。 有关重置功能的详细信息,请参见flyingRobotResetFcn。
env.ResetFcn = @(in) flyingRobotResetFcn(in);
固定随机发生器种子以提高可重复性。
rng(0)
DDPG智能体通过使用批评者价值函数表示来近似给出给定观察和操作的长期奖励。 要创建评论者,首先要创建一个具有两个输入(观察和动作)和一个输出的深度神经网络。 有关创建神经网络值函数表示的更多信息,请参见创建策略和值函数。
% Specify the number of outputs for the hidden layers.
hiddenLayerSize = 100;
observationPath = [
featureInputLayer(numObs,'Normalization','none','Name','observation')
fullyConnectedLayer(hiddenLayerSize,'Name','fc1')
reluLayer('Name','relu1')
fullyConnectedLayer(hiddenLayerSize,'Name','fc2')
additionLayer(2,'Name','add')
reluLayer('Name','relu2')
fullyConnectedLayer(hiddenLayerSize,'Name','fc3')
reluLayer('Name','relu3')
fullyConnectedLayer(1,'Name','fc4')];
actionPath = [
featureInputLayer(numAct,'Normalization','none','Name','action')
fullyConnectedLayer(hiddenLayerSize,'Name','fc5')];
% Create the layer graph.
criticNetwork = layerGraph(observationPath);
criticNetwork = addLayers(criticNetwork,actionPath);
% Connect actionPath to observationPath.
criticNetwork = connectLayers(criticNetwork,'fc5','add/in2');
使用rlRepresentationOptions指定评论者的选项。
criticOptions = rlRepresentationOptions('LearnRate',1e-03,'GradientThreshold',1);
使用指定的神经网络和选项创建评论者表示。 您还必须为评论者指定操作和观察规范。 有关更多信息,请参见rlQValueRepresentation。
critic = rlQValueRepresentation(criticNetwork,observationInfo,actionInfo,...
'Observation',{'observation'},'Action',{'action'},criticOptions);
DDPG智能体通过使用行动者来决定采取哪种行动。 要创建角色,首先要创建一个具有一个输入(观察)和一个输出(动作)的深度神经网络。
与评论者类似,构造行动者。 有关更多信息,请参见rlDeterministicActorRepresentation。
actorNetwork = [
featureInputLayer(numObs,'Normalization','none','Name','observation')
fullyConnectedLayer(hiddenLayerSize,'Name','fc1')
reluLayer('Name','relu1')
fullyConnectedLayer(hiddenLayerSize,'Name','fc2')
reluLayer('Name','relu2')
fullyConnectedLayer(hiddenLayerSize,'Name','fc3')
reluLayer('Name','relu3')
fullyConnectedLayer(numAct,'Name','fc4')
tanhLayer('Name','tanh1')];
actorOptions = rlRepresentationOptions('LearnRate',1e-04,'GradientThreshold',1);
actor = rlDeterministicActorRepresentation(actorNetwork,observationInfo,actionInfo,...
'Observation',{'observation'},'Action',{'tanh1'},actorOptions);
要创建DDPG代理,请首先使用rlDDPGAgentOptions指定DDPG智能体选项。
agentOptions = rlDDPGAgentOptions(...
'SampleTime',Ts,...
'TargetSmoothFactor',1e-3,...
'ExperienceBufferLength',1e6 ,...
'DiscountFactor',0.99,...
'MiniBatchSize',256);
agentOptions.NoiseOptions.Variance = 1e-1;
agentOptions.NoiseOptions.VarianceDecayRate = 1e-6;
然后,使用指定的行动者表示,评论者表示和智能体选项创建智能体。 有关更多信息,请参见rlDDPGAgent。
agent = rlDDPGAgent(actor,critic,agentOptions);
要训练智能体,请首先指定训练选项。 对于此示例,使用以下选项:
每次训练最多进行20000轮,每轮持续最多ceil(Tf / Ts)时间步长。
在“Episode Manager”对话框中显示训练进度(设置“Episode ”选项)并禁用命令行显示(将“Verbose ”选项设置为false)。
当智能体在10个连续情节中获得的平均累积奖励大于415时,请停止训练。 此时,智能体可以将飞行中的机器人驱动到目标位置。
为累积奖励大于415的每个情节保存智能体的副本。
maxepisodes = 20000;
maxsteps = ceil(Tf/Ts);
trainingOptions = rlTrainingOptions(...
'MaxEpisodes',maxepisodes,...
'MaxStepsPerEpisode',maxsteps,...
'StopOnError',"on",...
'Verbose',false,...
'Plots',"training-progress",...
'StopTrainingCriteria',"AverageReward",...
'StopTrainingValue',415,...
'ScoreAveragingWindowLength',10,...
'SaveAgentCriteria',"EpisodeReward",...
'SaveAgentValue',415);
使用训练功能训练智能体。 训练是一个计算密集型过程,需要几个小时才能完成。 为了节省运行本示例的时间,请通过将doTraining设置为false来加载预训练的智能体。 要自己训练智能体,请将doTraining设置为true。
doTraining = false;
if doTraining
% Train the agent.
trainingStats = train(agent,env,trainingOptions);
else
% Load the pretrained agent for the example.
load('FlyingRobotDDPG.mat','agent')
end
要验证训练后的智能体的性能,请在环境中模拟智能体。 有关智能体模拟的更多信息,请参见rlSimulationOptions和sim。
simOptions = rlSimulationOptions('MaxSteps',maxsteps);
experience = sim(env,agent,simOptions);