记录一下在自己实现CartPole-v0代码的时候遇到了一些问题。
首先网上的教程代码如下:
import gym
import time
env_name = 'CartPole-v0'
env = gym.make(env_name)
state = env.reset()
done = False
total_reward = 0
while not done:
env.render(render_mode='human')
env.render()
action = env.action_space.sample()
print(action)
observation, reward, done, info= env.step(action)
total_reward += reward
time.sleep(0.2)
print(total_reward)
这里遇到的第一个问题是
env.render(render_mode='human')
这一行报错TypeError: render() got an unexpected keyword argument 'render_mode' 说明更新之后的render()已经没有这个参数了,所以要把这个渲染的方式写在环境的创建当中,也就是将
env = gym.make(env_name)
改为
env = gym.make(env_name,render_mode='human')
重新运行之后报新bug
意思是env.step()返回的参数不再是4个,通过查询可以发现现在的返回是5个,分别是
- observation:执行动作后的新观察(状态)。
- reward:执行该动作获得的即时奖励。
- done:一个布尔值,表示该回合是否结束。如果为
True
,则表示环境已经达到终止状态,智能体需要重置环境以开始新的回合。 - info:一个字典,包含有关执行动作后环境状态的额外信息,这些信息可能对调试或分析有帮助。
- observation(重复):这是 Gym 0.21.0 版本引入的一个变化,它返回了与第一个返回值相同的观察值。这个重复的观察值是为了与旧版本的 Gym 兼容,因为在旧版本中,
env.step()
只返回四个值
这里我们可以看到只有前面四个是我们需要的,所以可以将
observation, reward, done, info = env.step(action)
改为
observation, reward, done, info, _ = env.step(action)
其中下划线 _ 的意思是不关心这个返回值。更改后的代码是
import gym
import time
env_name = 'CartPole-v0'
env = gym.make(env_name,render_mode='human')
state = env.reset()
done = False
total_reward = 0
while not done:
# env.render(render_mode='human')
env.render()
action = env.action_space.sample()
print(action)
observation, reward, done, info, _ = env.step(action)
total_reward += reward
time.sleep(0.2)
print(total_reward)
最后运行结果正确