Я пытаюсь закодировать Markov-Decision Process (MDP) и столкнулся с некоторой проблемой. Не могли бы вы проверить мой код и выяснить, почему он не работает
Я попытался сделать это с некоторыми небольшими данными, и это работает и дает мне необходимые результаты, которые я считаю правильными. Но моя проблема заключается в обобщении этого кода. Да, я знаю о библиотеке MDP, но мне нужно закодировать эту. Этот код работает, и я хочу получить такой же результат в классе:
import pandas as pd
data = [['3 0', 'UP', 0.6, '3 1', 5, 'YES'], ['3 0', 'UP', 0.4, '3 2', -10, 'YES'], \
['3 0', 'RIGHT', 1, '3 3', 10, 'YES'], ['3 1', 'RIGHT', 1, '3 3', 4, 'NO'], \
['3 2', 'DOWN', 0.6, '3 3', 3, 'NO'], ['3 2', 'DOWN', 0.4, '3 1', 5, 'NO'], \
['3 3', 'RIGHT', 1, 'EXIT', 7, 'NO'], ['EXIT', 'NO', 1, 'EXIT', 0, 'NO']]
df = pd.DataFrame(data, columns = ['Start', 'Action', 'Probability', 'End', 'Reward', 'Policy'], \
dtype = float) #initial matrix
point_3_0, point_3_1, point_3_2, point_3_3, point_EXIT = 0, 0, 0, 0, 0
gamma = 0.9 #it is a discount factor
for i in range(100):
point_3_0 = gamma * max(0.6 * (point_3_1 + 5) + 0.4 * (point_3_2 - 10), point_3_3 + 10)
point_3_1 = gamma * (point_3_3 + 4)
point_3_2 = gamma * (0.6 * (point_3_3 + 3) + 0.4 * (point_3_1 + 5))
point_3_3 = gamma * (point_EXIT + 7)
print(point_3_0, point_3_1, point_3_2, point_3_3, point_EXIT)
Но здесь у меня где-то ошибка и это выглядит слишком сложно? Не могли бы вы помочь мне с этим вопросом?!
gamma = 0.9
class MDP:
def __init__(self, gamma, table):
self.gamma = gamma
self.table = table
def Action(self, state):
return self.table[self.table.Start == state].Action.values
def Probability(self, state):
return self.table[self.table.Start == state].Probability.values
def End(self, state):
return self.table[self.table.Start == state].End.values
def Reward(self, state):
return self.table[self.table.Start == state].Reward.values
def Policy(self, state):
return self.table[self.table.Start == state].Policy.values
mdp = MDP(gamma = gamma, table = df)
def value_iteration():
states = mdp.table.Start.values
actions = mdp.Action
probabilities = mdp.Probability
ends = mdp.End
rewards = mdp.Reward
policies = mdp.Policy
V1 = {s: 0 for s in states}
for i in range(100):
V = V1.copy()
for s in states:
if policies(s) == 'YES':
V1[s] = gamma * max(rewards(s) + [sum([p * V[s1] for (p, s1) \
in zip(probabilities(s), ends(s))][actions(s)==a]) for a in set(actions(s))])
else:
sum(probabilities[s] * ends(s))
return V
value_iteration()
Я ожидаю значения в каждой точке, но получаю: ValueError: Значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all()
if policies(s) == 'YES'
, вы можете заменить его наif (policies(s) == 'YES').any()
илиif (policies(s) == 'YES').all()
в зависимости от ваших потребностей, это происходит потому, чтоpolicies(s)
- это массив (логических значений) - person rotem tal   schedule 23.06.2019