这段代码实现了一个用于评估强化学习策略的函数 evaluate_policy
。它的主要功能是运行策略(policy)在指定环境中进行多次 episode 的评估,并返回评估结果(如平均奖励、episode 长度等)。以下是代码的详细解释:
1. 导入模块
-
warnings
: 用于发出警告信息。 -
typing
: 用于类型注解(如Callable
,Dict
,List
,Optional
,Tuple
,Union
)。 -
numpy
: 用于数值计算。 -
gymnasium
: 用于定义和管理强化学习环境。 -
stable_baselines3
: 提供了强化学习算法的实现和工具(如type_aliases
和VecEnv
)。
2. evaluate_policy
函数
这是核心函数,用于评估策略在指定环境中的表现。
参数
-
model
: 实现了predict
方法的策略对象(如 RL 算法或策略)。 -
env
: 评估环境(可以是gym.Env
或VecEnv
)。 -
n_eval_episodes
: 评估的 episode 数量(默认 10)。 -
deterministic
: 是否使用确定性策略(默认True
)。 -
render
: 是否渲染环境(默认False
)。 -
callback
: 回调函数,用于在每个 step 后执行额外的检查。 -
reward_threshold
: 期望的最小平均奖励,如果未达到会抛出错误。 -
return_episode_rewards
: 如果为True
,返回每个 episode 的奖励和长度列表,而不是平均值。 -
warn
: 如果为True
,当环境未包装Monitor
时会发出警告。 -
save_info
: 如果为True
,保存额外的信息(如动作、观察值等)。
返回值
-
如果
return_episode_rewards
为True
,返回:-
episode_rewards
: 每个 episode 的奖励列表。 -
episode_lengths
: 每个 episode 的长度列表。 -
episode_actions
: 每个 episode 的动作数组。 -
episode_obs
: 每个 episode 的观察值数组。 -
time_vec
: 每个 episode 的时间向量。 -
episode_profits
: 每个 episode 的利润数组。 -
episode_violations
: 每个 episode 的违规次数数组。
-
-
否则,返回:
-
mean_reward
: 平均奖励。 -
std_reward
: 奖励的标准差。 -
其他统计信息(如平均动作、观察值等)。
-
3. 函数逻辑
环境检查
-
如果环境不是
VecEnv
,将其包装为DummyVecEnv
。 -
检查环境是否被
Monitor
或VecMonitor
包装。如果没有,发出警告。
初始化变量
-
episode_rewards
: 存储每个 episode 的奖励。 -
episode_lengths
: 存储每个 episode 的长度。 -
episode_profits
: 存储每个 episode 的利润。 -
episode_violations
: 存储每个 episode 的违规次数。 -
episode_actions
: 存储每个 episode 的动作。 -
episode_obs
: 存储每个 episode 的观察值。 -
time_vec
: 存储每个 episode 的时间向量。 -
episode_counts
: 记录每个子环境完成的 episode 数量。 -
episode_count_targets
: 每个子环境需要完成的 episode 数量。
评估过程
-
重置环境:
-
调用
env.reset()
初始化环境。 -
初始化状态和 episode 开始标志。
-
-
运行策略:
-
使用
model.predict
获取动作。 -
执行动作并获取新的观察值、奖励、完成标志和信息。
-
更新当前 episode 的奖励、长度、利润、违规次数、动作和观察值。
-
-
处理 episode 结束:
-
如果 episode 结束,将当前 episode 的结果保存到相应的列表中。
-
重置当前 episode 的奖励和长度。
-
如果启用了
callback
,调用回调函数。
-
-
渲染环境:
-
如果启用了
render
,调用env.render()
渲染环境。
-
-
循环直到完成所有 episode:
-
重复上述过程,直到所有子环境完成指定的 episode 数量。
-
返回结果
-
计算平均奖励和标准差。
-
如果指定了
reward_threshold
,检查平均奖励是否达到阈值。 -
根据
return_episode_rewards
参数返回相应的结果。
4. 代码的核心功能
-
策略评估:
-
在指定环境中运行策略,评估其表现。
-
支持向量化环境(
VecEnv
),可以并行评估多个 episode。
-
-
结果记录:
-
记录每个 episode 的奖励、长度、利润、违规次数、动作和观察值。
-
支持返回详细的 episode 结果或统计信息。
-
-
环境检查:
-
检查环境是否被
Monitor
包装,确保评估结果的准确性。
-
-
回调支持:
-
支持在每个 step 后执行自定义的回调函数。
-
5. 代码的应用场景
-
强化学习训练:
-
在训练过程中定期评估策略,监控其表现。
-
保存评估结果,用于后续分析和可视化。
-
-
策略比较:
-
比较不同策略在同一环境中的表现。
-
根据评估结果选择最佳策略。
-
-
环境调试:
-
检查环境是否正常工作,确保评估结果的准确性。
-
总结
这段代码实现了一个通用的策略评估函数 evaluate_policy
,支持在单环境和向量化环境中评估策略的表现。它可以返回详细的 episode 结果或统计信息,并支持回调函数和环境检查功能。