要实现您自己的自定义强化学习算法,您可以通过创建自定义代理类的子类来创建自定义代理。然后你可以在MATLAB中训练和模拟这个代理®和Sim万博1manbetxulink®环境。有关在MATLAB中创建类的更多信息,请参阅用户定义的类.
要定义自定义代理,请先创建一个是子类的类rl.agent.customagent.
班作为示例,本主题介绍在中培训的自定义LQR代理培训定制LQR代理.作为您自己代理的起点,您可以打开并修改这个自定义代理类。要将示例文件添加到MATLAB路径并打开该文件,请在MATLAB命令行中输入以下代码。
addpath(完整文件(matlabroot、,'例子','rl','主要的'));编辑lqrcustomagent.m
将类保存到自己的工作文件夹后,可以从路径中删除示例文件。
rmpath(fullfile(matlabroot,'例子','rl','主要的'));
这个类具有以下类定义,它指示代理类名和关联的抽象代理。
classdeflqrcustomagent
要定义您的代理,您必须指定以下内容:
代理属性
构造函数
评估折扣长期回报的评论家陈述(如果学习需要)
基于当前观察选择动作的参与者表示(如果学习需要)
所需的代理方法
可选的代理方法
在里面特性
部分,指定创建和培训代理所需的任何参数。这些参数包括:
贴现因子用于贴现未来的回报
配置探测模型的参数,如噪声模型或贪心探测
使用重放内存的缓冲区
用于从经验缓冲区取样的最小批量大小
培训期间要向前看的步骤数
有关潜在代理属性的详细信息,请参阅内置强化学习工具箱的选项对象™ 代理人。
的rl.agent.customagent.
类已经包括代理示例时间的属性(取样时间
)及动作及观察规范(行动信息
和观察税收
分别为)。
自定义LQR代理定义了以下代理属性。
特性%Q问%RR%反馈增益K%贴现系数γ= 0.95%评论家评论家K缓冲液%KBufferk%的更新数kupdate = 1%估计更新次数估计= 10.终止属性(访问=专用)计数器=1 YBuffer HBBuffer终止
要创建自定义代理,必须定义一个构造函数:
定义动作和观察规范。有关创建这些规范的更多信息,请参见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.critic = createcitic(obj);%初始化增益矩阵obj.k = italyk;%初始化经验缓冲区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));批评.Options.gradientThreshold = 1;终止
在这种情况下,评论家是rlQValueRepresentation
对象要创建这样的表示,必须指定自定义基函数的句柄,在本例中为computequadraticbasis.
函数。有关此评论家表示的更多信息,请参见培训定制LQR代理.
要创建自定义强化学习代理,必须定义以下实现功能。要在自己的代码中调用这些函数,请使用抽象基类中的包装器方法。例如,打电话GetActionimpl.
, 用努力
.包装器方法具有与实现方法相同的输入和输出参数。
功能 | 描述 |
---|---|
GetActionimpl. |
通过评估给定观察的代理策略来选择操作 |
getActionWithExplorationImpl |
使用代理的探索模型选择一个操作 |
learnImpl |
从当前的经验中学习,并以探索的方式返回行动 |
在实现函数中,要评估参与者和评论家表示,可以使用getValue
,努力
, 和getMaxQValue
职能。
评估rlValueRepresentation
只需观察输入信号,即可得到状态值函数V
使用以下语法。
v = getValue(评论家,观察);
评估rlQValueRepresentation
批判与观察和动作输入信号,获得状态动作值函数问
使用以下语法。
q = getValue(评论家,[观察,动作]);
评估rlQValueRepresentation
批评家只用观察输入信号,得到状态-动作值函数问
对于所有可能的离散操作,使用以下语法。
Q = getValue(评论家,观察);
一个离散的作用空间rlQValueRepresentation
批评家,获得最大Q状态动作值函数问
对于所有可能的离散操作,使用以下语法。
[maxq,maxactindex] = getmaxqvalue(批评者,观察);
要评估一个行动者表示(rlstochastorrepresentation
或者决定论呈现
),获得行动一个
使用以下语法。
A=行动(参与者、观察);
对于每一种情况,如果参与者或批评者网络使用递归神经网络,函数也可以在获得相应的网络输出后返回网络状态的当前值。
GetActionimpl.
功能的GetActionimpl.
函数用于评估代理的策略并选择操作。此函数必须具有以下签名,其中obj
是代理对象,观察
目前的观察是,和行动
是选定的操作。
功能action = getActionimpl(obj,观察)
对于自定义LQR代理,可以通过应用u= -Kx控制律。
功能action = getActionimpl(obj,观察)给定系统的当前状态,返回一个操作action=-obj.K*观察{:};终止
getActionWithExplorationImpl
功能的getActionWithExplorationImpl
函数使用代理的探索模型选择操作。使用这个函数,可以实现贪心探索等算法。该函数必须具有以下签名,其中obj
是代理对象,观察
目前的观察是,和行动
是选定的操作。
功能action=getActionWithExplorationImpl(对象,观察)
对于自定义LQR代理getActionWithExplorationImpl
函数向使用当前代理策略选择的操作添加随机白噪声。
功能action=getActionWithExplorationImpl(对象,观察)%给定当前的观察,选择一个动作动作=获取动作(obj,观察);%向动作添加随机噪波num =大小(obj.R, 1);操作=操作+ 0.1*randn(num,1);终止
learnImpl
功能的learnImpl
函数定义代理如何从当前经验中学习。这个函数通过更新策略参数和选择带有探索的操作来实现代理的自定义学习算法。该函数必须具有以下签名,其中obj
是代理对象,经验值
是目前的代理经验,还有行动
是选定的操作。
功能Action = Seathimpl(OBJ,EXP)
代理体验是单元阵列exp={state,action,reward,nextstate,isdone}
.
状态
这是目前的观察结果。
行动
是目前的行动。
报酬
是当前的奖励。
下一州
是下一个观察。
结束
是一个逻辑标志,指示训练阶段已完成。
对于自定义LQR代理,批评参数将更新N
步骤。
功能Action = Seathimpl(OBJ,EXP)%解析输入的经验x = exp {1} {1};u = exp {2} {1};dx = exp {4} {1};y =(x'* obj.q * x + u'* obj.r * u);num = size(obj.q,1)+大小(obj.r,1);%在更新批评家参数之前,请等待N步N=对象估计数;h1=计算平方基(x,u,num);h2=计算平方基(dx,-obj.K*dx,num);H=h1——物体伽马*h2;如果对象计数器<=N对象计数器(对象计数器)=y;对象HBuffer(对象计数器,:)=H;对象计数器=对象计数器+1;其他的%基于批处理更新批评家参数%经验H_buf=obj.HBuffer;y_buf=obj.YBuffer;θ=(H_buf'*H_buf)\H_buf'*y_buf;obj.Critic=setLearnableParameters(obj.Critic,{theta});%根据新的临界参数推导出新的增益矩阵obj.k = getnewk(obj);重置经验缓冲区obj.counter = 1;obj.ybuffer = zeros(n,1);obj.hbuffer = zeros(n,0.5 * num *(num + 1));obj.kupdate = obj.kupdate + 1;obj.kbuffer {obj.kupdate} = obj.k;终止找到并返回一个带有探索的动作action=getActionWithExploration(obj,exp{4});终止
或者,您可以通过指定resetImpl
函数的签名如下obj
是代理对象。使用此功能,您可以在训练前将代理设置为已知或随机条件。
功能重置impl(ob)
此外,您还可以根据需要在自定义代理类中定义任何其他助手函数createCritic
用于创建批评家表示和格特纽克
函数,该函数从经过训练的临界参数导出反馈增益矩阵。
定义自定义代理类后,在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代理.