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

实现DDPG时,如何用Gym.Spaces.Box定义自定义Gym环境的观测空间?

自定义DDPG环境观测空间的正确实现方法

首先明确:你的状态包含4个部分——K×M的gk和rk矩阵,以及M维的Theta和v数组。神经网络需要统一的一维输入,所以必须把所有状态元素展平后拼接成一维数组,再基于这个总维度定义spaces.Box。

步骤1:计算状态总维度

总维度 = 2×K×M(gk和rk的元素数) + 2×M(Theta和v的元素数)= 2×M×(K+1)

步骤2:匹配各状态元素的取值范围

不要统一用low=0, high=1,必须对应论文中每个变量的实际取值区间:

  • 比如gk/rk如果是归一化后的权重,范围可能是[0,1]
  • Theta如果是相位角,范围可能是[-π, π]
  • v如果是速度类变量,可能有正负区间(比如[-10,10])

步骤3:代码实现示例

import numpy as np
from gym import spaces

# 替换成你论文中的K和M值
K = 3
M = 4

# 计算总状态维度
total_dim = 2 * K * M + 2 * M

# 分别定义各状态部分的取值范围
# gk和rk的low/high
gk_rk_low = np.zeros(2 * K * M)
gk_rk_high = np.ones(2 * K * M)
# Theta的low/high(假设是相位)
theta_low = -np.pi * np.ones(M)
theta_high = np.pi * np.ones(M)
# v的low/high(假设是速度)
v_low = -15 * np.ones(M)
v_high = 15 * np.ones(M)

# 拼接成一维的low和high数组
obs_low = np.concatenate([gk_rk_low, theta_low, v_low])
obs_high = np.concatenate([gk_rk_high, theta_high, v_high])

# 定义观测空间(优先用float32,避免float16的精度损失)
observation_space = spaces.Box(low=obs_low, high=obs_high, dtype=np.float32)

步骤4:环境中生成观测的方法

在reset()或step()方法中,要把所有状态变量展平后拼接成一维数组返回:

def reset(self):
    # 初始化各状态变量(示例,按论文逻辑替换)
    gk = np.random.uniform(0, 1, size=(K, M))
    rk = np.random.uniform(0, 1, size=(K, M))
    Theta = np.random.uniform(-np.pi, np.pi, size=M)
    v = np.random.uniform(-15, 15, size=M)
    
    # 展平并拼接成观测数组
    obs = np.concatenate([gk.flatten(), rk.flatten(), Theta.flatten(), v.flatten()])
    return obs

关键注意点

  • 展平的必要性:神经网络输入层通常接受一维张量(批量输入为二维(batch_size, dim)),多维矩阵直接输入会导致维度不匹配。
  • dtype选择:np.float16易引发精度丢失,大多数RL框架(如Stable Baselines、PyTorch)默认用float32,建议保持一致。
  • 取值范围准确性:严格对齐论文中各状态变量的物理意义和取值区间,错误的范围会导致网络训练收敛困难。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:20:47