当我尝试将值迭代算法与 mdptoolbox 一起使用时出现 OverflowError
OverflowError as I try to use the value-iteration algorithm with mdptoolbox
我为具有 4 种可能状态和 4 种可能操作的板设置了一个简单的 MDP。董事会和奖励设置如下所示:
这里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
或任何其他小数值的原因可能是什么?
更新:我的奖励矩阵似乎有问题。我无法按照我的预期编写它。因为如果我更改奖励矩阵中的一些值,错误就会消失。
原来我定义的奖励矩阵是错误的。根据上图定义的奖励矩阵,它应该是documentation中给出的(S,A)
类型,其中每一行对应一个从S1
开始到[=13]的状态=],每列对应从 A1
到 A4
的操作。新的奖励矩阵如下所示:
#(S,A)
rewards = np.array([
[-1, -1, -1, -1],
[-100, -100, -100, -100],
[-1, -1, -1, -1],
[1, 1, 1, 1]
])
用这个效果很好。但是我仍然不确定,里面发生了什么导致了溢出错误。
我为具有 4 种可能状态和 4 种可能操作的板设置了一个简单的 MDP。董事会和奖励设置如下所示:
这里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
或任何其他小数值的原因可能是什么?
更新:我的奖励矩阵似乎有问题。我无法按照我的预期编写它。因为如果我更改奖励矩阵中的一些值,错误就会消失。
原来我定义的奖励矩阵是错误的。根据上图定义的奖励矩阵,它应该是documentation中给出的(S,A)
类型,其中每一行对应一个从S1
开始到[=13]的状态=],每列对应从 A1
到 A4
的操作。新的奖励矩阵如下所示:
#(S,A)
rewards = np.array([
[-1, -1, -1, -1],
[-100, -100, -100, -100],
[-1, -1, -1, -1],
[1, 1, 1, 1]
])
用这个效果很好。但是我仍然不确定,里面发生了什么导致了溢出错误。