如何仅在测试阶段渲染Gym环境而训练阶段不渲染?
解决Gym环境仅测试阶段渲染的问题
有两种可靠的实现方式,推荐第一种:
方式1:创建两个独立环境(推荐)
训练阶段使用无渲染模式的环境,测试阶段单独初始化带render_mode='human'的环境,完全隔离训练和测试的渲染逻辑:
import gymnasium as gym import numpy as np # 训练用环境:不指定render_mode,无渲染 train_env = gym.make('FrozenLake-v1') # 初始化Q表 Q = np.zeros([train_env.observation_space.n, train_env.action_space.n]) print(Q) # 参数设置 lr = 0.8 gamma = 0.95 num_episodes = 2000 # 训练循环 for i in range(num_episodes): state = train_env.reset()[0] done = False while not done: # epsilon-greedy策略 if np.random.uniform(0, 1) < 0.5: action = train_env.action_space.sample() else: action = np.argmax(Q[state,:]) next_state, reward, done, _, _ = train_env.step(action) Q[state, action] = (1 - lr) * Q[state, action] + \ lr * (reward + gamma * np.max(Q[next_state, :])) state = next_state print(Q) # 测试用环境:指定render_mode='human',仅测试时渲染 test_env = gym.make('FrozenLake-v1', render_mode='human') state = test_env.reset()[0] done = False while not done: action = np.argmax(Q[state, :]) next_state, reward, done, _, _ = test_env.step(action) state = next_state test_env.render() # 关闭测试环境释放资源 test_env.close()
方式2:动态切换渲染模式(进阶)
如果不想创建两个环境,可以通过修改环境的render_mode属性实现,但需注意部分环境可能不支持动态修改:
import gymnasium as gym import numpy as np # 初始化环境时先不指定render_mode env = gym.make('FrozenLake-v1') # 训练逻辑和原代码一致,此处省略... # 测试前修改render_mode为'human',并重置环境使修改生效 env.render_mode = 'human' state = env.reset()[0] done = False while not done: action = np.argmax(Q[state, :]) next_state, reward, done, _, _ = env.step(action) state = next_state env.render() env.close()
关键说明
- 方式1的优势是完全分离训练和测试环境,避免潜在的状态干扰,稳定性更高。
- 测试完成后必须调用
close()方法关闭渲染窗口,避免资源占用。
内容的提问来源于stack exchange,提问作者zhixin
相关产品推荐
相关产品推荐

