下图为机器人在网格世界找金币的示意图。该网格世界一共有8个状态,其中状态6和状态8为死亡区域,状态7为金币区域。机器人的初始位置为网格世界中任意一个状态。机器人从初始状态出发寻找金币。机器人进行一次探索,进入死亡区域或找到金币,本次探测结束。
机器人找到金币的回报为1,进入死亡区域回报为-1,机器人在区域1-5之间转换时,回报为0。
目标是找到一个策略使得机器人不管处在什么状态(1-5)都能找到金币。
在《深入浅出强化学习:原理入门》一书中给出找金币游戏的Gym开发环境代码,grid_mdp.py文件中。如下:https://github.com/gxnk/reinforcement-learning-code
register(
id='GridWorld-v0',
entry_point='gym.envs.classic_control:GridEnv',
max_episode_steps=200,
reward_threshold=100.0,
)
经过以上三步就完成了注册。下⾯通过在Anaconda Prompt终端环境中测试环境效果。代码如下:
python
env = gym.make('GridWorld-v0')
env.reset()
env.render()
一开始报错如下:
>>> env=gym.make('GridWorld-v0')
WARN: Environment 'gym.envs.classic_control.grid_mdp.GridEnv'>' has deprecated methods. Compatibility code invoked.
Traceback (most recent call last):
File "" , line 1, in <module>
File "/home/wx/gym/gym/envs/registration.py", line 163, in make
return registry.make(id)
File "/home/wx/gym/gym/envs/registration.py", line 121, in make
patch_deprecated_methods(env)
File "/home/wx/gym/gym/envs/registration.py", line 181, in patch_deprecated_methods
env.seed = env._seed
AttributeError: 'GridEnv' object has no attribute '_seed'
解决方法先是查看了https://blog.csdn.net/ITealover/article/details/82768589。在grid_mdp.py文件类定义的开头加入_seed函数定义:
def _seed(self, seed=None):
self.np_random, seed = seeding.np_random(seed)
return [seed]
输入env = gym.make(‘GridWorld-v0’)后出现以下警告可以忽略:
WARN: Environment ‘
接着报错如下:
Traceback (most recent call last):
File "" , line 1, in <module>
File "/home/tofugan/gym/gym/core.py", line 275, in render
return self.env.render(mode, **kwargs)
File "/home/tofugan/gym/gym/envs/registration.py", line 187, in render
return env._render(mode, close=False)
AttributeError: 'GridEnv' object has no attribute '_render'
查看https://blog.csdn.net/wx_hu/article/details/79322719得知:“这是由于Python版本的原因,你将grid_mdp.py文件中的reset和step函数定义改为def _step => def step 这种形式就可以了”,亲测有效。
最终运行结果如下: