1. 网格世界策略评估与改进概述
在强化学习领域,策略评估与策略改进是构建智能体的核心环节。这个5×5网格世界案例完美展示了如何通过迭代计算找到最优移动策略。网格中分布着6个禁区(橙色)和1个目标点(绿色),智能体可以执行上、下、左、右或原地不动五种动作。每次移动会根据到达的格子类型获得不同奖励:禁区-10、目标+1、其他格子0,越界时则保持原位。
这个案例的价值在于,它用最简明的形式呈现了强化学习的核心思想——通过不断评估当前策略的价值,然后基于价值函数改进策略,最终收敛到最优解。整个过程就像教一个机器人如何在迷宫中找到宝藏,同时避开陷阱。下面我将详细拆解每个环节的实现细节和背后的数学原理。
2. 环境建模与初始化
2.1 网格世界表示
我们使用5×5的NumPy数组表示网格环境,其中:
- 坐标采用1-based索引(左上角为(1,1))
- 禁区位置:[(2,2), (2,3), (3,3), (4,2), (4,4), (5,2)]
- 目标位置:(4,3)
- 奖励矩阵r:禁区对应位置为-10,目标位置为+1,其余为0
python复制n = 5
V0 = np.zeros((n, n)) # 初始价值矩阵
policy0 = np.full((n, n), 4, dtype=int) # 初始策略:全部不动
# 构建奖励矩阵
r = np.zeros((n, n))
forbidden_positions = [(2,2), (2,3), (3,3), (4,2), (4,4), (5,2)]
goal_position = (4,3)
for (ri, ci) in forbidden_positions:
r[ri-1, ci-1] = -10
r[goal_position[0]-1, goal_position[1]-1] = 1
2.2 动作空间定义
智能体可以执行五种基本动作:
- 上移(-1,0)
- 下移(1,0)
- 左移(0,-1)
- 右移(0,1)
- 原地不动(0,0)
动作执行时有边界检查机制:如果移动会导致出界,则自动转为原地不动。这种设计避免了智能体"掉出"网格的情况。
3. 策略评估实现细节
3.1 评估算法原理
策略评估的目标是计算给定策略π下的状态价值函数V(s)。我们使用迭代策略评估算法,其核心公式为:
V_{k+1}(s) = R(s, a) + γ * V_k(s')
其中:
- a = π(s) 是策略指定的动作
- s' 是执行动作后的新状态
- γ=0.9 是折扣因子
- 当不同动作价值相同时,优先选择"原地不动"
3.2 代码实现
python复制def policy_evaluation_fixed_policy(V, policy, r, gamma=0.9, theta=1e-5, max_iter=1000):
n = V.shape[0]
V_new = V.copy()
actions = [(-1,0), (1,0), (0,-1), (0,1), (0,0)] # 五种动作
for it in range(max_iter):
delta = 0
for i in range(n):
for j in range(n):
a_idx = policy[i,j]
di, dj = actions[a_idx]
ni, nj = i+di, j+dj
# 边界检查
if ni<0 or ni>=n or nj<0 or nj>=n:
ni, nj = i, j
v_temp = r[ni,nj] + gamma * V_new[ni,nj]
delta = max(delta, abs(v_temp - V_new[i,j]))
V_new[i,j] = v_temp
if delta < theta: # 收敛判断
break
return V_new
这个函数会不断更新价值矩阵,直到两次迭代间的最大变化小于阈值θ(1e-5)为止。实际运行中通常只需几十次迭代就能收敛。
4. 策略改进过程分析
4.1 改进算法原理
策略改进采用贪心算法,在每个状态选择能使预期回报最大化的动作:
π_new(s) = argmax_a [R(s,a) + γ*V(s')]
当多个动作价值相同时,优先选择"原地不动"(索引4),这使得网格边界显示更直观。
4.2 代码实现
python复制def policy_improvement_fixed_values(V, r, gamma=0.9):
n = V.shape[0]
new_policy = np.zeros((n,n), dtype=int)
actions = [(-1,0), (1,0), (0,-1), (0,1), (0,0)]
for i in range(n):
for j in range(n):
action_values = []
for a_idx, (di,dj) in enumerate(actions):
ni, nj = i+di, j+dj
if ni<0 or ni>=n or nj<0 or nj>=n:
ni, nj = i, j
action_value = r[ni,nj] + gamma * V[ni,nj]
action_values.append(action_value)
# 处理价值相同的情况
max_val = max(action_values)
best_idxs = [idx for idx,val in enumerate(action_values) if val==max_val]
best_action = 4 if 4 in best_idxs else best_idxs[0]
new_policy[i,j] = best_action
return new_policy
这个函数遍历每个格子,计算所有可能动作的预期回报,然后选择最优动作更新策略。
5. 完整迭代流程与可视化
5.1 迭代过程
完整的策略迭代包含评估和改进的交替进行:
python复制policy_curr = policy0
V_curr = V0
iter_n = 1
while True:
iter_n += 1
# 策略评估
V_next = policy_evaluation_fixed_policy(V_curr, policy_curr, r, gamma, theta)
# 策略改进
policy_next = policy_improvement_fixed_values(V_next, r, gamma)
# 收敛判断
if np.array_equal(policy_next, policy_curr):
break
V_curr, policy_curr = V_next, policy_next
在实际运行中,这个过程通常需要3-5次完整迭代就能收敛到最优策略。
5.2 可视化实现
我们使用matplotlib的Table功能来可视化网格状态:
python复制def render_policy_value(V, policy, forbidden=None, goal=None, filename='policy_value_grid.png'):
import matplotlib.pyplot as plt
from matplotlib.table import Table
n = V.shape[0]
fig, ax = plt.subplots(figsize=(8,8))
ax.set_axis_off()
tb = Table(ax, bbox=[0,0,1,1])
actions_symbols = ['↑','↓','←','→','o'] # 动作符号
# 处理禁区与目标坐标
forb0 = set()
if forbidden is not None:
forb0 = {(r-1,c-1) for (r,c) in forbidden}
goal0 = None
if goal is not None:
goal0 = (goal[0]-1, goal[1]-1)
# 绘制每个格子
for i in range(n):
for j in range(n):
cell_text = f"{V[i,j]:.2f}\n{actions_symbols[policy[i,j]]}"
face = 'white'
if (i,j) in forb0:
face = '#FFA500' # 橙色:禁区
elif goal0 is not None and (i,j) == goal0:
face = '#00AA00' # 绿色:目标
tb.add_cell(i, j, 1/n, 1/n, text=cell_text, loc='center', facecolor=face)
ax.add_table(tb)
plt.title('Policy and Value Function')
plt.savefig(filename)
plt.close()
可视化效果显示每个格子的价值估计(数字)和当前策略选择的动作(箭头符号),禁区用橙色标注,目标用绿色标注。
6. 实际运行结果分析
6.1 初始状态
初始策略是所有格子都选择"原地不动"(显示为'o'),价值函数全为0:

6.2 第一次策略评估后
执行一次策略评估后,价值函数开始反映出不同格子的潜在回报:

可以看到目标点附近格子的价值已经出现正向变化,而禁区附近则呈现负值。
6.3 第一次策略改进后
基于新的价值函数进行策略改进后,智能体开始向高价值方向移动:

6.4 最终最优策略
经过几次迭代后,策略不再变化,得到最优解:

最终策略显示:
- 目标点(4,3)附近的格子都指向目标方向
- 禁区周围的格子都尽量远离禁区
- 边界的格子多选择原地不动
- 价值函数准确反映了每个格子的长期回报预期
7. 关键问题与解决方案
7.1 边界处理技巧
在实现中发现,网格边界处的策略选择容易出现"向外指"的箭头,这在实际中是没有意义的。我们的解决方案是:
- 越界时自动转为原地不动
- 当多个动作价值相同时,优先选择"原地不动"
python复制if ni<0 or ni>=n or nj<0 or nj>=n:
ni, nj = i, j # 越界处理
# 并列时优先选择不动(索引4)
best_action = 4 if 4 in best_idxs else best_idxs[0]
7.2 收敛性优化
实践中发现两个加速收敛的技巧:
- 使用前一迭代的价值矩阵V_new(而非V)来计算新价值,这被称为"就地更新"
- 设置合理的折扣因子γ=0.9,过大或过小都会影响收敛速度
7.3 可视化调试建议
当算法出现问题时,建议:
- 打印每次迭代后的策略矩阵,观察变化趋势
- 保存每次迭代的可视化结果,制作成动画观察演变过程
- 检查边界条件和并列处理逻辑是否正确
8. 扩展与应用方向
这个基础框架可以扩展为更复杂的强化学习场景:
- 随机环境:让动作有概率执行失败
- 多目标点:设置多个奖励点,研究策略变化
- 移动障碍物:禁区位置随时间变化
- 部分可观测:智能体只能看到周围局部环境
- 深度学习结合:用神经网络近似价值函数
在实际项目中,类似的策略迭代方法已成功应用于:
- 机器人路径规划
- 游戏AI决策
- 资源调度优化
- 自动驾驶行为决策