强化学习-5-Dyna-Q算法
强化学习-5-Dyna-Q算法
FrWalker强化学习的笔记、理解、感悟及代码实现,仅按个人思维进行精华总结和记录,使用的教程:动手学强化学习
相比Q-learning,Dyna-Q算法引入了一个环境模型,与环境进行交互时不仅更新Q值,也会记录交互数据到环境模型中,然后与环境模型进行n次的模拟交互更新Q值(这个步骤称为Q-planning),使用真实数据和和模拟数据一起改进策略。
Dyna-Q算法的主要步骤如下:
随着 Q-planning 步数的增多,Dyna-Q 算法的收敛速度也随之变快,但也受限于环境是否是确定的和环境模型的准确性。
实验
class CliffWalkingEnv:
...
def q_learning(self, s0, a0, r, s1):#s0表示当前状态s,s1表示下一个状态s'
"""计算时序差分误差td_error,更新动作价值函数Q(s,a)"""
td_error = r + self.gamma * self.Q_table[s1].max() - self.Q_table[s0, a0]
self.Q_table[s0, a0] += self.alpha * td_error
def run(self, episodes_num=1000,n_planning=2):
for episode in tqdm(range(episodes_num)):
s = self.env.reset() # 初始化
while True:
# 真实环境交互,q_learning
a = self.take_action(s) # 选取动作
r,s1,done = self.env.step(a)# 环境反馈
self.q_learning(s, a, r, s1) # 更新Q
self.model[(s,a)] = r,s1 # 记录采集的数据
# 模拟环境交互,q_palnning步长为n_planning
for i in range(n_planning):
(s0,a0),(r_,s_) = random.choice(list(self.model.items())) # 随机曾经遇到过的一个数据
self.q_learning(s0, a0, r_, s_)
if done: # 终止状态
break
s = s1 # 更新状态
当n_planning=0时,即不进行Q-planning,算法退化为Q-learning。
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果