我正在尝试使用a famous MDP library for python实现4维赛车问题。
我们在二维赛道上有一辆赛车。
当我说4维问题时,我的意思是每个STATE是(x,y,vx,vy),意思是:位置(x,y)和SPEED(vx,vy)。 SPEED为0或1(对于每个轴),因此状态数有限且很小。
有一个起始状态,以及一个或多个目标状态。 当你点击“墙”时,你会回到初始状态。
由于我想鼓励尽可能采用几个步骤的解决方案,每个可通过的块都有“-1”奖励,墙有“无”(如GridMDP示例),目标为“0”。 / p>
ACTION是2维(a,b),表示轴x和轴y的加速度。行动有限。动作列表是有限且小的,是:
[(0, 1), (-1, 0), (-1, 1), (0, -1), (0, 0), (1, -1), (1, 0), (1, 1), (-1, -1)]
我构建了一个继承自MDP类的类FourDimMDPClass,并进行了相应的更改(类似于他们在上面链接中的GridMDP类中所做的)
为了使事情变得简单,状态转换是确定性的。意思是,T函数以概率1返回一个所需状态(或者如果你撞到一个墙则返回起始状态)。
我使用提供的value_iteration方法解决了MDP,然后尝试使用best_policy方法获取正确的策略。
我的问题是: 出于某种原因,退回的政策完全是胡说八道。 为所有状态返回一个常量操作。此操作只是操作列表中的第一个操作。 当我更改操作列表的顺序时,将始终返回新的第一个操作。
这是一个非常简单和小的轨道。
我一直在尝试调试这么多个小时,没有任何进展。 我试着查看传递给MDP机制的所有值,看起来很好。
非常感谢帮助。
亚历
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
主要功能:
T获取状态和操作,并返回下一个状态
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
go获取状态和new_state。如果从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 :(得分:0)
我想我解决了它。
请注意,包含负速度的所有状态都不会出现在STATES设置中,也不会在REWARD字典中预设。
这是由于初始化过程错误造成的。