在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]

在这里插入图片描述