2015-11-28 46 views
2

我想出来的PyBrains状态值和全球政策迷宫例如PyBrains Q-Learning迷宫示例。

我的设置是:

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() 

现在,我不是在结果信心,我越来越 enter image description here

右下角(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

现在我添加了另一个约束 - 使代理始终从相同的位置开始:(1,1 )通过添加maze.py self.initPos = [(1, 1)]现在我得到这个行为后,1000个运行具有200个相互作用每次运行:

enter image description here

哪一种有意义了 - 机器人试图绕过去从另一个墙侧,避开状态(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)每一个国家从价值函数返回值