使用值迭代算法与mdptoolbox时发生OverflowError

2024-09-27 23:18:24 发布

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

我为一个董事会设置了一个简单的MDP,它有4个可能的状态和4个可能的操作。董事会和奖励设置如下所示:

enter image description here

这里S4是目标状态,S2是吸收状态。我已经在代码中定义了转移概率矩阵和奖励矩阵,以获得这个MDP的最优值函数。但是当我运行代码时,我得到一个错误,它说:OverflowError: cannot convert float infinity to integer。我不明白这是为什么。在

import mdptoolbox
import numpy as np

transitions = np.array([
    # action 1 (Right)
    [
        [0.1, 0.7, 0.1, 0.1],
        [0.3, 0.3, 0.3, 0.1],
        [0.1, 0.2, 0.2, 0.5],
        [0.1,  0.1,  0.1,  0.7]
    ],
    # action 2 (Down)
    [
        [0.1, 0.4, 0.4, 0.1],
        [0.3, 0.3, 0.3, 0.1],
        [0.4, 0.1, 0.4, 0.1],
        [0.1,  0.1,  0.1,  0.7]
    ],
    # action 3 (Left)
    [
        [0.4, 0.3, 0.2, 0.1],
        [0.2, 0.2, 0.4, 0.2],
        [0.5, 0.1, 0.3, 0.1],
        [0.1,  0.1,  0.1,  0.7]
    ],
    # action 4 (Top)
    [
        [0.1, 0.4, 0.4, 0.1],
        [0.3, 0.3, 0.3, 0.1],
        [0.4, 0.1, 0.4, 0.1],
        [0.1,  0.1,  0.1,  0.7]
    ]
])

rewards = np.array([
    [-1, -100, -1, 1],
    [-1, -100, -1, 1],
    [-1, -100, -1, 1],
    [1, 1, 1, 1]
])


vi = mdptoolbox.mdp.ValueIteration(transitions, rewards, discount=0.5)
vi.setVerbose()
vi.run()

print("Value function:")
print(vi.V)


print("Policy function")
print(vi.policy)

如果我将discount的值从0.5更改为1,它可以正常工作。值迭代不能使用折扣值0.5或任何其他十进制值,原因可能是什么?在

更新:我的奖励矩阵似乎有问题。我写不出我想写的那样。因为如果我改变奖励矩阵中的一些值,错误就会消失。


Tags: 代码import状态错误np矩阵actionarray
1条回答
网友
1楼 · 发布于 2024-09-27 23:18:24

所以结果是我定义的奖励矩阵是不正确的。根据上图中定义的奖励矩阵,它应该是(S,A)类型,如documentation所示,其中每一行对应于从S1到{}开始的状态,每一列对应于从A1到{}的操作。新的奖励矩阵如下所示:

#(S,A)
rewards = np.array([
    [-1, -1, -1, -1],
    [-100, -100, -100, -100],
    [-1, -1, -1, -1],
    [1, 1, 1, 1]
])

用这个很好。但我仍然不确定,是什么原因导致了溢出错误。在

相关问题 更多 >

    热门问题