Я пытаюсь создать игру pacman. Я хочу тренировать Pacman. Я попробовал это с помощью Q обучения.
Мой код:
class Agent(object):
def __init__(self):
self.q = collections.defaultdict(float)
self.epsilon = 0.4 # Exploration rate
self.gamma = 0.99 # Discount factor
def choose(self, s, actions):
p = random.uniform(0, 1)
if p < self.epsilon:
return random.choice(actions)
else:
return self.policy(s, actions)
def policy(self, s, actions):
max_value = max([self.Q(s, a) for a in actions])
max_actions = [a for a in actions if self.Q(s,a) == max_value]
return random.choice(max_actions)
def maxQvalue(self, s, actions):
return max([self.Q(s, a) for a in actions])
def Q(self, s, a):
return self.q[s, a]
def update(self, s, a, newS, r, actions):
self.q[s, a] = r + self.gamma * self.maxQvalue(newS, actions)
def main():
environment = Environment(20,10)
agent = Agent()
environment.initialize()
environment.display()
while not environment.terminal():
s = environment.state()
actions = environment.actions()
a = agent.choose(s, actions)
environment.update(a)
sp = environment.state()
r = environment.reward()
actions = environment.actions()
agent.update(s, a, sp, r, actions)
environment.display()
Класс среды:
class Environment(object):
def actions(self):
#return possible action
def terminal(self):
# returns true if hits ghost or false
def reward(self):
# -200 if hits ghost
# -100 if hits wall
# 10 if hits food
# else 0
def update(self, action):
# update ball with action
# ghost moves in random action
def state(self):
# return ball position
Игра завершается, если вся еда съел или его поразил призрак. В приведенном выше случае у меня только один призрак. Я предполагаю, что игра завершается только после съедения всей еды. Но мой код этого не делает. мяч попадает в призрак, прежде чем съесть всю еду. Я не знаю, что я сделал не так.
И у меня есть еще один вопрос: а что если я хочу тренировать призрака? Сделать это, чтобы поймать мяч. Если мяч контролируется пользователем.