Python MDP策略

2024-06-01 11:30:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用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

Tags: inself列表newreturn状态actionloc
1条回答
网友
1楼 · 发布于 2024-06-01 11:30:48

我想我解决了。在

请注意,所有包含负速度的状态都不在设置的状态中,也不在奖励字典中预设。在

这是由于错误的初始化过程造成的。在

相关问题 更多 >