在网格环境中使用Q-learning and SARSA
案例分析
网格世界环境具有以下配置和规则:
1.网格世界为5 x 5,并由边界界定,有四个可能的动作(北= 1,南= 2,东= 3,西= 4)。
2.智能体从单元格[2,1](第二行,第一列)开始。
3.如果智能体到达单元格[5,5]的最终状态(蓝色),则智能体会获得+10的奖励。
4.环境包含从单元格[2,4]到单元格[4,4]的特殊跳转,奖励为+5。
5.智能体被障碍物(黑格)阻塞。
6.所有其他动作都会导致–1奖励。
创建网格世界环境
创建基本的网格世界环境
env = rlPredefinedEnv("BasicGridWorld");
要指定智能体的初始状态始终为[2,1],请创建一个重置函数,以返回智能体的初始状态的状态号。每次训练和模拟开始时都会调用此功能。从位置[1,1]开始编号。当您向下移动第一列然后在随后的每一列中向下移动时,状态编号会增加。因此,创建一个将初始状态设置为的匿名函数句柄2。
env.ResetFcn = @() 2;
修复随机生成器种子以提高可重复性。
rng(0)
创建Q learning智能体
要创建Q学习智能体,请首先使用网格世界环境中的观察和操作规范创建Q表。将表示的学习率设置为1。
qTable = rlTable(getObservationInfo(env),getActionInfo(env));
qRepresentation = rlQValueRepresentation(qTable,getObservationInfo(env),getActionInfo(env));
qRepresentation.Options.LearnRate = 1;
接下来,使用此表表示创建Q学习智能体,并配置epsilon-greedy探索。
agentOpts = rlQAgentOptions;
agentOpts.EpsilonGreedyExploration.Epsilon = .04;
qAgent = rlQAgent(qRepresentation,agentOpts);
训练Q learning 智能体
要培训智能体,请首先指定培训选项。对于此示例,使用以下选项:
1.训练最多200集。指定每个情节最多持续50个时间步。
2.当代理在30个连续情节中获得的平均累积奖励大于10时,请停止训练。
trainOpts = rlTrainingOptions;
trainOpts.MaxStepsPerEpisode = 50;
trainOpts.MaxEpisodes= 200;
trainOpts.StopTrainingCriteria = "AverageReward";
trainOpts.StopTrainingValue = 11;
trainOpts.ScoreAveragingWindowLength = 30;
使用该train功能训练Q学习智能体。培训可能需要几分钟才能完成。为了节省运行本示例的时间,请通过将设置doTraining为来加载预训练的智能体false。要自己训练智能体,请设置doTraining为true。
doTraining = false;
if doTraining
% Train the agent.
trainingStats = train(qAgent,env,trainOpts);
else
% Load the pretrained agent for the example.
load('basicGWQAgent.mat','qAgent')
end
将打开“情节管理器”窗口,并显示训练进度。
验证Q learning结果
要验证训练结果,请在训练环境中模拟座席。
在运行模拟之前,先对环境进行可视化并配置可视化以保持对智能体状态的跟踪。
plot(env)
env.Model.Viewer.ShowTrace = true;
env.Model.Viewer.clearTrace;
使用该sim功能在环境中模拟代理。
sim(qAgent,env)
代理跟踪显示智能体已成功找到从单元[2,4]到单元[4,4]的跳转。
创建和培训SARSA智能体
要创建SARSA智能体,请使用与Q学习智能体相同的Q table表示和epsilon-greedy配置。
agentOpts = rlSARSAAgentOptions;
agentOpts.EpsilonGreedyExploration.Epsilon = 0.04;
sarsaAgent = rlSARSAAgent(qRepresentation,agentOpts);
使用该train功能训练SARSA智能体。培训可能需要几分钟才能完成。为了节省运行本示例的时间,请通过将设置doTraining为来加载预训练的智能体false。要自己训练智能体,请设置doTraining为true。
doTraining = false;
if doTraining
% Train the agent.
trainingStats = train(sarsaAgent,env,trainOpts);
else
% Load the 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)
SARSA智能体找到与Q学习智能体相同的网格世界解决方案。