Pacman, используя Q обучения - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь создать игру 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

Игра завершается, если вся еда съел или его поразил призрак. В приведенном выше случае у меня только один призрак. Я предполагаю, что игра завершается только после съедения всей еды. Но мой код этого не делает. мяч попадает в призрак, прежде чем съесть всю еду. Я не знаю, что я сделал не так.

И у меня есть еще один вопрос: а что если я хочу тренировать призрака? Сделать это, чтобы поймать мяч. Если мяч контролируется пользователем.

...