在MDP(Markov decision process)环境中使用强化学习方法

此示例显示了如何训练Q-Learning 代理人(Agent)来解决通用Markov决策过程(MDP)环境。
MDP环境看下图:
在这里插入图片描述

  1. 每一个圆圈代表一个状态
  2. 在每一个状态有两个选择(decision):上,下
  3. 代理人从状态1出发
  4. 代理人获得的奖励与图中箭头数字相等
  5. 训练目标是获得最大的累积奖励

matlab代码如下:(已测试通过)

###创建MDP环境
#该环境有8个状态和2个动作(“up”,“down”)
MDP = createMDP(8,["up";"down"]);
#要从上图建模转换,请修改MDP的状态转换矩阵和奖励矩阵。 默认情况下,这些矩阵包含零。 有关创建MDP模型和MDP对象的属性的更多信息,请参见createMDP。
#指定MDP的状态转换和奖励矩阵。 例如,在以下命令中:
#前两行通过采取动作1(“上”)并指定+3的奖励来指定从状态1到状态2的过渡。
#接下来的两行通过采取动作2(“按下”)指定从状态1到状态3的过渡,并为此过渡提供+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;
#同样地,指定其他状态的转换和相应的奖励
% 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.TerminalStates = ["s7";"s8"];
#为该模型创建强化学习MDP环境
env = rlMDPEnv(MDP);
#要指定代理的初始状态始终为状态1,请指定返回初始代理状态的重置功能。 每次训练和模拟开始时都会调用此功能。 创建一个将初始状态设置为1的匿名函数句柄。
env.ResetFcn = @() 1;
#修复随机生成器种子以提高可重复性。
rng(0)

###创建Q-Learning代理人
#要创建Q-Learning代理人,请首先使用MDP环境中的观察和操作规范创建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.DiscountFactor = 1;
agentOpts.EpsilonGreedyExploration.Epsilon = 0.9;
agentOpts.EpsilonGreedyExploration.EpsilonDecay = 0.01;
qAgent = rlQAgent(tableRep,agentOpts);

###训练Q-Learning代理人
##要培训代理,请首先指定训练选项。 对于此示例,使用以下选项:
#训练最多200个剧集,每个剧集最多持续50个时间步。
#当业务代表在30个连续情节中获得的平均累积奖励大于10时,请停止训练。
#有关更多信息,请参见rlTrainingOptions。
trainOpts = rlTrainingOptions;
trainOpts.MaxStepsPerEpisode = 50;
trainOpts.MaxEpisodes = 200;
trainOpts.StopTrainingCriteria = "AverageReward";
trainOpts.StopTrainingValue = 13;
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('genericMDPQAgent.mat','qAgent');
end
#此处设置断点,doTraining = true,可以看到动态训练的过程

###评估Q-Learning结果
#要验证训练结果,请使用sim函数在训练环境中模拟代理人。 代理人成功找到最佳路径,从而获得13点的累积奖励。
Data = sim(qAgent,env);
cumulativeReward = sum(Data.Reward)
#由于折扣系数设置为1,因此受过培训的代理人的Q表中的值与环境的未折现收益匹配。
QTable = getLearnableParameterValues(getCritic(qAgent))
#QTable = 8×2

#    13    12
#     5    10
#    11     9
#     3     2
#     1     9
#     5     1
#     0     0
#     0     0
TrueTableValues = [13,12;5,10;11,9;3,2;1,9;5,1;0,0;0,0]
#TrueTableValues = 8×2

#    13    12
#     5    10
#    11     9
#     3     2
#     1     9
#     5     1
#     0     0
#     0     0

### END

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42188287/article/details/108489678
今日推荐