贝尔曼最优方程实战:如何用Python实现强化学习中的最优策略求解
强化学习作为机器学习的重要分支,其核心目标是通过智能体与环境的交互学习最优策略。贝尔曼最优方程(Bellman Optimality Equation)是这一领域的理论基础,它为我们提供了寻找最优策略的数学框架。本文将带您从零开始,用Python实现贝尔曼最优方程的完整求解过程,包括状态价值函数的迭代计算和最优策略的提取。
1. 贝尔曼最优方程基础回顾
在深入代码实现前,我们需要明确几个关键概念。贝尔曼最优方程描述了最优策略下的价值函数关系,它包含两个核心方程:
-
最优状态价值函数:
V^*(s) = \max_a \sum_{s',r} p(s',r|s,a)[r + \gamma V^*(s')] -
最优动作价值函数:
Q^*(s,a) = \sum_{s',r} p(s',r|s,a)[r + \gamma \max_{a'} Q^*(s',a')]
其中,γ是折扣因子,平衡即时奖励和未来奖励的重要性。这两个方程通过互相迭代,最终收敛到最优解。
提示:在实际应用中,我们通常不知道环境模型p(s',r|s,a),这时需要使用模型无关的强化学习算法,如Q-learning。本文假设我们已知环境动态特性。
2. 环境建模与初始化
我们将以一个简单的网格世界(GridWorld)为例进行实现。这个环境包含:
- 4x4网格(16个状态)
- 4种可能的动作:上、下、左、右
- 特定终止状态(如(3,3)到达目标)
- 每步移动奖励为-1,到达目标奖励+10
import numpy as np
# 环境参数
GRID_SIZE = 4
ACTIONS = ['up', 'down', 'left', 'right']
NUM_STATES = GRID_SIZE * GRID_SIZE
NUM_ACTIONS = len(ACTIONS)
# 初始化价值函数和策略
V = np.zeros(NUM_STATES) # 状态价值函数
Q = np.zeros((NUM_STATES, NUM_ACTIONS)) # 动作价值函数
policy = np.ones((NUM_STATES, NUM_ACTIONS)) / NUM_ACTIONS # 随机策略
# 定义终止状态
TERMINAL_STATE = (3, 3)
terminal_state_idx = TERMINAL_STATE[0] * GRID_SIZE + TERMINAL_STATE[1]
# 折扣因子
GAMMA = 0.9
3. 价值迭代算法实现
价值迭代是求解贝尔曼最优方程的经典方法,它通过反复应用贝尔曼最优算子来逐步改进价值函数估计。
def value_iteration(env, theta=1e-6, max_iterations=1000):
"""
价值迭代算法实现
:param env: 环境对象
:param theta: 收敛阈值
:param max_iterations: 最大迭代次数
:return: 最优价值函数和最优策略
"""
V = np.zeros(NUM_STATES)
V[terminal_state_idx] = 0 #


878

被折叠的 条评论
为什么被折叠?



