1

我正在尝试使用值迭代(通过 pymdptoolbox)和 NumPy找到此图中指定的马尔可夫决策过程问题的最佳策略。但是 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)
4

2 回答 2

5

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

于 2017-04-27T18:53:54.607 回答
0

我没有足够的代表来评论回复,但我想扩展 Prune 的答案。目前正在做一个练习,将 mdp 工具箱值迭代结果与我们自己在 python 中实现的算法进行比较。我会说我不确定你所说的 sink Prune 是什么意思,所以我可能会以某种方式重复你的答案,如果是这样,编辑/标记我的评论以删除一切都很好。

我基本上最终听从了你的建议。然而,我的同学有一个很好的贡献,我认为这确实让它发挥了作用。基本上,假设你有三个状态,state1、state2 和 state 3。此外,你有一个给定动作的转换矩阵,一个 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% 的机会保持在同一状态没有奖励。

这个答案对我来说非常幼稚,尽管我会说我搜索了手册和源代码以试图找到解决方案(这里是手册的链接)。我对发布这个答案有足够的信心,因为我编写了一个不依赖于完美随机矩阵的值迭代实现,并且得到了与我按照上述方法进行 mdptoolbox 值迭代时相同的最优策略和值。此外,当我任意选择列强制输入“1”并使矩阵随机化时,我没有得到一致的结果,也没有任何一个与算法的手动实现一致。作为参考,这里是我为值迭代引用的伪代码。如果我做错了什么,有人叫我出来!

值迭代的伪代码

于 2020-07-26T06:05:16.300 回答