这个例子展示了如何训练一个自定义线性二次调节(LQR) agent来控制一个在MATLAB中建模的离散时间线性系统。
本例的强化学习环境是一个离散时间线性系统。给出了系统的动力学方程
反馈控制律为
控制目标是使二次成本最小化: .
在这个例子中,系统矩阵是
= (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);
二次代价矩阵为:
Q =[10 3 1; 3、5、4、1、4、9];R = 0.5 *眼(3);
对于这样的环境,奖励是适时的 是由 ,也就是负的二次成本。因此,最大化回报会使成本最小化。初始条件由复位函数随机设定。
为这个线性系统和奖励创建MATLAB环境接口。的myDiscreteEnv
函数通过定义自定义来创建环境一步
和重置
功能。有关创建此类自定义环境的更多信息,请参见使用自定义函数创建MATLAB环境.
env = myDiscreteEnv (A, B, Q, R);
修复随机生成器种子的再现性。
rng (0)
对于LQR问题,给定控制增益的q函数 可以被定义为 ,在那里 是一个对称的正定矩阵。
将控制律最大化 是 ,而反馈增益是 .
矩阵 包含 不同元素值,其中 是状态数和输入数的和。表示 对应于这些向量 元素,其中非对角线元素 乘以2。
用表示q函数 ,在那里 包含需要学习的参数。
,在那里 二次基函数是用的吗 和 .
LQR代理从稳定控制器开始 .为了得到一个初始的稳定控制器,放置闭环系统的极点 在单位圆内。
K0 =地方(A, B, [0.4, 0.8, 0.5]);
类的子类要创建自定义代理,必须创建rl.agent.CustomAgent
抽象类。对于自定义LQR代理,定义的自定义子类为LQRCustomAgent
.有关更多信息,请参见创建自定义强化学习代理.使用。创建自定义LQR代理
,
,
.代理不需要关于系统矩阵的信息
和
.
代理= LQRCustomAgent (Q, R, K0);
对于本例,将代理折扣系数设置为1。若要使用贴现后的未来回报,请将贴现因子设为小于1的值。
代理。γ= 1;
由于线性系统有三个状态和三个输入,所以可学习参数的总数为 .为了确保代理的满意性能,设置参数估计的数量 大于可学习参数数目的两倍。本例中为 .
代理。EstimateNum = 45;
为得到较好的估计结果 ,您必须对系统应用一个持续兴奋的探索模型。在本例中,通过在控制器输出中添加白噪声来鼓励模型探索: .一般来说,探索模型依赖于系统模型。
要培训代理,首先指定培训选项。对于本示例,请使用以下选项。
每次训练最多进行一次10
每集最多持续一集50
时间的步骤。
显示命令行显示(设置详细的
选项),并在“插曲管理器”对话框中禁用培训进度(将情节
选项)。
有关更多信息,请参见rlTrainingOptions
.
trainingOpts = rlTrainingOptions (...“MaxEpisodes”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的性能,在MATLAB环境中对其进行仿真。有关代理模拟的更多信息,请参见rlSimulationOptions
和sim卡
.
simOptions = rlSimulationOptions (“MaxSteps”, 20);经验= sim (env,代理,simOptions);totalReward =总和(experience.Reward)
totalReward = -20.1306
你可以计算LQR问题的最优解使用dlqr
函数。
[Koptimal P] = dlqr (A, B, Q, R);
最佳奖励是 .
x0 = experience.Observation.obs1.getdatasamples (1);Joptimal = x0 ' * P * x0;
计算训练后的LQR agent与最优LQR解之间的报酬误差。
rewardError = totalReward - Joptimal
rewardError = 1.5270 e-06
查看训练LQR代理与最优LQR解之间增益的2范数误差的历史。
%增益更新数len = agent.KUpdate;呃= 0 (len, 1);为我= 1:兰增益误差范数的%犯错(i) =规范(agent.KBuffer{我}-Koptimal);结束情节(呃,“b * - - - - - -”)
计算反馈增益的最终误差范数。
gainError =规范(代理。K - Koptimal)
gainError = 2.2458 e-11
总的来说,经过训练的agent找到了一个接近于真实最优LQR解的LQR解。