我正在尝试使用Python的一个著名MDP库来实现一个4维赛车问题。
我们有一个赛车在二维赛道上行驶。
当我说4维问题时,我指的是每个状态是(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)]
我构建了一个类,四维MDP类(FourDimMDPClass),它继承自MDP类,并进行了适当的更改(类似于上述链接中的GridMDP类所做的)。
为了现在简化问题,状态转换是确定性的。也就是说,T函数以概率1返回所需的状态(或者如果你撞到墙壁,则返回起始状态)。
我使用提供的value_iteration方法解决了MDP,然后尝试使用best_policy方法获取正确的策略。
我的问题是这样的:不知何故,返回的策略完全是胡说八道。对于所有状态,返回的是一个恒定的动作。这个动作只是动作列表中的第一个动作。当我改变动作列表的顺序时,新的第一个动作总是被返回。
这是在一个非常简单且小的赛道上发生的。
我已经尝试调试了很多很多小时,现在没有任何进展。我尝试查看传递给MDP机制的所有值,它们看起来没问题。
非常感谢您的帮助。
@[隐藏人名]
附注:原始数据:
当前赛道:###### ##&#*# #####& 是起点* 是目标# 表示墙壁(或障碍)& 在 (1,1)* 在 (3,1)状态集合 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)]) 奖励设置 {(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} 字典MDP解决方案 {(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} 字典MDP策略 {(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)} 字典
回答: