【问题标题】:q table with gym (using box observation space)q 带健身房的桌子(使用盒子观察空间)
【发布时间】:2021-03-31 17:18:15
【问题描述】:

我正在尝试用这个观察空间运行一个 q-learning 算法:

self.observation_space = spaces.Box(low=np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), high=np.array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), dtype=np.flo

当我试图访问 q 表时,像这样:

q_value = q_table[state][action]

我收到此错误:

IndexError: arrays used as indices must be of integer (or boolean) type

所以我的问题是:当我的观察空间使用 space.box 定义时,我应该如何访问 q 表?

如果需要,这就是 q_table 的定义方式(它是我从互联网上获取的代码,试图将其调整为我的项目):

num_box = tuple((env.observation_space.high + np.ones(env.observation_space.shape)).astype(int))
q_table = np.zeros(num_box + (env.action_space.n,))

【问题讨论】:

    标签: python openai-gym q-learning


    【解决方案1】:

    你不是说 q_table 是什么类型。我假设它是一个在OpenAI Gym and Python set up for Q-learning 中定义的numpy 数组:

    action_space_size = env.action_space.n
    state_space_size = env.observation_space.n
    
    q_table = np.zeros((state_space_size, action_space_size))
    

    您收到此错误是因为您没有使用整数索引 numpy 数组的元素。同样,我还没有看到您的代码,但我相信您正在尝试使用元组获取 Q 表的特定行。

    无论如何,在使用 Q-learning 时不应使用 Box 观察空间,而应使用 Discrete 观察空间。使用 Q-learning 时,需要提前知道状态数,才能初始化 Q-table。 盒子空间用于实数值,空间的维数不定义状态数。例如,如果您像这样创建一个 Box 空间:

    spaces.Box(low=0, high=1, shape=(2, 2), dtype=np.float16)
    

    您不会有 4 个状态,但可能是无限状态。参数 low=0 和 high=1 表示 Box 空间中四个变量的最小值和最大值,但在 0 和 1 之间可以有多个值(0.1、0.2 等)。因此,您无法预先估计状态数。

    如果您使用 np.uint8(或任何整数类型)作为 dtype,您可能会计算状态数,但使用 Box 空间而不是 Discrete 空间仍然是一个延伸。此外,即使使用整数值,以下内容也不起作用:

    num_box = tuple((env.observation_space.high + np.ones(env.observation_space.shape)).astype(int))
    q_table = np.zeros(num_box + (env.action_space.n,))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 2022-07-06
      • 1970-01-01
      相关资源
      最近更新 更多