Q-Learning强化学习FrozenLake求解
观察下一步选取哪一个动作会带来最大的奖励, 但是在真正要做决定时, 却不一定会选取到那个带来最大奖励的动作, Q-learning 只是估计了一下接下来的动作值
Sarsa
实践派, 说到做到, 在这一步估算的动作也是接下来要做的动作, 在环境中每走一步, 更新一次自己的行为准则
% 强化学习Sarsa
ccc
rng('default');
env=two_dimensional_env(4,4,0.01);
two_dimensional_rl=rl_q_table(env.actions,0.9,0.1,0.9);
% pause(2)
for episode =1:env.max_episodes
env = env.reset();
env.render();
A = two_dimensional_rl.choose_action(env.agent);
while 1
env = env.step(A); % 采取动作获得状态和奖励
A_ = two_dimensional_rl.choose_action(env.observation);
two_dimensional_rl=two_dimensional_rl.learn(env, A, A_); % 更新
two_dimensional_rl.dump();
env.agent=env.observation;
A=A_;
env.render();
if env.done
break
end
end
end
探索环境没有变化,只是在绘图时用
set(0,'CurrentFigure',self.fig)
ax = axes('Parent',self.fig);
代替原先夺取焦点的语句
强化学习方法对象需要改动的是
function obj=learn(obj,env, A, A_)
q_predict_arr = obj.find_line(env.agent);
q_predict = q_predict_arr(A);
if env.done ~= 1
line = obj.find_line(env.observation);
q_target = env.reward + obj.gamma * line(A_); % 没有结束
else
q_target = env.reward; % 一局结束了
end
% 更新QLearning table
table_line = obj.find_line(env.agent);
table_line(A) = table_line(A) + obj.alpha * (q_target - q_predict);
obj.q_table(StrHelper.arr2str(env.agent)) = table_line;
end
相关工具方法在
https://github.com/sickle12138/MatGamer