基于强化学习工具箱的自适应巡航控制系统
随着自动驾驶技术的快速发展,自适应巡航控制系统越来越多的人了解。今天介绍下用MATLAB中reinforcement learning工具箱实现对ACC系统的控制。
ACC系统简单介绍
自适应巡航控制系统(ACC)是一种旨在帮助车辆保持安全跟踪距离并保持在限速范围内的系统。其通过安装在车辆内的传感技术(如摄像头,激光器和雷达设备)来发挥作用,从而可以了解一辆汽车与另一辆汽车或道路上其他物体的距离,该系统通过调整自我车辆的纵向加速度来跟踪设定的速度并保持与前车的安全距离。
DDPG算法介绍
首先来回顾下DQN算法,我们图中可以看出DQN不能用于连续控制问题原因是因为maxQ(s’,a’)函数只能处理离散型的。众所周知,DQN的精髓在于用不能解决的连续状态空间的magic函数去估计Q值,也就是说,用一个magic函数,直接替代maxQ(s’,a’)的功能期待我们输入状态s,magic函数返回我们动作action的取值,这个取值能够让q值最大。这个就是DDPG中的Actor的功能。
DDPG算法更接近DQN算法,是用一个actor去弥补DQN不能处理连续控制性问题的缺点。为什么这么说那,往下看。首先图中的Critic网络的作用是预估Q,值得注意的是Critic网络的输入有两个:动作和状态,需要一起输入到Critic中,Critic网络的loss用的是TD-error;Actor网络输出的是一个动作,这个动作A输入到Crititc后,能够获得最大的Q值,Actor的更新方式是梯度上升。所以DDPG和DQN一样,用了固定网络(fix network)技术,就是先冻结住用来求target的网络。在更新之后,再把参数赋值到target网络。
用强化学习DDPG工具箱实现自适应巡航控制系统
-
首先打开工具箱
mdl = 'rlACCMdl'; open_system(mdl) agentblk = [mdl '/RL Agent'];
-
模型参数设定
1.从代理到环境的加速度作用信号为 –3 至 2 m/s^2。2.自我汽车的参考速度Vref定义如下。如果相对距离小于安全距离,则自我汽车将跟踪领先汽车速度和驾驶员设置速度的最小值。通过这种方式,自我汽车与领头汽车保持一定的距离。如果相对距离大于安全距离,则自我汽车将跟踪驾驶员设置的速度。在此示例中,安全距离定义为自我汽车纵向速度的线性函数V=tgap∗V+Ddefault.安全距离决定了自我汽车的参考跟踪速度。3.来自环境的观测值是速度误差和e=Vref−Vego,其积分∫e和和自我汽车的纵向速度V.4.当自我汽车的纵向速度小于0,或者领先汽车与自我汽车之间的相对距离小于0时,模拟终止。
-
环境接口
为模型创建强化学习环境接口。
创建状态和动作observationInfo = rlNumericSpec([3 1],'LowerLimit',-inf*ones(3,1),'UpperLimit',inf*ones(3,1)); observationInfo.Name = 'observations'; observationInfo.Description = 'information on velocity error and ego velocity'; actionInfo = rlNumericSpec([1 1],'LowerLimit',-3,'UpperLimit',2); actionInfo.Name = 'acceleration';
创建仿真环境接口
env = rlSimulinkEnv(mdl,agentblk,observationInfo,actionInfo);
要定义领先汽车位置的初始条件,请使用匿名函数句柄指定环境重置函数。重置函数 (在示例末尾定义)随机化了领先汽车的初始位置
java env.ResetFcn = @(in)localResetFcn(in);
-
创建 DDPG 代理
DDPG 代理使用批评值函数表示来近似给定观察和操作的长期奖励。要创建批评者,首先创建一个具有两个输入(状态和操作)以及一个输出的深度神经网络。有关创建神经网络值函数表示的更多信息L = 48; % number of neurons statePath = [ featureInputLayer(3,'Normalization','none','Name','observation') fullyConnectedLayer(L,'Name','fc1') reluLayer('Name','relu1') fullyConnectedLayer(L,'Name','fc2') additionLayer(2,'Name','add') reluLayer('Name','relu2') fullyConnectedLayer(L,'Name','fc3') reluLayer('Name','relu3') fullyConnectedLayer(1,'Name','fc4')]; actionPath = [ featureInputLayer(1,'Normalization','none','Name','action') fullyConnectedLayer(L, 'Name', 'fc5')]; criticNetwork = layerGraph(statePath); criticNetwork = addLayers(criticNetwork, actionPath);criticNetwork = connectLayers(criticNetwork,'fc5','add/in2'); criticNetwork = dlnetwork(criticNetwork);
使用指定 critic 优化器的选项。rlOptimizerOptions
criticOptions = rlOptimizerOptions('LearnRate',1e-3,'GradientThreshold',1,'L2RegularizationFactor',1e-4);
使用指定的神经网络和选项创建批评家表示。您还必须指定从环境界面获取的批评者的操作和观察信息。有关详细信息,请参阅 rlQValueFunction。
critic = rlQValueFunction(criticNetwork,observationInfo,actionInfo,...'ObservationInputNames','observation','ActionInputNames','action');
DDPG 代理通过使用参与者表示来决定要执行的给定观测值的操作。要创建actor,首先创建一个深度神经网络,其中包含一个输入,即观察,一个输出,即动作。构建演员的方式与批评家类似。
actorNetwork = [featureInputLayer(3,'Normalization','none','Name','observation')fullyConnectedLayer(L,'Name','fc1')reluLayer('Name','relu1')fullyConnectedLayer(L,'Name','fc2')reluLayer('Name','relu2')fullyConnectedLayer(L,'Name','fc3')reluLayer('Name','relu3')fullyConnectedLayer(1,'Name','fc4')tanhLayer('Name','tanh1')scalingLayer('Name','ActorScaling1','Scale',2.5,'Bias',-0.5)];actorNetwork = dlnetwork(actorNetwork);actorOptions = rlOptimizerOptions('LearnRate',1e-4,'GradientThreshold',1,'L2RegularizationFactor',1e-4);actor = rlContinuousDeterministicActor(actorNetwork,observationInfo,actionInfo);
若要创建 DDPG 代理,请首先使用 rlDDPGAgentOptions 指定 DDPG 代理选项。
agentOptions = rlDDPGAgentOptions(...'SampleTime',Ts,...'ActorOptimizerOptions',actorOptions,...'CriticOptimizerOptions',criticOptions,...'ExperienceBufferLength',1e6);agentOptions.NoiseOptions.Variance = 0.6;agentOptions.NoiseOptions.VarianceDecayRate = 1e-5;
然后,使用指定的参与者表示、批评家表示和代理选项创建 DDPG 代理。有关详细信息,请参阅 rlDDPGAgent。
agent = rlDDPGAgent(actor,critic,agentOptions);
-
训练模型
要训练代理,请首先指定训练选项。对于此示例,请使用以下选项:
运行每个训练集最多集,每集最多持续600个时间步长.
当代理收到大于 260 的剧集奖励时,停止训练。有关详细信息,请参阅 rlTrainingOptions。maxepisodes = 5000;maxsteps = ceil(Tf/Ts);trainingOpts = rlTrainingOptions(...'MaxEpisodes',maxepisodes,...'MaxStepsPerEpisode',maxsteps,...'Verbose',false,...'Plots','training-progress',...'StopTrainingCriteria','EpisodeReward',...'StopTrainingValue',260);
使用训练函数训练代理。训练是一个计算密集型过程,需要几分钟才能完成。要在运行此示例时节省时间,请通过设置为 加载预先训练的代理。要自己训练代理,请设置doTrainingfalsedoTraining=true
doTraining = false;if doTraining % Train the agent. trainingStats = train(agent,env,trainingOpts);else % Load a pretrained agent for the example. load('SimulinkACCDDPG.mat','agent')end
最后进行保存模型参数进行仿真模拟。
开发者涨薪指南
48位大咖的思考法则、工作方式、逻辑体系