主要内容

创建自定义强化学习代理

实现自己的自定义强化学习算法,您可以创建一个自定义代理通过创建一个自定义代理类的一个子类。你可以训练并在MATLAB模拟这个代理®和仿真软金宝app件®环境。在MATLAB中创建类的更多信息,请参阅用户定义的类

创建模板类

定义您的自定义代理,首先创建一个类的一个子类rl.agent.CustomAgent类。作为一个例子,这个话题描述了自定义代理培训等方面火车定制等方面代理。作为一个起点为自己的代理,你可以打开和修改这个定制代理类。下载示例文件在本地文件夹和开放的主要生活例子脚本,在MATLAB命令行中,键入以下代码。

openExample (“rl / TrainCustomLQRAgentExample”)

关闭TrainCustomLQRAgentExample.mlx文件并打开LQRCustomAgent.m类文件。

编辑LQRCustomAgent.m

储蓄类自己的工作目录后,您可以删除示例文件和下载他们的本地文件夹。

中定义的类LQRCustomAgent.m下面的类定义,表明代理类名称和相关的抽象代理。

classdefLQRCustomAgent < rl.agent.CustomAgent

定义你的代理,你必须指定以下:

  • 代理的属性

  • 构造函数

  • 评论家估计折现长期奖励(如果需要学习)

  • 一个演员,选择一个行动基于当前观测(如果需要学习)

  • 需要代理的方法

  • 可选代理方法

代理的属性

属性部分的类文件,指定用于创建和培训代理任何必要的参数。这些参数包括:

  • 折现系数折现未来的回报

  • 探索模型的配置参数,比如噪声模型或epsilon-greedy探索

  • 体验使用重播内存缓冲区

  • Mini-batch缓冲区尺寸抽样的经验

  • 在培训数量的措施,展望未来

有关潜在的代理属性的更多信息,请参见选择对象的内置的强化学习工具箱™代理。

rl.Agent.CustomAgent类已经包含了属性代理示例时间(SampleTime)和行动和观测规范(ActionInfoObservationInfo分别)。

自定义等代理定义了以下代理属性。

属性%问R %R%反馈增益K%的折扣因素γ= 0.95%的批评家评论家% K缓冲KBuffer% K的更新数量KUpdate = 1%数估计更新EstimateNum = 10结束属性(访问=私人)计数器= 1 YBuffer HBuffer结束

构造函数

要创建定制代理,您必须定义一个构造函数:

  • 和观测规范定义了行动。创建这些规范的更多信息,请参阅rlNumericSpecrlFiniteSetSpec

  • 创造演员和批评家根据你的训练算法。有关更多信息,请参见创建政策和价值功能

  • 配置代理属性。

  • 调用抽象基类的构造函数。

例如,LQRCustomAgent构造函数定义了连续动作和观测空间和创建一个评论家。的createCritic函数是一个可选的helper函数,定义了评论家。

函数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 =大小(Q, 1) +大小(R, 1);obj。HBuffer = 0 (obj.EstimateNum, 0.5 * num * (num + 1));obj。KBuffer = cell(1,1000); obj.KBuffer{1} = obj.K;结束

演员和评论家

如果你的学习算法使用一个评论家估计长期回报,演员选择一个动作,或者两者都是,你必须将这些代理添加属性。您必须创建这些对象当您创建你的代理;也就是说,在构造函数。创建演员和批评家的更多信息,见创建政策和价值功能

例如,自定义等代理使用一个评论家,存储在它评论家财产,没有演员。评论家创造的实现createCritic辅助函数,它叫的LQRCustomAgent构造函数。

函数评论家= createCritic (obj) nQ =大小(obj.Q, 1);nR =大小(obj.R, 1);n = nQ + nR;的w0 = 0.1 * (0.5 * (n + 1) * n, 1);评论家= rlQValueFunction ({@ (x, u) computeQuadraticBasis (x, u, n), w0},getObservationInfo (obj) getActionInfo (obj));critic.Options。GradientThreshold = 1;结束

在这种情况下,批评是一个rlQValueFunction对象。要创建这个对象,您必须指定一个自定义的基函数的处理,在这种情况下computeQuadraticBasis函数。有关更多信息,请参见火车定制等方面代理

所需的功能

创建一个定制的强化学习代理必须定义以下实现功能。在您自己的代码中调用这些函数,使用包装器方法的抽象基类。例如,电话getActionImpl,使用getAction。包装器方法有相同的输入和输出参数的实现方法。

函数 描述
getActionImpl 选择一个动作通过评估代理政策对于一个给定的观察
getActionWithExplorationImpl 选择一个动作使用代理的探索模式
learnImpl 从当前的经验学习并返回一个动作与探索

在你实现功能,评估你的演员和评论家,您可以使用getValue,getAction,getMaxQValue功能。

  • 评估一个rlValueFunction评论家,你只需要观察的输入,您可以获得当前观察的价值V使用下面的语法。

    V = getValue(评论家,观察);
  • 评估一个rlQValueFunction评论家输入你需要观察和行动,你可以获得当前政府行动的价值使用下面的语法。

    Q = getValue(评论家,(观察、行动));
  • 评估一个rlVectorQValueFunction批评你只需要观察的输入,您可以获得当前观察的价值对所有可能的离散的行为使用以下语法。

    Q = getValue(评论家,观察);
  • 一个离散的行动空间rlQValueFunction评论家,获得最大问政府行动值的函数对所有可能的离散的行为使用以下语法。

    [MaxQ, MaxActionIndex] = getMaxQValue(评论家,观察);
  • 评价一个演员,获得行动一个使用下面的语法。

    一个= getAction(演员、观察);

对于每一种情况下,如果你的演员或评论家使用递归神经网络,网络的功能也可以返回当前值的网络状态后获得相应的网络输出。

getActionImpl函数

getActionImpl功能评估你的代理政策,选择一个行动。这个函数必须有以下签名,obj是代理对象,观察目前的观察,行动是选择的行动。

函数action = getActionImpl (obj,观察)

自定义等代理,你选择一个行动通过应用u= -Kx控制律。

函数action = getActionImpl (obj,观察)%给定系统的当前状态,返回一个行动action = -obj.K *观察{:};结束

getActionWithExplorationImpl函数

getActionWithExplorationImpl函数选择一个行动使用探索模型的代理。使用此函数可以实现epsilon-greedy勘探等算法。这个函数必须有以下签名,obj是代理对象,观察目前的观察,行动是选择的行动。

函数action = getActionWithExplorationImpl (obj,观察)

定制等代理的getActionWithExplorationImpl函数随机白噪声增加一个行动选择使用目前的代理政策。

函数action = getActionWithExplorationImpl (obj,观察)%鉴于目前观察,选择一个行动action = getAction (obj,观察);%添加随机噪声的行动num =大小(obj.R, 1);action =行动+ 0.1 * randn (num, 1);结束

learnImpl函数

learnImpl函数定义了代理如何从当前的经验学习。这个函数实现了自定义学习算法更新代理的政策参数和选择一个行动与探索。这个函数必须有以下签名,obj是代理对象,经验值是当前代理经验,行动是选择的行动。

函数action = learnImpl (obj,经验值)

代理经验是细胞数组exp ={状态、动作、奖励、nextstate结束}

  • 状态是当前观测。

  • 行动是当前的行动。

  • 奖励是当前的奖励。

  • nextState是下一个观测。

  • 结束是一个逻辑标志,指示训练集是完整的。

定制等代理,评论家参数就更新一次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 = computeQuadraticBasis (dx, -obj.K * dx, num);H = h1 - obj。γ* h2;如果obj。计数器< = N obj.YBuffer (obj.Counter) = y;obj.HBuffer (obj.Counter:) = H;obj。Counter = obj。计数器+ 1;其他的%更新基于批评论家参数%的经验H_buf = obj.HBuffer;y_buf = obj.YBuffer;θ= (H_buf ' * H_buf) \ H_buf * y_buf;obj。评论家= setLearnableParameters (obj.Critic{θ});%获得一个新的增益矩阵的基础上,新批评的参数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 = getActionWithExploration (obj, exp {4});结束

可选功能

可选地,您可以定义您的代理是如何重置通过指定的培训resetImpl与下面的函数签名功能,obj是代理对象。使用此功能,您可以设置代理培训之前到一个已知的或随机的条件。

函数resetImpl (ob)

还可以定义其他辅助函数根据需要自定义代理类。例如,定义一个自定义等代理createCritic函数用于创建评论家和getNewK功能,反馈增益矩阵来自评论家训练参数。

创建自定义代理

定义您的自定义代理类之后,MATLAB的工作区中创建一个实例。例如,要创建自定义等代理,定义,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);

验证环境对象后,您可以使用它来训练强化学习代理。例如火车定制等代理,看看火车定制等方面代理

另请参阅

功能

相关的例子

更多关于