2015-11-28 82 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)每一個國家從價值函數返回值