在MDP环境中训练Q learning
- 创建MDP智能体环境
- 创建Q learning智能体
- 训练Q learning智能体
- 验证Q learning结果
此示例显示了如何训练Q学习智能体来解决通用的马尔可夫决策过程(MDP)环境。
这里:
每个圆圈代表一个状态。
在每个状态都有一个决定涨跌的决定。
智能体从状态1开始。
智能体收到等于图表中每个过渡值的奖励。
训练目标是收集最大的累积奖励。
创建MDP智能体环境
创建具有八个状态和两个动作的(“上”和“下”)的MDP模型
MDP = createMDP(8,["up";"down"]);
要从上图建模过渡,请修改MDP的状态过渡矩阵和奖励矩阵。默认情况下,这些矩阵包含零。
指定MDP的状态转换和奖励矩阵。例如,在以下命令中:
1.前两行通过采取操作1(“向上”)指定从状态1到状态2的过渡,并为此过渡提供+3的奖励。
2.接下来的两行通过采取行动2(“按下”)并指定+1的奖励来指定从状态1到状态3的过渡。
MDP.T(1,2,1) = 1;
MDP.R(1,2,1) = 3;
MDP.T(1,3,2) = 1;
MDP.R(1,3,2) = 1;
同样,为图中的其余规则指定状态转换和奖励。
% State 2 transition and reward
MDP.T(2,4,1) = 1;
MDP.R(2,4,1) = 2;
MDP.T(2,5,2) = 1;
MDP.R(2,5,2) = 1;
% State 3 transition and reward
MDP.T(3,5,1) = 1;
MDP.R(3,5,1) = 2;
MDP.T(3,6,2) = 1;
MDP.R(3,6,2) = 4;
% State 4 transition and reward
MDP.T(4,7,1) = 1;
MDP.R(4,7,1) = 3;
MDP.T(4,8,2) = 1;
MDP.R(4,8,2) = 2;
% State 5 transition and reward
MDP.T(5,7,1) = 1;
MDP.R(5,7,1) = 1;
MDP.T(5,8,2) = 1;
MDP.R(5,8,2) = 9;
% State 6 transition and reward
MDP.T(6,7,1) = 1;
MDP.R(6,7,1) = 5;
MDP.T(6,8,2) = 1;
MDP.R(6,8,2) = 1;
% State 7 transition and reward
MDP.T(7,7,1) = 1;
MDP.R(7,7,1) = 0;
MDP.T(7,7,2) = 1;
MDP.R(7,7,2) = 0;
% State 8 transition and reward
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的终端状态。
MDP.TerminalStates = ["s7";"s8"];
为此流程模型创建强化学习MDP环境。
env = rlMDPEnv(MDP);
要指定智能体的初始状态始终为状态1,请指定一个返回初始智能体状态的重置功能。每次训练和模拟开始时都会调用此功能。创建一个将初始状态设置为1的匿名函数句柄。
env.ResetFcn = @() 1;
修复随机生成器种子以提高可重复性。
rng(0)
创建Q learning智能体
要创建Q learning智能体,请首先使用MDP环境中的观察和操作规范创建Q表。将表示的学习率设置为1。
obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);
qTable = rlTable(obsInfo, actInfo);
qRepresentation = rlQValueRepresentation(qTable, obsInfo, actInfo);
qRepresentation.Options.LearnRate = 1;
接下来,使用此表表示形式创建Q学习代理,配置epsilon-greedy探索。
agentOpts = rlQAgentOptions;
agentOpts.DiscountFactor = 1;
agentOpts.EpsilonGreedyExploration.Epsilon = 0.9;
agentOpts.EpsilonGreedyExploration.EpsilonDecay = 0.01;
qAgent = rlQAgent(qRepresentation,agentOpts);
训练Q learning智能体
要训练智能体,请首先指定训练选项。对于此示例,使用以下选项:
训练最多200次,每个剧集最多持续50个时间步。
当智能体在30个连续情节中获得的平均累积奖励大于10时,请停止训练。
trainOpts = rlTrainingOptions;
trainOpts.MaxStepsPerEpisode = 50;
trainOpts.MaxEpisodes = 200;
trainOpts.StopTrainingCriteria = "AverageReward";
trainOpts.StopTrainingValue = 13;
trainOpts.ScoreAveragingWindowLength = 30;
使用train功能训练代理。这可能需要几分钟才能完成。为了节省运行本示例的时间,请通过将设置doTraining为来加载预训练的智能体false。要自己训练智能体,请设置
doTraining为true。
doTraining = false;
if doTraining
% Train the agent.
trainingStats = train(qAgent,env,trainOpts);
else
% Load pretrained agent for the example.
load('genericMDPQAgent.mat','qAgent');
end
验证Q learning结果
要验证训练结果,请使用该sim功能在训练环境中模拟座席。智能体成功找到导致累积奖励的最佳路径13。
Data = sim(qAgent,env);
cumulativeReward = sum(Data.Reward)
累积奖励= 13
由于折扣因子设置为1,受过训练的智能体的Q表中的值与环境的未折现收益匹配。
QTable = getLearnableParameters(getCritic(qAgent));
QTable{1}
TrueTableValues = [13,12;5,10;11,9;3,2;1,9;5,1;0,0;0,0]