强化学习-5-Dyna-Q算法

强化学习的笔记、理解、感悟及代码实现,仅按个人思维进行精华总结和记录,使用的教程:动手学强化学习

相比Q-learning,Dyna-Q算法引入了一个环境模型,与环境进行交互时不仅更新Q值,也会记录交互数据到环境模型中,然后与环境模型进行n次的模拟交互更新Q值(这个步骤称为Q-planning),使用真实数据和和模拟数据一起改进策略。

Dyna-Q算法的主要步骤如下:
alt text

随着 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。