Могу ли я применить политику TD к таким средам?Или только такие методы, как DQN и почему?
Я пытаюсь применить оценку политики TD к симуляторам игр Atari в Python в Gym, и я немного новичок в этом.У меня есть этот класс значения:
class V_Class():
""" Class to store the state Value function
V(s) = expected future discounted reward from s onwards (the return Gt)
Stores it as a dictionnary and adds states as encounteded (get method)
Two methods: get and set
"""
def __init__(self):
self.f = {}
def get(self, s):
if(s not in self.f):
self.f[s] = 0
return self.f[s]
def set(self, s, y):
self.f[s] = y
, и у меня есть эта реализация:
env = Environment.Environment("SpaceInvaders-v0")
V = V_Class()
iepisode = 0
while iepisode <= 1:
obs = env.reset()
done = False
SUMREWARD=0
while not done:
print("obs:", obs)
action = env.action_space.sample()
new_obs, reward, done, info = env.step(action)
SUMREWARD+=reward
new_Vs = V.get(obs) + 0.7*(reward + 0.5*V.get(new_obs) - V.get(obs))
V.set(obs,new_Vs)
obs = new_obs
, но я получаю эту ошибку:
TypeError: unhashable type: 'numpy.ndarray' as you can see here:
> TypeError Traceback (most recent call
> last) <ipython-input-12-428939358367> in <module>
> 12 new_obs, reward, done, info = env.step(action)
> 13 SUMREWARD+=reward
> ---> 14 new_Vs = V.get(obs) + 0.7*(reward + 0.5*V.get(new_obs) - V.get(obs))
> 15 V.set(obs,new_Vs)
> 16 obs = new_obs
>
> <ipython-input-4-5d3d077cd162> in get(self, s)
> 9
> 10 def get(self, s):
> ---> 11 if(s not in self.f):
> 12 self.f[s] = 0
> 13 return self.f[s]
>
> TypeError: unhashable type: 'numpy.ndarray'
Поскольку этот класс V былПервоначально сделано для классических сред, где состояния (переменная obs) представляют собой отдельные числа, в то время как окружения Atari имеют большие трехмерные numpy.ndarray
, представляющие состояния.
V класс здесь должен проверить в своем словаре f, имеет ли это состояние уже сохраненное значение, и если не сохранять значение для него на основе формулы:
new_Vs = V.get(obs) + 0.7*(reward + 0.5*V.get(new_obs) - V.get(obs))
Как бы вы предложили мне это исправить?Есть ли процесс, который я не знаю, которому я должен следовать в таких случаях, или мне просто нужно обновить методы V-класса для хранения больших состояний в качестве ключа словаря?