编辑:最终修复它。问题底部的解决方案
我想创建一个自定义环境来玩游戏。它通过使用游戏的屏幕抓图作为输入并使用 DQN 输出跳跃或不跳跃来播放。我尝试了几种创建观察空间的方法,但似乎都没有奏效。全部给我错误:断言观察不是无断言错误。
我创建这样的空间:
def __init__(self):
# Get screen size of monitor 1
user32 = ctypes.windll.user32
screensize = user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)
self.screen = (0, 0) + screensize
# Create spaces
self.action_space = spaces.Discrete(2)
self.observation_space = spaces.Box(np.array([screensize[0], screensize[0], 0]), np.array([screensize[0], screensize[0], 255]), dtype=np.int)
我的步进函数如下所示:
def step(self, action):
# Take action
self.do_action(action)
# Check if done
if self.done:
return np.array(self.getScreen()), self.reward, self.done, {}
if self.reward <= -1000:
self.done = True
return np.array(self.getScreen()), self.reward, self.done, {}
# Get reward
self.reward = self.calculate_reward()
return np.array(self.getScreen()), self.reward, self.done, {}
有没有为 1920x1080 图像制作观察空间的好方法?它不会改变大小。抱歉,如果我第一次在 stackoverflow 上提出这个问题,并且我对批评/提示持开放态度,那么这个问题的表述很糟糕。
编辑:我设法让盒子变成与代表我的图像的 numpy 数组相同的形状:
self.observation_space = spaces.Box(np.array([[[0, 0, 0] for j in range(1920)] for i in range(1080)]), np.array([[[1, 1, 1] for j in range(1920)] for i in range(1080)]), dtype=np.float)
但我仍然得到错误:断言观察不是无 AssertionError。
编辑2:显然观察空间根本不是问题,而是重置功能。重置游戏后我忘记返回观察结果。现在我将游戏的屏幕抓图作为标准化的 numpy 数组返回。
observation = np.array(self.getScreen())/255
return observation