强化学习项目rlcode中的策略迭代(Policy Iteration)算法详解

强化学习项目rlcode中的策略迭代(Policy Iteration)算法详解

策略迭代算法概述

策略迭代是强化学习中解决马尔可夫决策过程(MDP)的一种经典方法,它通过交替执行策略评估(Policy Evaluation)和策略改进(Policy Improvement)两个步骤来寻找最优策略。本项目实现了一个在网格世界(Grid World)环境中应用的策略迭代算法。

网格世界环境

在分析代码之前,我们需要了解算法运行的环境——网格世界。这是一个3x3的网格环境,其中:

  • 每个格子代表一个状态(state)
  • 智能体可以执行上、下、左、右四种动作(actions)
  • 到达中心格子(2,2)时获得奖励并终止
  • 其他移动可能获得即时奖励或惩罚

策略迭代类结构

代码中定义了PolicyIteration类,主要包含以下组件:

  1. 值函数表(value_table): 存储每个状态的价值估计
  2. 策略表(policy_table): 存储每个状态下采取各动作的概率分布
  3. 折扣因子(discount_factor): 通常设为0.9,用于平衡即时奖励和未来奖励

核心算法实现

策略评估(Policy Evaluation)

def policy_evaluation(self):
    next_value_table = [[0.00] * self.env.width for _ in range(self.env.height)]
    
    for state in self.env.get_all_states():
        value = 0.0
        if state == [2, 2]:  # 终端状态
            next_value_table[state[0]][state[1]] = value
            continue
            
        for action in self.env.possible_actions:
            next_state = self.env.state_after_action(state, action)
            reward = self.env.get_reward(state, action)
            next_value = self.get_value(next_state)
            value += (self.get_policy(state)[action] *
                      (reward + self.discount_factor * next_value))
        
        next_value_table[state[0]][state[1]] = round(value, 2)
    
    self.value_table = next_value_table

策略评估阶段使用贝尔曼期望方程(Bellman Expectation Equation)来更新每个状态的价值函数。对于每个状态,它考虑所有可能的动作,并根据当前策略的概率加权计算期望回报。

策略改进(Policy Improvement)

def policy_improvement(self):
    next_policy = self.policy_table
    for state in self.env.get_all_states():
        if state == [2, 2]:
            continue
        value = -99999
        max_index = []
        result = [0.0, 0.0, 0.0, 0.0]  # 初始化策略
        
        for index, action in enumerate(self.env.possible_actions):
            next_state = self.env.state_after_action(state, action)
            reward = self.env.get_reward(state, action)
            next_value = self.get_value(next_state)
            temp = reward + self.discount_factor * next_value
            
            if temp == value:
                max_index.append(index)
            elif temp > value:
                value = temp
                max_index.clear()
                max_index.append(index)
        
        prob = 1 / len(max_index)
        for index in max_index:
            result[index] = prob
        
        next_policy[state[0]][state[1]] = result
    
    self.policy_table = next_policy

策略改进阶段采用贪心策略,对于每个状态,选择能够获得最大期望回报的动作。这里实现了一个特殊处理:当多个动作具有相同的最大值时,这些动作会被均等概率选择,而不是只选其中一个。

算法执行流程

  1. 初始化值函数和策略(均匀随机策略)
  2. 重复以下步骤直到策略收敛:
    • 策略评估:基于当前策略更新值函数
    • 策略改进:基于更新后的值函数改进策略
  3. 最终得到最优值函数和最优策略

可视化实现

代码最后部分创建了可视化界面,可以直观地观察策略迭代过程中值函数和策略的变化:

if __name__ == "__main__":
    env = Env()
    policy_iteration = PolicyIteration(env)
    grid_world = GraphicDisplay(policy_iteration)
    grid_world.mainloop()

策略迭代的特点

  1. 收敛性保证:策略迭代算法保证收敛到最优策略
  2. 效率较高:通常比单纯的值迭代更快收敛
  3. 两步交替:评估和改进交替进行,直到策略稳定
  4. 灵活性:可以提前终止策略评估步骤(称为"截断策略迭代")

实际应用中的考虑

  1. 折扣因子选择:影响智能体对未来奖励的重视程度
  2. 收敛条件:实际实现中可设置阈值判断收敛
  3. 大规模问题:对于状态空间大的问题,可能需要使用函数逼近方法
  4. 探索与利用:初始策略设计影响学习效率

这个实现展示了策略迭代算法的核心思想,适合作为学习强化学习基础概念的教材示例。通过可视化界面,学习者可以直观理解值函数和策略如何逐步更新直至最优。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值