Snake KI
2. Enviroment

Teil 1

Das "Spielfeld" - Environment

Um überhaupt ein Modell auf das Spiel Snake zu trainieren, braucht es ein Medium in welchem die Spielregeln definiert sind.
Oft wird dies beim Reinforcement-Learning als environment bezeichnet. Im Projekt findet man dies als World Klasse in der environment.py Datei.
Für unsere Zwecke ist nicht alles aus dieser Python Datei wichtig. Um es zusammenzufassen, gibt es immer ein Welt Objekt, welches ein Spielfeld simuliert.
Für unsere KI Zwecke ist jedoch die step() methode wichtig:

def step(self, input_orientation: list):
        if (input_orientation[0] == 1):
            input_orientation = Direction.LEFT
        elif (input_orientation[1] == 1):
            input_orientation = Direction.FORWARD
        elif (input_orientation[2] == 1):
            input_orientation = Direction.RIGHT

        # 1. grab all events
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
        
        reward = 0
        game_over = False
        # 2. check if lost
        if self.danger_in_direction(input_orientation) == 1 or self.curr_frame > (100 * (self.score + 1)):
            reward = -10
            game_over = True
            return reward, game_over, self.score

        # 3. move
        self.grid = self.snake.move(input_orientation, self.grid)
        self.curr_frame += 1

        # 4. check for apple
        for i in range(len(self.foods)):
            if self.grid[self.foods[i][1]][self.foods[i][0]] == 9:
                self.score += 1
                reward += 10
                self.foods.pop(i)
                self.init_new_food()
        
        # 5. update ui
        self.update_ui()
        self.clock.tick(World.frame_rate)    

        # 6. return reward 
        return reward, game_over, self.score

Diese kriegt jeden Spielzug von unserem Neuronalen Netzwerk eine Entscheidung in welche Richtung sich die Schlange bewegen soll, in Form eines 1-Dimensionalen Arrays mit Länge 3.
Links -> [1, 0, 0]
Geradeaus -> [0, 1, 0]
Rechts -> [0, 0, 1]
Die Methode gibt 3 Werte zurück:

  • reward -> durch diesen Wert wird dem Neuronalen-Netzwerk vermittelt wie gut oder wie schlecht ein Spielzug ist. Je größer, desto "besser". Einen Apfel zu essen wird z.B. mit +10 reward belohnt. Zu verlieren wird mit -10 reward bestraft.
    ACHTUNG dieser Wert soll später durch die Loss-Function so groß wie möglich gehalten werden.
  • game_over -> ein boolean Wert ob verloren ist oder nicht.
  • self.score -> die jetzige Punktzahl (einen Apfel zu essen gibt einen Punkt)

Auch wichtig ist die get_grid() Methode:

def get_grid(self):
        return self.grid

Diese wird von dem sogenannten Agenten genutzt um den State herauszufinden. Was mit diesen Begriffen gemeint ist kommt jetzt.