我试图用a famous MDP library for python实现一个四维赛车问题。
我们有一辆赛车在二维轨道上。
当我说四维问题时,我的意思是每个状态都是(x,y,vx,vy),意思是:位置(x,y)和速度(vx,vy)。速度为0或1(对于每个轴),因此状态的数量是有限的且很小。
有一个开始状态,和一个或多个目标状态。 当你碰到一堵“墙”时,你会回到最初的状态。
因为我想用尽可能少的步骤来鼓励一个解决方案,每个可通过的块都有一个“-1”奖励,一个墙有一个“无”(就像GridMDP示例一样),而目标是“0”。
作用是二维的(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_迭代方法来解决MDP,然后尝试使用best_policy方法来获得正确的策略。
我的问题是: 不知为什么,退回的政策完全是胡说八道。 所有状态都会返回一个常量操作。此操作只是操作列表中的第一个操作。 当我更改操作列表的顺序时,总是返回新的第一个操作。
这就是在一个非常简单和小的轨道上发生的事情。
我已经试着调试这么多个小时了,但是没有任何进展。 我尝试查看传递给MDP机制的所有值,它们看起来很好。
我们将不胜感激。
亚历克斯
p.S。 原始数据:
^{pr2}$主要功能:
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
去得到州和新州。如果从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
我想我解决了。在
请注意,所有包含负速度的状态都不在设置的状态中,也不在奖励字典中预设。在
这是由于错误的初始化过程造成的。在
相关问题 更多 >
编程相关推荐