主要内容

培训自定义LQR代理

这个例子展示了如何训练一个自定义线性二次调节(LQR)代理来控制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

A = [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 ,它是二次代价的负数。因此,奖励最大化可以使成本最小化。初始条件由reset函数随机设置。

为这个线性系统和奖励创建MATLAB环境界面。的myDiscreteEnv函数通过定义custom来创建一个环境一步而且重置功能。有关创建这种自定义环境的更多信息,请参见使用自定义函数创建MATLAB环境

env = mydiscrete teenv (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 乘以2。

用。表示q函数 θ ,在那里 θ 包含要学习的参数。

K x u θ K ϕ x u ,在那里 ϕ x u 二次基函数的形式是 x 而且 u

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

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

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

agent = LQRCustomAgent(Q,R,K0);

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

代理。Gamma = 1;

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

代理。EstimateNum = 45;

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

火车代理

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

  • 每次训练最多跑一段时间10每集最多持续一集50时间的步骤。

  • 显示命令行Display(设置详细的选项)并在“插曲管理器”对话框中禁用训练进度(设置情节选项)。

有关更多信息,请参见rlTrainingOptions

trainingoptions = rlTrainingOptions(...“MaxEpisodes”10...“MaxStepsPerEpisode”, 50岁,...“详细”,真的,...“阴谋”“没有”);

训练代理使用火车函数。

trainingStats = train(agent,env,trainingOpts);
插曲:1/10 |集奖励:-51.67 |集步骤:50 |平均奖励:-51.67 |步骤数:50集:2/10 |集奖赏:-30.29 |集步骤:50 |平均奖励:-40.98 |步骤数:100集:3/10 |集奖赏:-24.49 |集步骤:50 |平均奖励:-35.48 |步骤数:150集:4/10 |集奖赏:-18.92 |集步骤:50 |平均奖励:-31.34 |步骤数:200集:5/10 |集奖赏:-5.92 |集步骤:50 |平均奖励:-26.26 |一步数:250集:6/10 |集奖赏:-33.73 |集步骤:50 |平均奖励:-22.67 |步骤数:300集:7/10 |集奖赏:-11.93 |集步骤:50 |平均奖励:-19.00 |步骤数:350集:8/10 |集奖赏:-29.12 |集步骤:50 |平均奖励:-19.93 |步骤数:400集:9/10 |集奖赏:-20.91 |集步骤:50 |平均奖励:-20.32 |步骤数:450集:10/10 |集奖赏:-9.52 |集步骤:平均奖励:-21.04 |步数:500

模拟Agent并与最优解比较

为了验证训练过的代理的性能,在MATLAB环境中进行了仿真。有关代理模拟的更多信息,请参见rlSimulationOptions而且sim卡

simOptions = rlSimulationOptions(“MaxSteps”, 20);experience = sim(env,agent,simOptions);totalReward = sum(经验。奖励)
totalReward = -30.6482

方法可以计算LQR问题的最优解dlqr函数。

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

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

x0 = experience. observe .obs1.getdatasamples(1);Joptimal = -x0'*P*x0;

计算经过训练的LQR代理和最优LQR解之间的奖励误差。

rewardError = totalReward - Joptimal
rewardError = 5.0439e-07

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

增益更新的百分比len = agent.KUpdate;Err = 0 (len,1);I = 1:len增益误差的%范数err(i) = norm(agent.KBuffer{i}-Koptimal);结束情节(呃,“b * - - - - - -”

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

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

gainError = norm(代理。K - Koptimal)
gainError = 2.0203e-11

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

另请参阅

相关的话题

Baidu
map