9 动态规划之策略迭代算法

在本篇中,我们将深入探讨强化学习中的策略迭代算法,这是动态规划的一种重要方法。在上一篇中,我们介绍了值迭代算法,并了解了如何通过计算状态值来优化策略。而在这一篇中,我们将重点关注如何通过“策略迭代”来直接改善策略。

策略与价值

在强化学习中,策略(Policy)是智能体在每个状态下所采取的行动的概率分布。策略可以是“确定性”的,即在某一状态下采取唯一的行动,也可以是“随机”的,即在某一状态下以一定概率随机选择行动。在策略迭代中,我们将交替进行策略评估和策略改进。

  1. 策略评估:给定一个策略,计算其在当前策略下每个状态的值。
  2. 策略改进:在评估基础上,通过选择最优的动作来改进该策略。

算法步骤

策略迭代算法的基本步骤如下:

  1. 初始化策略:随机选择一个初始策略。
  2. 策略评估:计算当前策略下每个状态的价值函数$V^\pi(s)$,直到收敛。
  3. 策略改进:通过选择使得价值函数最大的行动来改进策略,即
    $$
    \pi_{\text{new}}(s) = \arg\max_a Q(s, a)
    $$
    其中 $Q(s, a)$ 为动作价值函数。
  4. 重复步骤 2 和 3,直到策略不再改变。

案例:格子世界

假设我们有一个简单的格子世界,智能体在一个 $4 \times 4$ 的方格中行动。智能体的目标是从起始点(左上角)到达终点(右下角),在过程中获得奖励。我们设定在每个动作上都有一个$s$的奖励和一个小的惩罚。

环境设定

  • 状态 $S$: 四个位置的格子(共16个状态)
  • 动作 $A$: 上、下、左、右(4个动作)
  • 奖励: 到达终点的奖励 +1,其它状态-0.01

算法实现

下面是策略迭代算法的简单代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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)

结果分析

运行上述代码后,我们可以得到智能体的最终策略和对应的状态值。智能体将会通过策略迭代找到从起始点到达终点的最佳路径。

总结

策略迭代算法通过交替进行策略评估和策略改进,可以有效地找到最优策略。相较于值迭代,策略迭代在许多情况下收敛更快,因为它在每一步都在不断优化 “所有状态”的策略。

在接下来的章节中,我们将继续探讨蒙特卡罗方法的基本原理,进一步丰富我们的强化学习知识体系。通过不同方法的对比与结合,帮助我们更深入地理解强化学习的核心思想。

9 动态规划之策略迭代算法

https://zglg.work/reinforcement-learning-zero/9/

作者

IT教程网(郭震)

发布于

2024-08-15

更新于

2024-08-16

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论