首页 > 解决方案 > Tensorflow 环境在 python 中工作,但是当我将它转换为 tf 环境时,step 函数什么也不做

问题描述

我正在尝试使用 tensorflow 和强化学习来连接 4 AI。我为它创建了一个 python 环境,它工作正常,但是当我将它转换为 tensorflow 环境(我必须为 Q-network 工作)时,step 函数什么也不做。

这是我的环境:

class ConnectFour(py_environment.PyEnvironment):
  def __init__(self):
    self._action_spec = array_spec.BoundedArraySpec(
        shape=(), dtype=np.int32, minimum=0, maximum=5, name='action')
    self._observation_spec = array_spec.ArraySpec(
        shape=(1,7,6,3), dtype=np.int32, name='observation')
    self._state = get_empty_board()
    self._episode_ended = False
    self.moves_played = 0
  def action_spec(self):
    return self._action_spec
  def observation_spec(self):
    return self._observation_spec
  def _reset(self):
    self.moves_played = 0
    self._state = get_empty_board()
    self._episode_ended = False
    return ts.restart(np.array([self._state], dtype=np.int32))
  def _step(self, action):
    if self._episode_ended:
      return self.reset()
    
    i = 0
    while i < 7 and self._state[i][action][0] == 1:
      i += 1
    
    if i == 0:
      i += 1
      #return False
    self._state[i - 1][action][0] = 0
    self._state[i - 1][action][1] = 1

    self.moves_played += 1

    res = game_over(self._state)
    if res != 0:
      self._episode_ended = True
      if res == 1:
        return ts.termination(np.array([self._state], dtype=np.int32), 1)
      if res == 2:
        return ts.termination(np.array([self._state], dtype=np.int32), -1)
    
    if self.moves_played >= 42:
      self._episode_ended = True
      return ts.termination(np.array([self._state], dtype=np.int32), 0)
      
    return ts.transition(
        np.array([self._state], dtype=np.int32), reward=0.0, discount=1.0)

我的设置是 7x6 棋盘是一个 3D 数组,棋盘中的每个单元格都是一个向量,表示谁在那里玩过((1,0,0)代表空,(0,1,0)代表玩家 1,(0, 0,1) 对于玩家 2)。

例如,如果我尝试:

train_py_env = ConnectFour()
time_step = train_py_env.reset()
time_step = train_py_env(2)

那么结果是正确的(玩家1在第二列玩)。

但如果我尝试:

train_env = tf_py_environment.TFPyEnvironment(train_py_env)
time_step = train_env.reset()
time_step = train_env(2)

然后程序不会崩溃,电路板已正确初始化但没有任何反应。我尝试过调试,问题似乎是由于某种原因,当环境转换为 tensorflow 环境时,修改self._state(例如self._state[i - 1][action][0] = 0)的行没有做任何事情。

标签: pythontensorflowreinforcement-learningagent

解决方案


推荐阅读