要实现您自己的自定义强化学习算法,您可以通过创建自定义代理类的子类来创建自定义代理。然后你可以在MATLAB中训练和模拟这个代理®和模拟万博1manbetx®环境。有关在MATLAB中创建类的更多信息,请参见用户定义的类.
要定义自定义代理,首先创建一个类,该类是rl.agent.CustomAgent
班级。例如,本主题描述了培训的自定义LQR代理火车定制LQR代理.作为您自己代理的起点,您可以打开并修改这个自定义代理类。要将示例文件添加到MATLAB路径并打开该文件,请在MATLAB命令行中输入以下代码。
AddPath(FullFile(MatlaBroot,“例子”,“rl”,“主要”));编辑LQRCustomAgent.m
将类保存到自己的工作文件夹后,您可以从路径中删除示例文件。
rmpath (fullfile (matlabroot,“例子”,“rl”,“主要”));
这个类具有以下类定义,它指示代理类名和关联的抽象代理。
Classdef.LQRCustomAgent < rl.agent.CustomAgent
要定义您的代理,您必须指定以下内容:
代理的属性
构造函数
批评估计折扣长期奖励(如果需要学习)
基于当前观察选择动作的参与者表示(如果学习需要)
需要代理方法
可选代理方法
在属性
部分,指定创建和培训代理所需的任何参数。这些参数包括:
贴现因子用于贴现未来的回报
配置探测模型的参数,如噪声模型或贪心探测
使用重放内存的经验缓冲
迷你批量尺寸,用于从体验缓冲区中抽样
在培训期间展示前瞻性的步数
有关潜在代理属性的更多信息,请参阅内置强化学习工具箱™代理的选项对象。
的rl.Agent.CustomAgent
类已经包含代理示例时间的属性(采样时间
)及动作及观察规范(ActionInfo.
和ObservationInfo
, 分别)。
自定义LQR代理定义了以下代理属性。
属性%Q.问%r.R%反馈增益K%折扣系数γ= 0.95%的批评家评论家K缓冲液%KBUFFER.% K的更新数KUpdate = 1估算器更新的%编号EstimateNum = 10结尾属性(Access = Private)计数器= 1 YBUFFER HBUFFER结尾
要创建自定义代理,必须定义构造函数:
定义动作和观察规范。有关创建这些规范的更多信息,请参见rlnumericspec.
和rlfinitesetspec.
.
根据您的培训算法创建演员和批评者表示。有关更多信息,请参阅创建策略和值函数表示.
配置代理属性。
调用基本抽象类的构造函数。
例如,LQRCustomAgent
构造者定义了连续的动作和观察空间,并创建了一个批判的表示。的createCritic
函数是一个可选的辅助功能,用于定义批评者表示。
函数obj = LQRCustomAgent (Q, R, InitialK)%检查输入参数的数量narginchk (3,3);%调用抽象类构造函数obj = obj@rl.agent.CustomAgent ();设置Q和R矩阵obj。问= Q; obj.R = R;定义观察和活动空间obj。ObservationInfo = rlNumericSpec([大小(Q, 1), 1]);obj。一个ctionInfo = rlNumericSpec([size(R,1),1]);%创建批评家表示obj。评论家= createCritic (obj);%初始化增益矩阵obj。K= InitialK;%初始化体验缓冲区obj。YBuffer = 0 (obj.EstimateNum, 1);num = size(Q,1) + size(R,1);obj。HBuffer = 0 (obj.EstimateNum, 0.5 * num * (num + 1));obj。KBuffer = cell(1,1000); obj.KBuffer{1} = obj.K;结尾
如果您的学习算法使用评论家表示来估计长期回报,或者使用参与者来选择动作,或者两者都使用,那么您必须将它们添加为代理属性。然后,您必须在创建代理时创建这些表示;也就是说,在构造函数中。有关创建演员和评论家的更多信息,请参见创建策略和值函数表示.
例如,自定义LQR代理使用批评家表示,存储在其评论家
财产,没有行为人。批评家的创作是在createCritic
方法调用的Helper函数LQRCustomAgent
构造函数。
函数nQ = size(obj. q,1);nR =大小(obj.R, 1);n = nQ + nR;的w0 = 0.1 * (0.5 * (n + 1) * n, 1);{@(x,u),w0},...getObservationInfo (obj) getActionInfo (obj));critic.Options.GradientThreshold = 1;结尾
在这种情况下,评论家是rlQValueRepresentation
目的。要创建此类表示,必须将句柄指定为自定义基本功能,在这种情况下computeQuadraticBasis
函数。有关此评论家表示的更多信息,请参见火车定制LQR代理.
要创建自定义强化学习代理,您必须定义以下实现函数。要在您自己的代码中调用这些函数,请使用抽象基类的包装器方法。例如,打电话getActionImpl
,使用getAction
.包装器方法具有与实现方法相同的输入和输出参数。
函数 | 描述 |
---|---|
getActionImpl |
通过评估给定观察的代理策略来选择操作 |
GetActionWithExpliationimpl. |
使用代理的探索模型选择操作 |
learnImpl |
从当前的经验中学习,并以探索的方式返回行动 |
在您的实施功能中,为评估您的演员和批评者表示,您可以使用GetValue.
,getAction
,getmaxqvalue.
功能。
评估A.rlValueRepresentation
批评者只有观察输入信号,获得状态值函数V
使用以下语法。
V = getValue(评论家,观察);
评估A.rlQValueRepresentation
用观测和动作输入信号进行批判,得到状态-动作值函数问
使用以下语法。
Q = getValue(评论家,(观察、行动));
评估A.rlQValueRepresentation
批评家只用观察输入信号,得到状态-动作值函数问
对于所有可能的离散操作,请使用以下语法。
Q = getValue(评论家,观察);
一个离散的作用空间rlQValueRepresentation
评论家,获取最大Q状态动作值函数问
对于所有可能的离散操作,请使用以下语法。
[MaxQ, MaxActionIndex] = getMaxQValue(评论家,观察);
要评估一个行动者表示(rlStochasticActorRepresentation
或RLDETerminyActorRepresentation
),获得行动一个
使用以下语法。
a =努力(演员,观察);
对于每一种情况,如果参与者或批评者网络使用递归神经网络,函数也可以在获得相应的网络输出后返回网络状态的当前值。
getActionImpl
函数的getActionImpl
函数是评估代理的策略并选择一个操作。该函数必须具有以下签名,其中obj.
是代理对象,观察
目前的观察是,和行动
是选定的动作。
函数action = getActionImpl (obj,观察)
对于自定义LQR代理,您可以通过应用程序选择一个操作u= -Kx控制律。
函数action = getActionImpl (obj,观察)给定系统的当前状态,返回一个操作Action = -obj.k *观察{:};结尾
GetActionWithExpliationimpl.
函数的GetActionWithExpliationimpl.
函数使用代理的探索模型选择操作。使用这个函数,可以实现贪心探索等算法。该函数必须具有以下签名,其中obj.
是代理对象,观察
目前的观察是,和行动
是选定的动作。
函数动作= GetActionWithExpliationimpl(OBJ,观察)
对于自定义LQR代理商,GetActionWithExpliationimpl.
函数向使用当前代理策略选择的操作添加随机白噪声。
函数动作= GetActionWithExpliationimpl(OBJ,观察)%给定当前的观察,选择一个动作动作= Getaction(OBJ,观察);%为动作添加随机噪声num =大小(obj.R, 1);操作=操作+ 0.1*randn(num,1);结尾
learnImpl
函数的learnImpl
函数定义代理如何从当前经验中学习。这个函数通过更新策略参数和选择带有探索的操作来实现代理的自定义学习算法。该函数必须具有以下签名,其中obj.
是代理对象,经验值
目前是否有代理经验,以及行动
是选定的动作。
函数action = learnImpl (obj,经验值)
代理经验是单元格数组exp = {状态,操作,right,nextstate,Isdone}
.
状态
是目前的观察。
行动
是当前的动作。
奖励
是当前的奖励。
下持久
是下一个观察。
结束
是一个逻辑标志,指示训练阶段已完成。
对于自定义LQR代理,每一次都会更新批评家参数N
脚步。
函数action = learnImpl (obj,经验值)%解析输入的经验x = exp {1} {1};u = exp {2} {1};dx = exp {4} {1};y = (x ' * obj。问*x + u'*obj.R*u); num = size(obj.Q,1) + size(obj.R,1);在更新批评参数之前,%等待n步骤n = obj.estimateNum;h1 = computequadraticbasis(x,u,num);H2 = ComputurequadraticBasis(DX,-Obj.k * dx,num);h = h1 - obj.gamma * h2;如果obj.counter <= n obj.ybuffer(obj.counter)= y;obj.hbuffer(obj.counter,:) = h;obj.counter = obj.counter + 1;别的%基于批量更新批评参数%的经验h_buf = obj.hbuffer;y_buf = objuffer;Theta =(h_buf'* h_buf)\ h_buf'* y_buf;obj.critic = setLearnableParameters(obj.critic,{theta});%基于新的批评参数获得新的增益矩阵obj。K= getNewK(obj);重置经验缓冲区obj。Counter = 1;obj。YBuffer = 0 (N, 1);obj。HBuffer = 0 (N, 0.5 * num * (num + 1));obj。KUpdate = obj.KUpdate + 1; obj.KBuffer{obj.KUpdate} = obj.K;结尾找到并返回一个带有探索的动作Action = GetActionWith expliver(Obj,Exp {4});结尾
您还可以通过指定resetImpl
函数的签名如下obj.
是代理对象。使用此功能,您可以在培训之前将代理程序设置为已知或随机状态。
函数resetimpl(ob)
此外,您可以根据需要定义自定义代理类中的任何其他辅助函数。例如,自定义LQR代理定义了一个createCritic
创建批评者表示的功能和一个getnewk.
从训练的批评参数中导出反馈增益矩阵的函数。
定义自定义代理类后,在MATLAB工作区中创建一个实例。例如,要创建自定义LQR代理,请定义问
,R
,InitialK
值并调用构造函数。
Q =[10 3 1; 3、5、4、1、4、9];R = 0.5 *眼(3);K0 =地方(A, B, [0.4, 0.8, 0.5]);代理= LQRCustomAgent (Q, R, K0);
验证环境对象之后,可以使用它来训练强化学习代理。有关训练自定义LQR代理的示例,请参见火车定制LQR代理.