我正在尝试使用这个观察空间运行 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,))
答案 0 :(得分:0)
你不是说 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 观察空间,而应该使用离散观察空间。使用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 空间而不是离散空间仍然是一种延伸。此外,即使使用整数值,以下内容也不起作用:
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,))