培训自定义LQR代理
这个例子展示了如何训练自定义线性二次调节(LQR)代理来控制MATLAB®建模的离散线性系统。
创造线性系统环境
本例中的强化学习环境是一个离散时间线性系统。系统的动力学由
反馈控制律为
控制目标是使二次代价最小: .
在这个例子中,系统矩阵是
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];
二次代价矩阵为:
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代理
对于LQR问题,给定控制增益的q函数 可以定义为 ,在那里 是一个对称的正定矩阵。
控制律为最大化 是 ,反馈增益为 .
矩阵 包含 不同的元素值,其中 是状态数和输入数的和。表示 对应于这些向量 元素,其中的非对角线元素 都乘以2。
表示q函数为 ,在那里 包含需要学习的参数。
,在那里 二次基函数是用 而且 .
LQR代理从一个稳定控制器开始 .为了得到一个初始的稳定控制器,在闭环系统中放置极点 在单位圆内。
K0 =位置(A,B,[0.4,0.8,0.5]);
类的子类,才能创建自定义代理rl.agent.CustomAgent
抽象类。对于自定义LQR代理,定义的自定义子类为LQRCustomAgent
.有关更多信息,请参见创建自定义强化学习代理.使用创建自定义LQR代理
,
,
.代理不需要关于系统矩阵的信息
而且
.
agent = LQRCustomAgent(Q,R,K0);
对于本例,将代理折扣因子设置为1。若要使用折现的未来奖励,请将折现因子设置为小于1的值。
代理。Gamma = 1;
由于线性系统有三个状态和三个输入,因此可学习参数的总数为 .要确保代理的性能令人满意,请设置参数估计的数量 大于可学习参数数目的两倍。本例中为 .
代理。EstimateNum = 45;
得到很好的估计结果 ,您必须对系统应用持续兴奋的探索模型。在这个例子中,通过在控制器输出中添加白噪声来鼓励模型探索: .一般来说,探索模型依赖于系统模型。
火车代理
要培训代理,首先指定培训选项。对于本例,使用以下选项。
每个训练集最多运行一次
10
集,每集最多50
时间的步骤。显示命令行显示(设置
详细的
选项),并在“事件管理器”对话框中禁用训练进度情节
选项)。
有关更多信息,请参见rlTrainingOptions
.
trainingOpts = 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 =总和(经验。奖励)
totalReward = -30.6482
方法计算LQR问题的最优解dlqr
函数。
[Koptimal,P] = dlqr(A,B,Q,R);
最佳奖励由 .
x0 = experience.Observation.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 * - - - - - -”)
计算反馈增益的最终误差范数。
gainError = norm(代理。K - Koptimal)
gainError = 1.0252e-11
总的来说,经过训练的智能体找到了一个接近真正最优LQR解的LQR解。