La solución de OpenAI-gym al hecho de que el renderizado no puede aparecer en la ventana del juego y no quieres renderizar durante el entrenamiento y luego renderizar durante las pruebas.

1. La razón por la que render() no puede abrir la ventana del juego

Es posible que el código que utilices no coincida con tu versión de gimnasio
. Según mi prueba actual, la versión 0.23 de gimnasio solo necesita el nombre del juego como parámetro real al inicializar env, y luego llama activamente a render() cuando se requiere renderizado. Renderiza la ventana del juego. Por ejemplo:

env = gym.make("CartPole-v1")
obs = env.reset()
for _ in range(1000):
	env.render()
	obs, reward, done, info = env.step(env.action_space.sample())	# 以action随机抽样为例
	if done:
		break
env.close()

En la versión 0.26 de Gym, debes agregar otro parámetro al inicializar env: render_mode, como por ejemplo:

env = gym.make("CartPole-v1", render_mode="human")

Para parámetros específicos, consulte el documento oficial: https://www.gymlibrary.dev/
Además, debe configurar el parámetro semilla durante el reinicio y también usar tuplas de dos elementos para recibir datos , y el paso debe usar cinco -item tuplas para recibir datos . De lo contrario, se informará un error
. Simplemente imite el tutorial introductorio del documento oficial y escriba así:

import gym
env = gym.make("LunarLander-v2", render_mode="human")
observation, info = env.reset(seed=42)
for _ in range(1000):
   action = policy(observation)  # User-defined policy function
   observation, reward, terminated, truncated, info = env.step(action)

   if terminated or truncated:
      observation, info = env.reset()
env.close()

2. Después de configurar render_mode, llamar a reset() comenzará a renderizar automáticamente

Eche un vistazo al código del método de reinicio de gym0.26, decidirá si renderizar de acuerdo con el parámetro render_mode pasado cuando inicializa env, y no es válido llamar activamente a render en gym0.26
. El juego CartPole es el siguiente:

    def reset(
        self,
        *,
        seed: Optional[int] = None,
        options: Optional[dict] = None,
    ):
        super().reset(seed=seed)
        # Note that if you use custom reset bounds, it may lead to out-of-bound
        # state/observations.
        low, high = utils.maybe_parse_reset_bounds(
            options, -0.05, 0.05  # default low
        )  # default high
        self.state = self.np_random.uniform(low=low, high=high, size=(4,))
        self.steps_beyond_terminated = None

        if self.render_mode == "human":
            self.render()
        return np.array(self.state, dtype=np.float32), {
    
    }

Como puede ver, al final, si render_mode está configurado en "humano", se llamará al método de renderizado.

3. En Gym 0.26, cómo realizar no renderizado durante el entrenamiento, sino renderizado nuevamente durante la prueba.

En la versión 0.23 de Gym, puedes llamar activamente a render para decidir si renderizar o no. En la versión 0.26, puedes renderizar siempre que reinicies, por lo que si configuras render_mode="human" al principio, verás el Todo el proceso de entrenamiento y el entrenamiento del siguiente episodio comenzarán después de que finalice el renderizado de la animación, por lo que el tiempo de entrenamiento será más largo que sin renderizado.

solución:

Al principio, pensé que era suficiente modificar env.render_mode dinámicamente, pero descubrí que después de la inicialización de env, este es un parámetro que no se puede modificar.

Por lo tanto, no puede agregar el parámetro render_mode (o agregar parámetros que no sean humanos) al inicializar env_train para el entrenamiento y luego crear un nuevo entorno como antes al realizar la prueba: env_test

env_test = gym.make("CartPole-v1", render_mode='human')

Simplemente use el nuevo env_test para probar

おすすめ

転載: blog.csdn.net/Jaye_xxx/article/details/129461989