You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Stable Baseline3的DDPG实现每回合可复现的环境采样值变更

用Stable Baseline3 DDPG实现可复现的每回合环境采样变更

要实现每回合环境采样值不同且完全可复现,核心是为每个回合分配独立且固定序列的随机种子,结合Stable Baseline3的全局种子控制,就能确保采样过程和训练流程的可复现性。以下是针对能源收集环境的具体实现方案:

1. 改造自定义环境,实现回合级种子管理

在你的能源收集环境中,需要维护一个回合种子计数器,每回合重置时使用当前计数器值作为种子采样能量,然后递增计数器。这样只要起始种子固定,每回合的采样结果就会形成固定序列。

示例代码:自定义能源收集环境

import numpy as np
import gymnasium as gym
from gymnasium import spaces
from stable_baselines3 import DDPG

class EnergyCollectionEnv(gym.Env):
    metadata = {"render_modes": ["human"], "render_fps": 30}

    def __init__(self, render_mode=None):
        super().__init__()
        # 定义动作空间和观测空间(根据你的需求调整)
        self.action_space = spaces.Box(low=0, high=1, shape=(1,), dtype=np.float32)
        self.observation_space = spaces.Box(low=0, high=100, shape=(1,), dtype=np.float32)
        self.render_mode = render_mode
        
        # 关键:初始化回合种子计数器,固定起始值保证可复现
        self.episode_seed = 0
        # 全局种子初始化,统一环境内的随机源
        np.random.seed(42)

    def reset(self, seed=None, options=None):
        super().reset(seed=seed)
        # 为当前回合设置专属种子,确保本回合采样固定
        np.random.seed(self.episode_seed)
        # 采样本回合的能量值(服从正态分布,均值50,标准差10)
        self.current_energy = np.random.normal(loc=50, scale=10)
        # 种子计数器递增,保证下回合使用不同种子
        self.episode_seed += 1
        
        observation = np.array([self.current_energy], dtype=np.float32)
        info = {"sampled_energy": round(self.current_energy, 2)}
        return observation, info

    def step(self, action):
        # 简化的环境逻辑:根据动作计算奖励和状态转移
        energy_consumed = action[0] * self.current_energy
        reward = self.current_energy - energy_consumed  # 奖励为剩余能量
        self.current_energy -= energy_consumed
        
        terminated = self.current_energy <= 0  # 能量耗尽结束回合
        truncated = False
        observation = np.array([self.current_energy], dtype=np.float32)
        info = {"remaining_energy": round(self.current_energy, 2)}
        
        return observation, reward, terminated, truncated, info

2. 结合Stable Baseline3的全局种子控制

除了环境内部的种子管理,还需要为Stable Baseline3的模型和训练流程设置全局种子,避免模型初始化、经验回放等环节的随机操作干扰可复现性。

示例代码:初始化DDPG模型并训练

# 全局种子值,所有随机源都基于此值初始化
GLOBAL_SEED = 42

# 创建环境并设置种子
env = EnergyCollectionEnv()
env.seed(GLOBAL_SEED)

# 初始化DDPG模型,传入全局种子
model = DDPG(
    policy="MlpPolicy",
    env=env,
    verbose=1,
    seed=GLOBAL_SEED
)

# 开始训练
model.learn(total_timesteps=10000)

3. 验证可复现性

只要保持GLOBAL_SEED固定,且环境的episode_seed起始值不变,两次运行完全相同的代码时,每回合采样的能量值、模型训练的权重变化都会完全一致。你可以在reset方法中打印info["sampled_energy"],对比两次运行的输出结果验证。

关键注意事项

  • 不要在训练过程中修改episode_seed的递增逻辑,否则会破坏采样序列的固定性。
  • 如果使用向量环境(VecEnv),需要确保每个子环境的回合种子管理独立且同步,避免采样序列混乱。
  • 所有涉及随机操作的环节(如模型初始化、探索噪声)都要绑定全局种子,确保整个流程无意外随机源。

内容的提问来源于stack exchange,提问作者missou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 22:50:39