我正在尝试PyBrains迷宫示例
我的设置是:
envmatrix = [[...]]
env = Maze(envmatrix, (1, 8))
task = MDPMazeTask(env)
table = ActionValueTable(states_nr, actions_nr)
table.initialize(0.)
learner = Q()
agent = LearningAgent(table, learner)
experiment = Experiment(task, agent)
for i in range(1000):
experiment.doInteractions(N)
agent.learn()
agent.reset()
右下角(1,8)是吸收状态
我在mdp.py中添加了额外的惩罚状态(1,7):
def getReward(self):
""" compute and return the current reward (i.e. corresponding to the last action performed) """
if self.env.goal == self.env.perseus:
self.env.reset()
reward = 1
elif self.env.perseus == (1,7):
reward = -1000
else:
reward = 0
return reward
现在,我不明白,在每次运行1000次运行和200次互动之后,代理人认为我的惩罚状态是一个好状态(你可以看到方形是白色的)
我希望在最终运行后看到每个州和政策的价值。我怎么做?我发现这一行table.params.reshape(81,4).max(1).reshape(9,9)
返回一些值,但我不确定它们是否对应于值函数的值
答案 0 :(得分:0)
现在我添加了另一个约束 - 让代理总是从相同的位置开始:( 1,1)在maze.py中添加self.initPos = [(1, 1)]
现在我在1000次运行后得到这种行为,每次运行有200次相互作用:
现在哪种方式有意义 - 机器人试图从另一侧围绕墙壁,避开状态(1,7)
所以,我得到了奇怪的结果,因为代理人习惯从随机位置开始,其中也包括惩罚状态
修改强>
另一点是,如果需要随机生成代理,那么请确保它不会在处罚状态下生成
def _freePos(self):
""" produce a list of the free positions. """
res = []
for i, row in enumerate(self.mazeTable):
for j, p in enumerate(row):
if p == False:
if self.punishing_states != None:
if (i, j) not in self.punishing_states:
res.append((i, j))
else:
res.append((i, j))
return res
此外,似乎table.params.reshape(81,4).max(1).reshape(9,9)
从值函数