做《深入浅出的强化学习》课后习题想自己用gym搭建一个迷宫。
环境成功导入后运行main.py报错:
Traceback (most recent call last):
File "C:/Users/Harold/PycharmProjects/RFL3.5.3/main.py", line 5, in
env.render()
File "C:\Users\Harold.conda\envs\gymlab\lib\site-packages\gym\envs\classic_control\RNLMaze1.py", line 108, in render
if self.viewer is None:
AttributeError: 'RNLMaze1' object has no attribute 'viewer'
附环境的代码:
import gym
import numpy.random
import time
from numpy import random
from gym.envs.classic_control import rendering
class RNLMaze1(gym.Env):
def __int__(self):
self.viewer = None
#状态空间
self.states = [1, 2, 3, 4, 5,
6, 7, 8, 9, 10,
11, 12, 13, 14, 15,
16, 17, 18, 19, 20,
21, 22, 23, 24, 25]
#动作空间,a是一个字符
self.actions = ['n','e','s','w']
#回报函数
self.rewards = dict()
#创建奖励
self.rewards['10_s'] = 10
self.rewards['14_e'] = 10
self.rewards['20_n'] = 10
#状态转移,s是一个数值
self.t = dict()
self.t['1_s'] = 6
self.t['1_e'] = 2
self.t['2_w'] = 1
self.t['2_s'] = 7
self.t['2_e'] = 3
self.t['3_w'] = 2
self.t['3_s'] = 8
self.t['5_s'] = 10
self.t['6_n'] = 1
self.t['6_e'] = 7
self.t['7_w'] = 6
self.t['7_n'] = 2
self.t['7_e'] = 8
self.t['8_w'] = 7
self.t['8_n'] = 3
self.t['8_s'] = 13
self.t['10_n'] = 5
self.t['10_s'] = 15
self.t['13_n'] = 8
self.t['13_e'] = 14
self.t['13_s'] = 18
self.t['14_w'] = 13
self.t['14_e'] = 15
self.t['14_s'] = 19
self.t['16_e'] = 17
self.t['16_s'] = 21
self.t['17_w'] = 16
self.t['17_e'] = 18
self.t['17_s'] = 22
self.t['18_w'] = 17
self.t['18_e'] = 19
self.t['18_n'] = 13
self.t['19_w'] = 18
self.t['19_n'] = 14
self.t['19_e'] = 20
self.t['20_w'] = 19
self.t['20_n'] = 15
self.t['21_n'] = 16
self.t['21_e'] = 22
self.t['22_w'] = 21
self.t['22_n'] = 17
#更新s,反馈r,结束条件
def step(self, action):
#系统当前状态
state = self.state
#组合状态和动作
key = '%d_%s' % (state, action)
#状态转移,下一状态不撞墙则更新,撞墙则不更新
if key in self.t:
next_state = self.t[key]
else:
next_state = state
self.state = next_state
#出口判断
is_terminal = False
#下一状态到达出口,获得10奖励并退出
if key in self.rewards:
r = 10
is_terminal = True
#下一状态未到达出口,获得-1奖励并继续
else:
r = -1
return next_state,r,is_terminal,{}
#将环境设置为初始状态
def reset(self):
wall = [4, 9, 11, 12, 23, 24 ,25]
self.state = numpy.random.random_integers(25)
while self.state in wall:
self.state = numpy.random.random_integers(25)
return self.state
#关闭图形界面
def close(self):
if self.viewer:
self.viewer.close()
self.viewer = None
#绘制图形界面
def render(self, mode='human'):
if self.viewer is None:
self.viewer = rendering.Viewer(1000, 1000)
#画线
for i in range(0, 6):
linei = rendering.Line((100, 300 + 100 * i), (600, 300 + 100 * i))
self.viewer.add_geom(linei)
for i in range(0, 6):
linei = rendering.Line((100 + 100 * i, 300), (100 + 100 * i, 800))
self.viewer.add_geom(linei)
# 画墙
apolygon1 = rendering.make_polygon([(100, 500), (300, 500), (300, 600), (100, 600)], filled=True)
self.viewer.add_geom(apolygon1)
apolygon2 = rendering.make_polygon([(400, 600), (500, 600), (500, 800), (400, 800)], filled=True)
self.viewer.add_geom(apolygon2)
apolygon1 = rendering.make_polygon([(300, 300), (600, 300), (600, 400), (300, 400)], filled=True)
self.viewer.add_geom(apolygon1)
return self.viewer.render(return_rgb_array=mode == 'rgb_array')
我可能不太清楚,但初始化方法应该是__init__吧,应该不是__int吧,所以你可以试一下