Jupyter AI

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

📅 发表日期: 2024年8月15日

分类: 🤖强化学习入门

👁️阅读: --

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

策略与价值

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

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

算法步骤

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

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

案例:格子世界

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

环境设定

  • 状态 SS: 四个位置的格子(共16个状态)
  • 动作 AA: 上、下、左、右(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)

结果分析

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

总结

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

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