主要内容

培训定制LQR代理

这个例子展示了如何训练一个自定义线性二次调节(LQR) agent来控制一个在MATLAB中建模的离散时间线性系统。

创建线性系统环境

本例中的强化学习环境是一个离散时间线性系统。系统的动力学由下式给出:

x t + 1 一个 x t + B u t

反馈控制律为

u t - K x t

控制目标是最小化二次成本: J t 0 x t Qx、 t + u t 俄文 t

在本例中,系统矩阵为

一个 1 05 0 05 0 05 0 05 1 05 0 05 0 0 05 1 05 B 0 1 0 0 2 0 1 0 5 0 0 0 0 5

= (1.05, 0.05, 0.05, 0.05, 1.05, 0.05, 0, 0.05, 1.05);B = [0.1, 0, 0.2, 0.1, 0.5, 0, 0, 0, 0.5);

二次成本矩阵为:

10 3. 1 3. 5 4 1 4 9 R 0 5 0 0 0 0 5 0 0 0 0 5

Q=[10,3,1;3,5,4;1,4,9];R=0.5*眼(3);

对于这种环境,奖励在时间 t 是由 r t - x t x t - u t R u t ,也就是负的二次成本。因此,最大化回报会使成本最小化。初始条件由复位函数随机设定。

为这个线性系统和奖励创建MATLAB环境接口。的myDiscreteEnv函数通过定义自定义一步重置功能。有关创建此类自定义环境的更多信息,请参见使用自定义函数创建MATLAB环境

env=myDiscreteEnv(A,B,Q,R);

修复随机生成器种子以获得再现性。

rng (0)

创建自定义LQR代理

对于LQR问题,给定控制增益的q函数 K 可以被定义为 K x u x u H K x u 哪里 H K H xx H H 用户体验 H uu 是一个对称的正定矩阵。

最大化的控制律 K u - H uu - 1 H 用户体验 x ,而反馈增益是 K H uu - 1 H 用户体验

矩阵 H K 包含 1 2 n n + 1 不同的元素值,其中 n 是状态数和输入数之和。表示 θ 作为对应于这些的向量 元素,其中非对角元素位于 H K 都乘以二。

通过以下方式表示Q函数: θ 哪里 θ 包含要学习的参数。

K x u θ K ϕ x u 哪里 ϕ x u 是二次基函数,表示为 x u

LQR代理从稳定控制器开始 K 0 .为了得到一个初始的稳定控制器,放置闭环系统的极点 一个 - 汉堡王 0 在单位圆内。

K0 =地方(A, B, [0.4, 0.8, 0.5]);

要创建自定义代理,必须创建rl.agent.CustomAgent抽象类。对于自定义LQR代理,定义的自定义子类为LQR客户代理.有关更多信息,请参见创建自定义强化学习代理.使用。创建自定义LQR代理 R K 0 .代理不需要关于系统矩阵的信息 一个 B

agent=LQRCustomAgent(Q,R,K0);

对于本例,请将代理折扣系数设置为1。要使用折扣的未来奖励,请将折扣系数设置为小于1的值。

代理。γ= 1;

由于线性系统有三个状态和三个输入,所以可学习参数的总数为 21 .为了确保代理的满意性能,设置参数估计的数量 N p 大于可学习参数数目的两倍。本例中为 N p 45

代理。EstimateNum = 45;

为了获得良好的估计结果 θ ,则必须对系统应用持续激发的探索模型。在本例中,通过向控制器输出添加白噪声来鼓励模型探索: u t - Kx t + e t .一般来说,探索模型依赖于系统模型。

火车代理

要培训代理,请首先指定培训选项。对于本例,请使用以下选项。

  • 每个训练集最多运行一个小时10每集最多持续一集50时间的步骤。

  • 显示命令行显示(设置冗长的选项),并在“事件管理器”对话框中禁用培训进度(设置阴谋选项)。

有关更多信息,请参见RL培训选项

trainingOpts = rlTrainingOptions (...“最大集”10...“MaxStepsPerEpisode”,50,...“冗长”,真的,...“阴谋”“没有”);

使用火车函数。

trainingStats =火车(代理,env, trainingOpts);
插曲:1/10 |集奖励:-55.16 |集步骤:50 |平均奖励:-55.16 |步骤数:50集:2/10 |集奖赏:-12.52 |集步骤:50 |平均奖励:-33.84 |步骤数:100集:3/10 |集奖赏:-15.59 |集步骤:50 |平均奖励:-27.76 |步骤数:150集:4/10 |集奖赏:50 | -22.22 |集步骤:平均奖励:-26.37 |步骤数:200集:5/10 |集奖赏:-14.32 |集步骤:50 |平均奖励:-23.96 |步骤数:250集:6/10 |集奖赏:-19.23 |集步骤:50 |平均奖励:-16.78 |步骤数:300集:7/10 |集奖赏:-34.14 |集步骤:50 |平均奖励:-21.10 |步骤数:350集:8/10 |集奖赏:-13.95 |集步骤:50 |平均奖励:-20.77 |步骤数:400集:9/10 |集奖赏:-36.01 |集步骤:50 |平均奖励:-23.53 |步骤数:450集:10/10 |集奖赏:-12.43 |集步骤:50 |平均奖励:步数:500

模拟Agent并与最优解进行比较

为了验证训练后的agent的性能,在MATLAB环境中对其进行仿真。有关代理模拟的更多信息,请参见模拟选项sim卡

simOptions=rlSimulationOptions(“MaxSteps”,20); 经验=模拟(环境、代理、模拟选项);totalReward=总和(经验奖励)
总报酬=-20.1306

你可以计算LQR问题的最优解使用dlqr函数。

[Koptimal P] = dlqr (A, B, Q, R);

最佳奖励是 J 最优 - x 0 Px 0

x0=经验.观察.观测1.获取数据样本(1);JoOptimal=-x0'*P*x0;

计算训练后的LQR agent与最优LQR解之间的报酬误差。

rewardError = totalReward - Joptimal
rewardError = 1.5270 e-06

查看经过训练的LQR代理和最优LQR解决方案之间增益的2-范数误差历史。

%增益更新数len = agent.KUpdate;呃= 0 (len, 1);我= 1:兰增益误差范数的%err(i)=范数(agent.KBuffer{i}-kooptimal);结束情节(呃,“b * - - - - - -”

图中包含一个轴对象。axis对象包含一个类型为line的对象。

计算反馈增益的最终误差范数。

gainError =规范(代理。K - Koptimal)
gainError=2.2458e-11

总的来说,经过训练的代理会找到一个接近真实最优LQR解的LQR解。

另请参阅

相关话题