3

编辑:最终修复它。问题底部的解决方案

我想创建一个自定义环境来玩游戏。它通过使用游戏的屏幕抓图作为输入并使用 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
4

0 回答 0