MATLAB强化学习实战(七) 在Simulink中训练DDPG控制倒立摆系统

本文介绍如何使用深度确定性策略梯度(DDPG)智能体控制基于Simscape Multibody的倒立摆系统。该系统的目标是在最小控制力的情况下使杆保持直立。文章详细介绍了环境设置、智能体创建及训练过程。

此示例显示了如何训练深度确定性策略梯度(DDPG)智能体去控制以Simscape™Multibody™建模的倒立摆系统。

matlab 版本 2020b
在这里插入图片描述

倒立摆的Simscape模型

此示例的强化学习环境是一根杆,该杆连接到手推车上未操纵的关节上,该关节沿着无摩擦的轨道移动。 训练的目标是使杆立起,而只需花费最小的控制力就不会摔倒。

打开模型

mdl = 'rlCartPoleSimscapeModel';
open_system(mdl)

在这里插入图片描述
倒立摆系统是使用Simscape Multibody建模的。

在这里插入图片描述
对于该模型:

  1. 向上的平衡杆位置为0弧度,向下的悬挂位置为pi弧度。
  2. 从agent到环境的力作用信号是15到15 N,
  3. 从环境中观察到的是手推车的位置和速度,以及杆角的正弦、余弦和导数。
  4. 如果车从原来的位置移动超过3.5米,则该episode终止。
  5. 在每个时间步提供的奖励 r t r_t rt
    在这里插入图片描述

其中:

  1. θ t \theta_t θt是从杆的直立位置开始的位移角。
  2. x t x_t xt是从小车中心位置移动的位置。
  3. u t − 1 u_{t-1} ut1是前一个时间步骤的控制工作。
  4. B是一个标志(1或0),指示车是否越界。

有关此模型的更多信息,请参见加载预定义的Simulink环境

创建环境接口

为杆创建预定义的环境接口。

env = rlPredefinedEnv('CartPoleSimscapeModel-Continuous')

在这里插入图片描述
该接口具有连续的作用空间,智能体可以在其中向极点施加从–15到15 N的可能扭矩值。

从环境接口获取观察和动作信息。

obsInfo = getObservationInfo(env);
numObservations = obsInfo.Dimension(1);
actInfo = getActionInfo(env);

以秒为单位指定模拟时间Tf和智能体采样时间Ts。

Ts = 0.02;
Tf = 25;

固定随机发生器种子的重现性。

rng(0)

创建DDPG智能体

DDPG智能体使用评论者价值函数表示法,根据给定的观察和操作来估算长期奖励。 要创建评论者,首先要创建一个具有两个输入(状态和动作)和一个输出的深度神经网络。 动作路径的输入大小为[1 1 1],因为智能体可以将动作作为一个力值施加到环境。 有关创建深度神经网络值函数表示的更多信息,请参见创建策略和值函数表示

statePath = [
    featureInputLayer(numObservations,'Normalization','none','Name','observation')
    fullyConnectedLayer(128,'Name','CriticStateFC1')
    reluLayer('Name','CriticRelu1')
    fullyConnectedLayer(200,'Name','CriticStateFC2')];

actionPath = [
    featureInputLayer(1,'Normalization','none','Name','action')
    fullyConnectedLayer(200,'Name','CriticActionFC1','BiasLearnRateFactor',0)];

commonPath = [
    additionLayer(2,'Name','add')
    reluLayer('Name','CriticCommonRelu')
    fullyConnectedLayer(1,'Name','CriticOutput')];

criticNetwork = layerGraph(statePath);
criticNetwork = addLayers(criticNetwork,actionPath);
criticNetwork = addLayers(criticNetwork,commonPath);
    
criticNetwork = connectLayers(criticNetwork,'CriticStateFC2','add/in1');
criticNetwork = connectLayers(criticNetwork,'CriticActionFC1','add/in2');

查看评论者网络配置。

figure
plot(criticNetwork)

在这里插入图片描述
使用rlRepresentationOptions指定评论者表示的选项。

criticOptions = rlRepresentationOptions('LearnRate',1e-03,'GradientThreshold',1);

使用指定的深度神经网络和选项创建评论者表示。 您还必须指定评论者的操作和观察信息,这些信息已经从环境界面中获得。 有关更多信息,请参见rlQValueRepresentation

critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,...
    'Observation',{'observation'},'Action',{'action'},criticOptions);

DDPG智能体使用写得者表示来决定在给定的观察结果下要采取哪种操作。 要创建行动者,首先要创建一个具有一个输入(观察)和一个输出(动作)的深度神经网络。

以类似于评论者的方式构造行动者。 有关更多信息,请参见rlDeterministicActorRepresentation

actorNetwork = [
    featureInputLayer(numObservations,'Normalization','none','Name','observation')
    fullyConnectedLayer(128,'Name','ActorFC1')
    reluLayer('Name','ActorRelu1')
    fullyConnectedLayer(200,'Name','ActorFC2')
    reluLayer('Name','ActorRelu2')
    fullyConnectedLayer(1,'Name','ActorFC3')
    tanhLayer('Name','ActorTanh1')
    scalingLayer('Name','ActorScaling','Scale',max(actInfo.UpperLimit))];

actorOptions = rlRepresentationOptions('LearnRate',5e-04,'GradientThreshold',1);

actor = rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,...
    'Observation',{'observation'},'Action',{'ActorScaling'},actorOptions);

要创建DDPG智能体,请首先使用rlDDPGAgentOptions指定DDPG智能体选项。

agentOptions = rlDDPGAgentOptions(...
    'SampleTime',Ts,...
    'TargetSmoothFactor',1e-3,...
    'ExperienceBufferLength',1e6,...
    'MiniBatchSize',128);
agentOptions.NoiseOptions.Variance = 0.4;
agentOptions.NoiseOptions.VarianceDecayRate = 1e-5;

然后,使用指定的行动者表示,评论者表示和智能体选项创建行动者。 有关更多信息,请参见rlDDPGAgent

agent = rlDDPGAgent(actor,critic,agentOptions);

训练智能体

要训练智能体,请首先指定训练选项。 对于此示例,使用以下选项。

  1. 每个训练episode 最多运行2000个episode ,每个episode 最多持续ceil(Tf / Ts)个时间步长。

  2. 在“Episode Manager”对话框中显示训练进度(设置“Plots ”选项)并禁用命令行显示(将“Verbose ”选项设置为false)。

  3. 当智能体连续五个episode 获得的平均累积奖励大于–400时,请停止训练。 在这一点上,智能体可以用最少的控制力量快速地将立杆平衡在直立位置。

  4. 为累积奖励大于–400的每个episode 保存智能体的副本。

有关更多信息,请参见rlTrainingOptions

maxepisodes = 2000;
maxsteps = ceil(Tf/Ts);
trainingOptions = rlTrainingOptions(...
    'MaxEpisodes',maxepisodes,...
    'MaxStepsPerEpisode',maxsteps,...
    'ScoreAveragingWindowLength',5,...
    'Verbose',false,...
    'Plots','training-progress',...
    'StopTrainingCriteria','AverageReward',...
    'StopTrainingValue',-400,...
    'SaveAgentCriteria','EpisodeReward',...
    'SaveAgentValue',-400);

使用训练功能训练智能体。 培训此智能体过程需要大量的计算,并且需要几个小时才能完成。 为了节省运行本示例的时间,请通过将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('SimscapeCartPoleDDPG.mat','agent')
end

在这里插入图片描述

DDPG智能体仿真

要验证训练后的智能体的表现,请在杆状环境中对其进行仿真。 有关智能体模拟的更多信息,请参见rlSimulationOptionssim

simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);

在这里插入图片描述

bdclose(mdl)
内容概要:本文详细探讨了强化学习中的DDPG(深度确定性策略梯度)法及其在控制领域的应用。首先介绍了DDPG的基本原理,即一种能够处理连续动作空间的基于策略梯度的法。接着讨论了DDPG与其他经典控制法如MPC(模型预测控制)、鲁棒控制、PID(比积分微分控制)和ADRC(自抗扰控制)的结合方式,展示了它们在提高系统性能方面的潜力。文中还提供了具体的编程实,包括Python和MATLAB代码片段,演示了如何构建DDPG智能体以及将其应用于机械臂轨迹跟踪、自适应PID控制倒立摆控制等问题。此外,强调了MATLAB Reinforcement Learning工具箱的作用,指出它为实现这些法提供了便捷的方法。 适合人群:对控制理论有一定了解的研究人员和技术爱好者,特别是那些希望深入了解强化学习与传统控制方法结合的人群。 使用场景及目标:适用于需要解决复杂非线性系统控制问题的场合,如机器人运动规划、自动化生产线管理等领域。目标是通过引入DDPG法改进现有控制系统的响应速度、精度和鲁棒性。 其他说明:文章不仅涵盖了理论层面的知识,还包括大量实用的操作指南和代码示,有助于读者快速掌握相关技能并在实践中加以运用。同时提醒读者关注法融合时的一些关键细节,比如奖励函数的设计、混合比的选择等。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值