Должна ли матрица переходов из марковского процесса принятия решений быть стохастической?
Я пытаюсь найти оптимальную политику для задачи процесса принятия решений Маркова, указанной на этой диаграмме, используя Value Iteration (через 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)
1 ответ
Проблема в том, что вы использовали все 0 значений для представления недоступного состояния. Вы должны иметь общую вероятность 1 в каждой строке. Поскольку состояние недоступно, не имеет значения, как вы это сделаете - поместите "1" в первый столбец, распределяйте значения равномерно, в зависимости от ваших предпочтений. Когда я сталкиваюсь с этой проблемой, я просто использую "1" на главной диагонали: пусть невозможное состояние будет стоком.
У меня недостаточно репутации, чтобы прокомментировать ответ, но я хотел бы подробнее рассказать об ответе Prune. В настоящее время выполняю упражнение, сравнивающее результаты итерации значений набора инструментов mdp с результатами нашей собственной реализации алгоритма на python. Я скажу, что я не совсем уверен, что вы имеете в виду под сливом Prune, поэтому я могу в некотором роде повторить ваш ответ и, если да, отредактировать / пометить мой комментарий для удаления все в порядке.
Я в основном следую твоему совету. Однако мой одноклассник внес хороший вклад, который, я думаю, действительно помог. В основном, скажем, у вас есть три состояния: state1, state2 и state 3. Кроме того, у вас есть матрица перехода для данного действия,3x3 с состояниями 1,2,3 в виде строк и вероятностью перехода в состояния 1,2.,3 в столбцах (таким образом, ячейка [1,2] будет означать вероятность перехода в состояние 2 при выполнении действия из состояния 1. Если бы у вас были все 1 на диагонали, как предложил Prune, у вас был бы 100% шанс остаться в состоянии, если вы предприняли действие, независимо от того, в каком состоянии вы находитесь.
Чтобы заставить это работать с mdptoolbox и быть стохастическим, вы хотите, чтобы все строки суммировались до 1, как сказал Прун. Однако я не думаю, что вы можете произвольно выбирать, в какой столбец вы можете поместить "1" в строку со всеми нулями. Я думаю, что для того, чтобы программа работала последовательно и точно, вам необходимо убедиться, что в этой строке всех нулей (т.е. для состояния s) вы помещаете 1 в ячейку, соответствующую переходу обратно в то же состояние (т.е. [s,s] =1). По сути, это было бы то же самое, что поместить его в правильную "диагональную" позицию для данной строки. Кроме того, убедитесь, что вознаграждение за это действие (reward[s,s]) равно 0. По сути, это означает, что если вы предпримете интересное невозможное действие в состоянии s, у вас есть 100% шанс остаться в том же состоянии. без награды.
Этот ответ с моей стороны довольно наивен, хотя я скажу, что просмотрел руководство и исходный код, пытаясь найти решение (вот ссылка на руководство). Я чувствую себя достаточно уверенно в этом ответе, чтобы опубликовать его, потому что я закодировал реализацию итерации значений, которая не зависит от совершенно стохастической матрицы, и получил те же оптимальные политики и значения, которые были у меня, когда я следовал методу, описанному выше для итерации значений mdptoolbox. Более того, когда я произвольно выбирал столбцы, чтобы ввести "1" и сделать матрицу стохастической, я не получил согласованных результатов, и ни один из них не соответствовал ручной реализации алгоритма. Для справки вот псевдо-код, на который я ссылался для итерации значений. Если я делаю что-то не так, меня зовут!