介绍
MDP是Markov decision process马尔科夫决策过程的缩写。本示例在马尔科夫决策过程中训练一个智能体。
问题定义
MDP = createMDP(8,["up";"down"]);
createMDP函数的用法为:
Syntax
8为states的个数;
“up”、“down”为两个可能的动作;
在createMDP中通过.T和.R两个方法构建转移矩阵和奖励矩阵。
其中,为当前状态,
为下一个状态,
为采取的动作。
所以帮助文档中通过以下方法构建系统转移过程及奖惩。
% State 1 transition and reward
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;
通过.TerminalStates定义终止状态
MDP.TerminalStates = ["s7";"s8"];
【疑问:为何能够识别“s7”、“s8”这样的字符串作为第7,8两个状态?】
环境生成及训练
生成环境
env = rlMDPEnv(MDP);
重置初始状态为1;
env.ResetFcn = @() 1;
随机数种子初始化
rng(0)
后续部分程序是标准化的流程
定义Q表
obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);
qTable = rlTable(obsInfo, actInfo);
qRepresentation = rlQValueRepresentation(qTable, obsInfo, actInfo);
qRepresentation.Options.LearnRate = 1;
配置agent参数
agentOpts = rlQAgentOptions;
agentOpts.DiscountFactor = 1;
agentOpts.EpsilonGreedyExploration.Epsilon = 0.9;
agentOpts.EpsilonGreedyExploration.EpsilonDecay = 0.01;
qAgent = rlQAgent(qRepresentation,agentOpts); %#ok<NASGU>
配置training参数
trainOpts = rlTrainingOptions;
trainOpts.MaxStepsPerEpisode = 50;
trainOpts.MaxEpisodes = 500;
trainOpts.StopTrainingCriteria = "AverageReward";
trainOpts.StopTrainingValue = 13;
trainOpts.ScoreAveragingWindowLength = 30;
开始训练
trainingStats = train(qAgent,env,trainOpts);
训练过程如下图所示
结果分析
得到的最优结果是13。
Data = sim(qAgent,env);
cumulativeReward = sum(Data.Reward)
cumulativeReward = 13
帮助文档中给出了如下的训练后的Q表,那最优路径如何查看?
QTable = getLearnableParameters(getCritic(qAgent));
QTable{1}
ans = 8×2 12.9874 7.0759 -7.6425 9.9990 10.7193 0.9090 5.9128 -2.2466 6.7830 8.9988 7.5928 -5.5053 0 0 0 0
Q表用于表示从当前状态转移到后续状态的奖励。上面的QTable{1}翻译到state层面,如下所示。
ans = 8×2 (S1->S2|UP)12.9874 (S1->S3|DOWN) 7.0759 (S2->S4|UP)-7.6425 (S2->S5|DOWN) 9.9990 (S3->S5|UP)10.7193 (S3->S6|DOWN) 0.9090 (S4->S7|UP) 5.9128 (S4->S8|DOWN)-2.2466 (S5->S7|UP) 6.7830 (S5->S8|DOWN) 8.9988 (S6->S7|UP) 7.5928 (S6->S8|DOWN)-5.5053 0 0 0 0
从S1开始,根据 (S1->S2|UP)12.9874 (S1->S3|DOWN) 7.0759,得到优选路径为 (S1->S2|UP),得分3,得分总计3;
从S2开始,根据(S2->S4|UP)-7.6425 (S2->S5|DOWN) 9.9990,得到优选路径为(S2->S5|DOWN) ,得分1,得分总计3+1=4;
从S5开始,根据(S5->S7|UP) 6.7830 (S5->S8|DOWN) 8.9988,得到优选路径为(S5->S8|DOWN),得分9,得分总计3+1+9=13.
得到优选路径为S1->S2->S5->S8。
说明:不知道目前为何没有直接导出优选路径的函数?