利用MATLAB的强化学习工具箱实现Q-Learning和SARSA算法

在网格世界(Grid World)环境中训练强化学习Agent(代理人)

此示例显示了如何通过训练Q-learning和SARSA代理人来使用强化学习来解决网格世界环境。 有关这些代理的更多信息,请分别参阅Q-Learning代理和SARSA代理。
此网格世界环境具有以下配置和规则:

  • 一个由边界界定的5 x 5网格世界,有4种可能的动作(北= 1,南= 2,东= 3,西= 4)。
  • 代理从单元格[2,1](第二行,第一列)开始。
  • 如果代理人到达单元格[5,5]的最终状态(蓝色),则代理商会获得+10的奖励。
  • 该环境包含从单元格[2,4]到单元格[4,4]的特殊跳转,奖励为+5。
  • 代理被障碍物(黑格)阻塞。
  • 所有其他动作都会导致-1奖励。
    在这里插入图片描述
    matlab代码如下:
    (如下代码是从matlab的官方文档翻译的,经过我的校对,基本没有歧义,代码已实际运行通过!)
###创建网格世界环境
#创建基础的网格世界环境
env = rlPredefinedEnv("BasicGridWorld");
#要指定代理的初始状态始终为[2,1],需指定一个重置函数以返回代理的初始状态。 每次训练和模拟开始时都会调用此功能。 
#状态从位置[1,1]开始编号,并向下计数该列。 因此,创建一个将初始状态设置为2的匿名函数句柄。
env.ResetFcn = @() 2;
#修复随机生成器种子以提高可重复性。
rng(0)

###创建Q-Learning代理人
#要创建Q学习代理,首先使用网格世界环境中的观察和操作规范创建Q表。 将表示的学习率设置为1。
qTable = rlTable(getObservationInfo(env),getActionInfo(env));
tableRep = rlRepresentation(qTable);
tableRep.Options.LearnRate = 1;
#接下来,使用此表表示形式创建Q-Learning代理,配置epsilon-greedy探索。 有关创建Q学习代理的更多信息,请参见rlQAgent和rlQAgentOptions。
agentOpts = rlQAgentOptions;
agentOpts.EpsilonGreedyExploration.Epsilon = .04;
qAgent = rlQAgent(tableRep,agentOpts);

###训练Q-Learning代理人
#要培训代理,请首先指定训练选项。 对于此示例,使用以下选项:
#训练最多200个剧集,每个剧集最多持续50个时间步。
#当业务代表在30个连续情节中获得的平均累积奖励大于10时,请停止训练。
#有关更多信息,请参见rlTrainingOptions。
trainOpts = rlTrainingOptions;
trainOpts.MaxStepsPerEpisode = 50;
trainOpts.MaxEpisodes= 200;
trainOpts.StopTrainingCriteria = "AverageReward";
trainOpts.StopTrainingValue = 11;
trainOpts.ScoreAveragingWindowLength = 30;
#使用train函数训练Q-Learning代理。 这可能需要几分钟才能完成。 为了节省运行本示例的时间,请通过将doTraining设置为false来加载预训练的代理。 
#要自己培训代理,请将doTraining设置为true。
doTraining = false;

if doTraining
    % Train the agent.
    trainingStats = train(qAgent,env,trainOpts);
else
    % Load pretrained agent for the example.
    load('basicGWQAgent.mat','qAgent')
end
#可以通过Episode Manager窗口观看训练的进程,具体看下图。

###评估Q-Learning的结果
#要验证训练结果,请在训练环境中模拟。
#在运行模拟之前,请对环境进行可视化并配置可视化以维护对代理状态的跟踪。
plot(env)
env.Model.Viewer.ShowTrace = true;
env.Model.Viewer.clearTrace;
#在环境中模拟代理人可以使用sim函数
sim(qAgent,env)
#模拟结果见下图

###创建和训练SARSA代理人
#使用与Q-Learning代理相同的Q table表示和epsilon-greedy配置来创建SARSA代理。 有关创建SARSA代理的更多信息,请参见rlSARSAAgent和rlSARSAAgentOptions。
agentOpts = rlSARSAAgentOptions;
agentOpts.EpsilonGreedyExploration.Epsilon = 0.04;
sarsaAgent = rlSARSAAgent(tableRep,agentOpts);

#使用train函数训练SARSA代理。 这可能需要几分钟才能完成。 为了节省运行本示例的时间,请通过将doTraining设置为false来加载预训练的代理。 
#要自己培训代理,请将doTraining设置为true。
doTraining = false;

if doTraining
    % Train the agent.
    trainingStats = train(sarsaAgent,env,trainOpts);
else
    % Load pretrained agent for the example.
    load('basicGWSARSAAgent.mat','sarsaAgent')
end

###评估SARSA的训练结果
plot(env)
env.Model.Viewer.ShowTrace = true;
env.Model.Viewer.clearTrace;
sim(sarsaAgent,env)

###END!

注:平时写习惯了python代码,matlab注释使用的是%。导入matlab文件中用查找-替换命令把#都换成%

使用Q-Learning算法可以看到动态的收敛结果
SARSA算法
最终收敛的结果
注:以上结果在matlab r2019a中完美运行,结果与官方给的效果相似。

猜你喜欢

转载自blog.csdn.net/weixin_42188287/article/details/108469984