2011-12-31 158 views
2

我正試圖使用​​a famous MDP library for python來實現4維跑車問題。Python MDP策略

我們在2維軌道上有一輛賽車。

當我說4維問題時,我的意思是每個STATE都是(x,y,vx,vy),意思是:position(x,y)和SPEED(vx,vy)。 SPEED是0或1(對於每個軸),所以狀態的數量是有限的且很小。

有一個起始狀態和一個或多個目標狀態。 當你點擊「牆」時,你會回到初始狀態。因爲我想盡可能鼓勵一個解決方案,每個可通過的區塊有一個「-1」獎勵,牆有「無」(如GridMDP示例),目標有「0」。

ACTION是二維的(a,b),意思是相應的軸x和軸y的加速度。行動是有限的。該動作列表是有限的,小的是:

[(0, 1), (-1, 0), (-1, 1), (0, -1), (0, 0), (1, -1), (1, 0), (1, 1), (-1, -1)] 

我建了一個類,FourDimMDPClass從MDP類繼承,並進行相應的更改(類同他們在GridMDP類上面所做的鏈接)

爲了讓事情變得容易,狀態轉換是確定性的。意思是,T函數以概率1返回一個期望的狀態(或者如果你碰到牆壁,則返回起始狀態)。

我使用提供的value_iteration方法解決了MDP,然後嘗試使用best_policy方法獲得正確的策略。

我的問題是這樣的: 由於某種原因,返回的策略是完全廢話。 對於所有狀態都有一個常量操作返回。此操作只是操作列表中的第一個操作。 當我更改動作列表的順序時,總是返回新的第一個動作。

這就是發生在一個非常簡單和小的軌道。

我一直在嘗試調試很多小時,現在沒有進展。 我試着看看所有傳遞給MDP機制的值,而且看起來很好。

幫助將不勝感激。

Alex

P.S. 原始數據:

Current track: 
##### 
# # 
#&#*# 
##### 

& is the starting point 
* is the goal 
# means wall (or obstacle) 

& is at (1,1) 
* is at (3,1) 

states set([ 
(1, 1, 0, 1), (3, 2, 1, 0), (3, 1, 0, 1), (2, 2, 1, 1), (1, 1, 1, 0), (3, 2, 0, 1), 
(3, 1, 1, 0), (1, 1, 0, 0), (1, 2, 1, 1), (3, 1, 0, 0), (1, 1, 1, 1), (1, 2, 0, 0), 
(3, 1, 1, 1), (1, 2, 1, 0), (2, 2, 0, 1), (1, 2, 0, 1), (3, 2, 1, 1), (2, 2, 1, 0), 
(3, 2, 0, 0), (2, 2, 0, 0)]) set 


reward { 
(0, 2, 0, 1): None, (2, 2, 1, 1): -1, (0, 3, 0, 0): None, (3, 1, 1, 0): 0, 
(4, 1, 1, 1): None, (0, 3, 1, 0): None, (1, 3, 0, 1): None, (3, 1, 0, 0): 0, 
(1, 1, 1, 1): -1, (1, 2, 0, 0): -1, (3, 0, 0, 1): None, (2, 0, 1, 0): None, 
(4, 2, 1, 1): None, (4, 1, 0, 0): None, (1, 2, 1, 0): -1, (2, 0, 0, 0): None, 
(2, 3, 1, 1): None, (0, 0, 1, 1): None, (3, 3, 0, 1): None, (2, 1, 0, 1): None, 
(4, 1, 1, 0): None, (3, 2, 0, 0): -1, (1, 0, 1, 1): None, (3, 2, 1, 0): -1, 
(0, 2, 1, 0): None, (0, 2, 0, 0): None, (0, 1, 1, 1): None, (0, 3, 0, 1): None, 
(1, 3, 1, 0): None, (3, 1, 1, 1): 0, (4, 0, 1, 0): None, (1, 3, 0, 0): None, 
(2, 2, 0, 1): -1, (1, 2, 0, 1): -1, (4, 2, 0, 1): None, (2, 0, 1, 1): None, 
(2, 3, 0, 0): None, (4, 1, 0, 1): None, (3, 3, 1, 0): None, (2, 3, 1, 0): None, 
(1, 1, 0, 1): -1, (3, 3, 0, 0): None, (3, 0, 1, 1): None, (1, 0, 0, 0): None, 
(3, 2, 0, 1): -1, (4, 3, 0, 0): None, (1, 0, 1, 0): None, (0, 0, 0, 1): None, 
(4, 0, 0, 0): None, (2, 1, 1, 1): None, (0, 2, 1, 1): None, (0, 1, 0, 0): None, 
(4, 3, 1, 0): None, (4, 2, 0, 0): None, (0, 1, 1, 0): None, (4, 0, 0, 1): None, 
(1, 3, 1, 1): None, (4, 3, 1, 1): None, (2, 2, 1, 0): -1, (4, 0, 1, 1): None, 
(2, 2, 0, 0): -1, (0, 3, 1, 1): None, (3, 1, 0, 1): 0, (2, 3, 0, 1): None, 
(1, 1, 1, 0): -1, (3, 3, 1, 1): None, (3, 0, 0, 0): None, (4, 2, 1, 0): None, 
(1, 1, 0, 0): -1, (1, 2, 1, 1): -1, (3, 0, 1, 0): None, (2, 0, 0, 1): None, 
(1, 0, 0, 1): None, (0, 0, 1, 0): None, (2, 1, 0, 0): None, (4, 3, 0, 1): None, 
(0, 0, 0, 0): None, (2, 1, 1, 0): None, (0, 1, 0, 1): None, (3, 2, 1, 1): -1 
} dict 



MDPSolution { 
(1, 1, 0, 1): -4.68559, 
(2, 2, 1, 1): -4.68559, 
(3, 2, 0, 1): -4.68559, 
(3, 1, 1, 0): -3.6855900000000004, 
(3, 1, 0, 0): 0.0, 
(1, 1, 1, 1): -4.68559, 
1, 2, 0, 0): -4.68559, 
(1, 2, 1, 0): -4.68559, 
(2, 2, 1, 0): -4.68559, 
(3, 2, 0, 0): -4.68559, 
(2, 2, 0, 0): -4.68559, 
(3, 2, 1, 0): -4.68559, 
(3, 1, 0, 1): -3.6855900000000004, 
(1, 1, 1, 0): -4.68559, 
(1, 1, 0, 0): -4.68559, 
(1, 2, 1, 1): -4.68559, 
(3, 1, 1, 1): -3.6855900000000004, 
(2, 2, 0, 1): -4.68559, 
(1, 2, 0, 1): -4.68559, 
(3, 2, 1, 1): -4.68559 
} dict 



MDPPolicy { 
(1, 1, 0, 1): (0, 1), 
(3, 2, 1, 0): (0, 1), 
(3, 1, 0, 1): None, 
(2, 2, 1, 1): (0, 1), 
(1, 1, 1, 0): (0, 1), 
(3, 2, 0, 1): (0, 1), 
(3, 1, 1, 0): None, 
(1, 1, 0, 0): (0, 1), 
(1, 2, 1, 1): (0, 1), 
(3, 1, 0, 0): None, 
(1, 1, 1, 1): (0, 1), 
(1, 2, 0, 0): (0, 1), 
(3, 1, 1, 1): None, 
(1, 2, 1, 0): (0, 1), 
(2, 2, 0, 1): (0, 1), 
(1, 2, 0, 1): (0, 1), 
(3, 2, 1, 1): (0, 1), 
(2, 2, 1, 0): (0, 1), 
(3, 2, 0, 0): (0, 1), 
(2, 2, 0, 0): (0, 1) 
} dict 

主要功能:

牛逼獲得一個狀態,一個動作,並返回一個狀態

def T(self, state, action): 

    if (action==None): 
     new_vx = state[2] 
     new_vy = state[3] 
    else: 
     new_vx = state[2]+ action[0] 
     new_vy = state[3]+ action[1] 

    myProbStateList = [] 

    nextState = self.go(state, (state[0]+new_vx,state[1]+new_vy,new_vx,new_vy)) 
    myProbStateList.append((1.0,nextState))  

    return myProbStateList 

去獲取狀態,NEW_STATE。如果從狀態到new_state的路由是合法的,則返回new_state。否則,返回初始狀態。

def go(self,state, new_state): 
    "Return the state that results from trying to going in the new state." 

    #state1 = utils.vector_add(state, acceleration) 

    myInitState = (self.init[0],self.init[1],0,0) 

    old_loc = (state[0],state[1]) 
    new_loc = (new_state[0],new_state[1]) 

    if ((new_state in self.states) & self.track.isFreeWay(old_loc,new_loc) & self.track.in_bounds(new_state[0],new_state[1])): 
     return new_state 
    else: 
     return myInitState 
+0

你需要問一個更具體的問題,我想。無需查看源代碼就很難調試代碼。 – 2011-12-31 12:29:54

+0

嗨保羅,你是對的。我將添加更多信息。 – alex 2011-12-31 13:01:01

+0

順便說一句,我正在使用的庫的代碼可以在[我提到的鏈接](http://aima.cs.berkeley.edu/python/mdp.html)上找到。 – alex 2011-12-31 13:16:32

回答

0

我想我解決了它。

請注意,包含負速度的所有狀態都不存在於STATES設置中,也未預設在REWARD字典中。

這是由於初始化過程出錯。