9 动态规划之策略迭代算法
在本篇中,我们将深入探讨强化学习中的策略迭代算法,这是动态规划的一种重要方法。在上一篇中,我们介绍了值迭代算法,并了解了如何通过计算状态值来优化策略。而在这一篇中,我们将重点关注如何通过“策略迭代”来直接改善策略。
策略与价值
在强化学习中,策略(Policy)是智能体在每个状态下所采取的行动的概率分布。策略可以是“确定性”的,即在某一状态下采取唯一的行动,也可以是“随机”的,即在某一状态下以一定概率随机选择行动。在策略迭代中,我们将交替进行策略评估和策略改进。
- 策略评估:给定一个策略,计算其在当前策略下每个状态的值。
- 策略改进:在评估基础上,通过选择最优的动作来改进该策略。
算法步骤
策略迭代算法的基本步骤如下:
- 初始化策略:随机选择一个初始策略。
- 策略评估:计算当前策略下每个状态的价值函数,直到收敛。
- 策略改进:通过选择使得价值函数最大的行动来改进策略,即 其中 为动作价值函数。
- 重复步骤 2 和 3,直到策略不再改变。
案例:格子世界
假设我们有一个简单的格子世界,智能体在一个 的方格中行动。智能体的目标是从起始点(左上角)到达终点(右下角),在过程中获得奖励。我们设定在每个动作上都有一个的奖励和一个小的惩罚。
环境设定
- 状态 : 四个位置的格子(共16个状态)
- 动作 : 上、下、左、右(4个动作)
- 奖励: 到达终点的奖励 +1,其它状态-0.01
算法实现
下面是策略迭代算法的简单代码实现:
import numpy as np
# 状态和动作定义
grid_size = 4
n_states = grid_size * grid_size
n_actions = 4 # 上、下、左、右
# 奖励设定
rewards = np.full((grid_size, grid_size), -0.01)
rewards[3, 3] = 1 # 终点奖励
# 初始化策略和价值函数
policy = np.zeros((grid_size, grid_size), dtype=int) # 随机初始化策略
V = np.zeros((grid_size, grid_size)) # 状态值初始化
def get_next_state(state, action):
row, col = divmod(state, grid_size)
if action == 0: # 上
row = max(0, row - 1)
elif action == 1: # 下
row = min(grid_size - 1, row + 1)
elif action == 2: # 左
col = max(0, col - 1)
elif action == 3: # 右
col = min(grid_size - 1, col + 1)
return row * grid_size + col
# 策略评估
def policy_evaluation(policy):
while True:
delta = 0
for state in range(n_states):
v = V[state // grid_size, state % grid_size]
action = policy[state // grid_size, state % grid_size]
V[state // grid_size, state % grid_size] = rewards[state // grid_size, state % grid_size] + \
V[get_next_state(state, action) // grid_size, get_next_state(state, action) % grid_size]
delta = max(delta, abs(v - V[state // grid_size, state % grid_size]))
if delta < 1e-4: # 收敛条件
break
# 策略改进
def policy_improvement():
policy_stable = True
for state in range(n_states):
old_action = policy[state // grid_size, state % grid_size]
action_values = np.zeros(n_actions)
for action in range(n_actions):
next_state = get_next_state(state, action)
action_values[action] = rewards[state // grid_size, state % grid_size] + \
V[next_state // grid_size, next_state % grid_size]
policy[state // grid_size, state % grid_size] = np.argmax(action_values)
if old_action != policy[state // grid_size, state % grid_size]:
policy_stable = False
return policy_stable
# 主循环
while True:
policy_evaluation(policy)
if policy_improvement():
break
print("最终策略:")
print(policy)
print("状态值:")
print(V)
结果分析
运行上述代码后,我们可以得到智能体的最终策略和对应的状态值。智能体将会通过策略迭代找到从起始点到达终点的最佳路径。
总结
策略迭代算法通过交替进行策略评估和策略改进,可以有效地找到最优策略。相较于值迭代,策略迭代在许多情况下收敛更快,因为它在每一步都在不断优化 “所有状态”的策略。
在接下来的章节中,我们将继续探讨蒙特卡罗方法的基本原理,进一步丰富我们的强化学习知识体系。通过不同方法的对比与结合,帮助我们更深入地理解强化学习的核心思想。