OverflowError, поскольку я пытаюсь использовать алгоритм итерации значения с mdptoolbox - PullRequest
0 голосов
/ 21 ноября 2018

Я установил простое 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 на 1 с 0.5, оно работает нормально.В чем может быть причина того, что итерация значения не работает со значением скидки 0.5 или какими-либо другими десятичными значениями?

Обновление. Похоже, что есть какая-то проблема с моей матрицей вознаграждений.Я не смог написать это так, как задумал.Потому что, если я изменю некоторые значения в матрице вознаграждений, ошибка исчезнет.

1 Ответ

0 голосов
/ 22 ноября 2018

Так что получилось, что матрица наград, которую я определил, была неверной.В соответствии с матрицей вознаграждения, определенной на рисунке выше, он должен иметь тип (S,A), как указано в документации , где каждая строка соответствует состоянию, начиная с S1 до S4, и каждыйстолбец соответствует действию, начиная с A1 до A4.Новая награда Matrice выглядит следующим образом:

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

Это прекрасно работает с этим.Но я все еще не уверен, что происходило внутри, что привело к ошибке переполнения.

...