Python MDP策略

时间:2011-12-31 11:36:01

标签: python artificial-intelligence

我正在尝试使用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

1 个答案:

答案 0 :(得分:0)

我想我解决了它。

请注意,包含负速度的所有状态都不会出现在STATES设置中,也不会在REWARD字典中预设。

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