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.scoreDiese 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.
ACHTUNGdieser 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.gridDiese wird von dem sogenannten Agenten genutzt um den State herauszufinden. Was mit diesen Begriffen gemeint ist kommt jetzt.