这个例子展示了如何训练q -学习代理来解决一般的马尔可夫决策过程(MDP)环境。有关这些代理的更多信息,请参见q学习的代理.
MDP环境有如下图。
在这里:
每个圆代表一种状态。
在每个州都有一个上升或下降的决定。
代理从状态1开始。
代理将收到与图中每个转换值相等的奖励。
训练的目标是收集最大的累积奖励。
创建一个包含八个状态和两个动作(“up”和“down”)的MDP模型。
MDP = createMDP (8,《飞屋环游记》;“向下”]);
为了从上面的图中建模转换,修改MDP的状态转换矩阵和奖励矩阵。默认情况下,这些矩阵包含零。有关创建MDP模型和MDP对象的属性的更多信息,请参见createMDP
.
为MDP指定状态转移和奖励矩阵。以以下命令为例:
前两行通过采取行动指定从状态1到状态2的转换1
(“上”),奖励+3。
接下来的两行通过执行操作指定从状态1到状态3的转换2
(“下”)和奖励+1为这个过渡。
MDP.T(1、2、1)= 1;MDP.R(1、2、1)= 3;MDP.T(1、3、2)= 1;MDP.R(1、3、2)= 1;
类似地,为图中其余规则指定状态转换和奖励。
状态2过渡和奖励MDP.T(2、4、1)= 1;MDP.R(2、4、1)= 2;MDP.T(2、5、2)= 1;MDP.R(2、5、2)= 1;状态3转换和奖励MDP.T(3、5、1)= 1;MDP.R(3、5、1)= 2;MDP.T(3、6、2)= 1;MDP.R(3、6、2)= 4;状态4转换和奖励MDP.T(4、7、1)= 1;MDP.R(4、7、1)= 3;MDP.T(4、8、2)= 1;MDP.R (4 8 2) = 2;状态5转换和奖励MDP.T(5、7、1)= 1;MDP.R(5、7、1)= 1;MDP.T(5、8、2)= 1;MDP.R (5 8 2) = 9;状态6转换和奖励MDP.T(6、7、1)= 1;MDP.R(6、7、1)= 5;MDP.T (6 8 2) = 1;MDP.R (6 8 2) = 1;状态7过渡和奖励MDP.T(7、7、1)= 1;MDP.R(7、7、1)= 0;MDP.T(7、7、2)= 1;MDP.R(7、7、2)= 0;状态8转换和奖励MDP.T (8 8 1) = 1;MDP.R (8 8 1) = 0;MDP.T (8 8 2) = 1;MDP.R (8 8 2) = 0;
指定的国家“s7”
和“s8”
作为民主党的终点站。
MDP。TerminalStates = [“s7”;“s8”];
为这个过程模型创建强化学习MDP环境。
env = rlMDPEnv (MDP);
要指定代理的初始状态总是状态1,请指定一个返回初始代理状态的reset函数。在每次训练和模拟开始时调用此函数。创建一个匿名函数句柄,将初始状态设置为1。
env。ResetFcn = @() 1;
修复随机生成器种子的再现性。
rng (0)
要创建Q-学习代理,首先使用来自MDP环境的观察和操作规范创建一个Q表。设置表示的学习速率为1
.
obsInfo = getObservationInfo (env);actInfo = getActionInfo (env);qTable = rlTable(obsInfo, actInfo);qRepresentation = rlQValueRepresentation(qTable, obsInfo, actInfo);qRepresentation.Options.LearnRate = 1;
接下来,使用这个表表示创建一个q -学习代理,配置贪婪探索。有关创建q -学习代理的更多信息,请参见rlQAgent
和rlQAgentOptions
.
agentOpts = rlQAgentOptions;agentOpts。DiscountFactor = 1;agentOpts.EpsilonGreedyExploration.Epsilon = 0.9;agentOpts.EpsilonGreedyExploration.EpsilonDecay = 0.01;qAgent = rlQAgent (qRepresentation agentOpts);% #好< NASGU >
要培训代理,首先指定培训选项。对于本例,使用以下选项:
训练最多500集,每集最多持续50个时间步。
当经纪人在30次连续训练中获得超过10次的平均累积奖励时,停止训练。
有关更多信息,请参见rlTrainingOptions
.
trainOpts = rlTrainingOptions;trainOpts。MaxStepsPerEpisode = 50;trainOpts。MaxEpisodes = 500;trainOpts。StopTrainingCriteria =“AverageReward”;trainOpts。StopTrainingValue = 13;trainOpts。ScoreAveragingWindowLength = 30;
训练代理人使用火车
函数。这可能需要几分钟才能完成。为了节省运行此示例的时间,请通过设置加载预先训练过的代理doTraining
来假
.自己训练代理人,设置doTraining
来真正的
.
doTraining = false;如果doTraining培训代理商。env, trainingStats =火车(qAgent trainOpts);% #好< UNRCH >其他的%为示例加载预训练的代理。负载(“genericMDPQAgent.mat”,“qAgent”);结束
为验证训练结果,在训练环境中使用sim卡
函数。agent成功地找到了累积报酬为的最优路径13
.
Data = sim (qAgent env);cumulativeReward =总和(Data.Reward)
cumulativeReward = 13
因为贴现因子被设置为1
,训练agent的Q表中的值与环境的未折现收益相匹配。
QTable = getLearnableParameters (getCritic (qAgent));QTable {1}
ans =8×212.9874 7.0759 -7.6425 9.9990 10.7193 0.9090 5.9128 -2.2466 6.7830 8.9988 7.5928 -5.5053 0 0 0
TrueTableValues =[13日12;5,10,11日9;3、2、1,9;5、1;0,0,0,0)
TrueTableValues =8×213 12 5 10 11 9 3 2 1 9 5 10 0