用Python实战Model-based强化学习值迭代与策略迭代的代码级对比在强化学习领域理论推导和数学公式固然重要但真正理解算法精髓往往需要亲手实现一遍。本文将以Python代码为载体带你完整实现值迭代和策略迭代算法并通过可视化对比揭示两种经典方法的本质差异。我们将使用Gym库构建测试环境用NumPy实现核心逻辑最终生成直观的策略网格图——整个过程就像在Jupyter Notebook中完成一次算法解剖实验。1. 环境搭建与问题建模我们先定义一个简单的网格世界作为测试环境。这个5x5的方格中智能体需要从任意位置移动到右上角的目标位置奖励1同时避开左下角的陷阱奖励-1。移动方向包括上、下、左、右四个基本动作碰到边界则保持原地。import numpy as np import matplotlib.pyplot as plt from matplotlib import colors class GridWorld: def __init__(self, size5): self.size size self.goal (0, size-1) # 右上角为目标 self.trap (size-1, 0) # 左下角为陷阱 self.actions [up, down, left, right] self.action_effects { up: (-1, 0), down: (1, 0), left: (0, -1), right: (0, 1) } def step(self, state, action): 执行动作返回(新状态, 奖励) if state self.goal or state self.trap: return state, 0 # 终止状态 effect self.action_effects[action] new_state (max(0, min(self.size-1, state[0] effect[0])), max(0, min(self.size-1, state[1] effect[1]))) reward 1 if new_state self.goal else -1 if new_state self.trap else 0 return new_state, reward这个环境的状态转移是确定性的符合Model-based强化学习的基本假设。我们设置折扣因子γ0.9作为未来奖励的衰减系数。2. 值迭代算法实现值迭代的核心思想是直接优化状态价值函数通过贝尔曼最优方程不断更新价值估计直到收敛后再提取最优策略。以下是完整实现def value_iteration(env, gamma0.9, theta1e-6): 值迭代算法实现 V np.zeros((env.size, env.size)) # 初始化价值函数 policy np.empty((env.size, env.size), dtypeobject) while True: delta 0 for i in range(env.size): for j in range(env.size): state (i, j) if state env.goal or state env.trap: continue # 计算每个动作的Q值 q_values [] for action in env.actions: new_state, reward env.step(state, action) q reward gamma * V[new_state] q_values.append(q) # 更新价值函数 new_value max(q_values) delta max(delta, abs(new_value - V[state])) V[state] new_value if delta theta: # 收敛判断 break # 从价值函数提取确定性策略 for i in range(env.size): for j in range(env.size): state (i, j) if state env.goal: policy[i,j] goal elif state env.trap: policy[i,j] trap else: # 选择Q值最大的动作 q_values [] for action in env.actions: new_state, reward env.step(state, action) q reward gamma * V[new_state] q_values.append(q) best_action env.actions[np.argmax(q_values)] policy[i,j] best_action return V, policy关键实现细节使用双重循环遍历所有状态对每个状态计算所有可能动作的Q值取最大Q值更新当前状态价值收敛后选择每个状态下Q值最大的动作构成策略注意值迭代中价值函数的更新公式V(s)←maxₐ[r γV(s)]直接体现了贝尔曼最优方程这是与策略迭代的本质区别。3. 策略迭代算法实现策略迭代采用交替执行策略评估和策略提升的策略直到策略收敛。下面是分步骤实现def policy_evaluation(env, policy, V, gamma0.9, theta1e-6): 策略评估计算给定策略下的价值函数 while True: delta 0 for i in range(env.size): for j in range(env.size): state (i, j) if state env.goal or state env.trap: continue action policy[i,j] new_state, reward env.step(state, action) new_value reward gamma * V[new_state] delta max(delta, abs(new_value - V[state])) V[state] new_value if delta theta: break return V def policy_improvement(env, V, policy, gamma0.9): 策略提升基于当前价值函数改进策略 policy_stable True for i in range(env.size): for j in range(env.size): state (i, j) if state env.goal or state env.trap: continue old_action policy[i,j] # 计算所有动作的Q值 q_values [] for action in env.actions: new_state, reward env.step(state, action) q reward gamma * V[new_state] q_values.append(q) # 选择最优动作 best_action env.actions[np.argmax(q_values)] policy[i,j] best_action if old_action ! best_action: policy_stable False return policy, policy_stable def policy_iteration(env, gamma0.9): 完整的策略迭代算法 # 初始化随机策略 policy np.random.choice(env.actions, size(env.size, env.size)) policy[env.goal] goal policy[env.trap] trap V np.zeros((env.size, env.size)) while True: V policy_evaluation(env, policy, V, gamma) policy, stable policy_improvement(env, V, policy, gamma) if stable: break return V, policy策略迭代的特点策略评估阶段需要完全收敛到当前策略的价值函数策略提升阶段采用贪心策略选择动作整个过程交替进行直到策略不再变化4. 算法对比与可视化分析现在我们将两种算法运行在同一环境中对比它们的收敛过程和最终策略# 运行两种算法 env GridWorld() gamma 0.9 V_vi, policy_vi value_iteration(env, gamma) V_pi, policy_pi policy_iteration(env, gamma) # 可视化价值函数 def plot_values(V, title): fig, ax plt.subplots() im ax.imshow(V, cmapcoolwarm) for i in range(V.shape[0]): for j in range(V.shape[1]): text ax.text(j, i, f{V[i,j]:.1f}, hacenter, vacenter, colorblack) ax.set_title(title) fig.tight_layout() plt.show() plot_values(V_vi, Value Iteration - State Values) plot_values(V_pi, Policy Iteration - State Values) # 可视化策略 def plot_policy(policy, title): action_map {up: ↑, down: ↓, left: ←, right: →, goal: G, trap: X} policy_symbols np.vectorize(action_map.get)(policy) fig, ax plt.subplots() ax.imshow(np.zeros_like(policy, dtypeint), cmapgray) for i in range(policy.shape[0]): for j in range(policy.shape[1]): text ax.text(j, i, policy_symbols[i,j], hacenter, vacenter, colorred, fontsize16, fontweightbold) ax.set_title(title) plt.show() plot_policy(policy_vi, Value Iteration - Optimal Policy) plot_policy(policy_pi, Policy Iteration - Optimal Policy)通过可视化输出我们可以观察到对比维度值迭代策略迭代收敛速度较快直接优化价值函数较慢需策略评估完全收敛计算复杂度每次迭代计算量较大策略评估阶段计算量较大中间过程只有价值函数更新显式维护和更新策略适用场景大状态空间小状态空间实际运行时会发现虽然两种算法的收敛路径不同但最终得到的策略在简单网格世界中通常是相同的。这验证了两种方法在解决MDP问题上的等效性。5. 工程实践中的调优技巧在实现过程中有几个关键点会显著影响算法表现状态转移矩阵的处理# 预计算状态转移矩阵可加速迭代 def build_transition_matrix(env): trans_mat np.zeros((env.size, env.size, len(env.actions), env.size, env.size)) for i in range(env.size): for j in range(env.size): for a_idx, action in enumerate(env.actions): new_state, reward env.step((i,j), action) trans_mat[i,j,a_idx,new_state[0],new_state[1]] 1 return trans_mat收敛性加速技巧值迭代中可以使用Gauss-Seidel更新就地更新价值函数策略迭代中可以采用异步更新策略设置合理的收敛阈值θ平衡精度与速度调试建议打印每次迭代的价值函数变化范数可视化中间策略观察改进过程对边界状态进行特殊检查使用小网格世界验证算法正确性在更复杂的环境中可以考虑以下扩展实现截断策略迭代作为折中方案添加随机动作选择模拟非确定性环境用稀疏矩阵存储大型状态空间并行化状态更新计算