强化学习项目rlcode中的策略迭代(Policy Iteration)算法详解
策略迭代算法概述
策略迭代是强化学习中解决马尔可夫决策过程(MDP)的一种经典方法,它通过交替执行策略评估(Policy Evaluation)和策略改进(Policy Improvement)两个步骤来寻找最优策略。本项目实现了一个在网格世界(Grid World)环境中应用的策略迭代算法。
网格世界环境
在分析代码之前,我们需要了解算法运行的环境——网格世界。这是一个3x3的网格环境,其中:
- 每个格子代表一个状态(state)
- 智能体可以执行上、下、左、右四种动作(actions)
- 到达中心格子(2,2)时获得奖励并终止
- 其他移动可能获得即时奖励或惩罚
策略迭代类结构
代码中定义了PolicyIteration类,主要包含以下组件:
- 值函数表(value_table): 存储每个状态的价值估计
- 策略表(policy_table): 存储每个状态下采取各动作的概率分布
- 折扣因子(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
策略改进阶段采用贪心策略,对于每个状态,选择能够获得最大期望回报的动作。这里实现了一个特殊处理:当多个动作具有相同的最大值时,这些动作会被均等概率选择,而不是只选其中一个。
算法执行流程
- 初始化值函数和策略(均匀随机策略)
- 重复以下步骤直到策略收敛:
- 策略评估:基于当前策略更新值函数
- 策略改进:基于更新后的值函数改进策略
- 最终得到最优值函数和最优策略
可视化实现
代码最后部分创建了可视化界面,可以直观地观察策略迭代过程中值函数和策略的变化:
if __name__ == "__main__":
env = Env()
policy_iteration = PolicyIteration(env)
grid_world = GraphicDisplay(policy_iteration)
grid_world.mainloop()
策略迭代的特点
- 收敛性保证:策略迭代算法保证收敛到最优策略
- 效率较高:通常比单纯的值迭代更快收敛
- 两步交替:评估和改进交替进行,直到策略稳定
- 灵活性:可以提前终止策略评估步骤(称为"截断策略迭代")
实际应用中的考虑
- 折扣因子选择:影响智能体对未来奖励的重视程度
- 收敛条件:实际实现中可设置阈值判断收敛
- 大规模问题:对于状态空间大的问题,可能需要使用函数逼近方法
- 探索与利用:初始策略设计影响学习效率
这个实现展示了策略迭代算法的核心思想,适合作为学习强化学习基础概念的教材示例。通过可视化界面,学习者可以直观理解值函数和策略如何逐步更新直至最优。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



