马尔可夫决策过程的转换矩阵必须是随机的吗?

时间:2017-04-27 18:50:36

标签: python dynamic-programming markov-chains stochastic mdptoolbox

我试图使用Value Iteration(通过pymdptoolbox)和NumPy为this diagram中指定的马尔可夫决策过程问题找到最优策略。但是pymdptoolbox说我的转换矩阵"不是随机的"。

是否因为数组有[0,0,0,0]?有些转换是不可能的,例如从状态1到状态3.如果没有零,我如何表示这些不可能的转换?

我的代码:

import mdptoolbox 
import numpy as np

transitions = np.array([
#action1
    [
            [0.2, 0.8, 0, 0], #s1
            [0, 0, 0, 0], #s2
            [0, 0, 0, 0], #s3
            [0, 0, 0.9, 0.1] #s4
    ],

#action2
    [
            [0.2, 0, 0, 0.8], #s1
            [0, 0.2, 0.8, 0], #s2
            [0, 0, 0, 0], #s3
            [0, 0, 0, 0] #s4
    ],

#action3
    [
            [0, 0, 0, 0], #s1
            [0.8, 0.2, 0, 0], #s2
            [0, 0, 0, 1], #s3
            [0, 0, 0, 0] #s4
    ],

#action4
        [
                [0.8, 0, 0, 0.2], #s1
                [0, 0, 0, 0], #s2
                [0, 1, 0, 0], #s3
                [0, 0, 0, 0] #s4
        ]
])

rewards = np.array([
        [0, 0, 0, 0],
        [0, 0, 0, 0],
        [1, 1, 1, 1],
        [0, 0, 0, 0]
        ])

vi = mdptoolbox.mdp.ValueIteration(transitions, rewards, 0.4)

2 个答案:

答案 0 :(得分:3)

问题是您使用了所有0值来表示无法访问的状态。您必须每行的总概率为1。由于状态是无法访问的,因此无论你怎么做 - 将“1”放入第一列,均匀分配值,无论你喜欢什么。当我遇到这个问题时,我只是在主对角线上使用“1”:让不可能状态成为接收器。

答案 1 :(得分:0)

我的回复不足,无法评论回复,但我想扩大Prune的答案。当前正在做一个练习,将mdp工具箱值的迭代结果与我们自己在python中实现算法的结果进行比较。我会说我不太确定您所说的接收器Prune是什么意思,所以我可能会以某种方式重复您的回答,如果这样的话,请编辑/标记要删除的评论都很好。

我基本上遵循了您的建议。但是,我的同学做出了很大的贡献,我认为这确实使它起作用了。基本上,假设您具有三个状态,分别为state1,state2和state3。此外,对于给定的动作,您具有一个转换矩阵,一个3x3,状态1,2,3为行,转换为状态1,2的概率列中的,3(因此,单元[1,2]是从状态1采取行动后转移到状态2的概率。如果您按照Prune的建议对角线全为1,则您有100%的机会无论您处于什么状态,都必须采取行动才能保持状态。

要使它与mdptoolbox一起使用并是随机的,您确实想像Prune所说的那样强制所有行的总和为1。但是,我认为您不能随意选择将“ 1”放入全零的行中的哪一列。我认为,要使程序一致且准确地运行,您需要确保在全零的那一行(即对于状态s)中,您要在单元格中放入一个1,并将其转换回相同的状态(即[s, s] = 1)。这与将其放置在给定行的正确“对角线”位置上基本相同。另外,请确保此操作的奖励(reward [s,s])为0。这实际上是说,如果您在状态s采取了不可能的感兴趣的操作,则您有100%的机会保持在同一状态没有奖励。

虽然我会说我搜索了手册和源代码以尝试找到解决方案(这是手册的link),但我的回答还是很幼稚的。我对发布此答案非常有信心,因为我编码了一个不依赖于完全随机矩阵的值迭代实现,并且获得了与我遵循上述mdptoolbox值迭代方法时所做的相同的最佳策略和值。此外,当我随意选择将“ 1”强制插入列并使矩阵随机时,我没有得到一致的结果,也没有任何一条与该算法的手动实现一致。作为参考,这是我为值迭代所参考的伪代码。如果我做错了某人,叫我出去!

psuedocode for value iteration