我正試圖使用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
你需要問一個更具體的問題,我想。無需查看源代碼就很難調試代碼。 – 2011-12-31 12:29:54
嗨保羅,你是對的。我將添加更多信息。 – alex 2011-12-31 13:01:01
順便說一句,我正在使用的庫的代碼可以在[我提到的鏈接](http://aima.cs.berkeley.edu/python/mdp.html)上找到。 – alex 2011-12-31 13:16:32