DEV Community

Cover image for Mastering Snake Game with Reinforcement Learning and Linear Q-Network (with Python)
Iman Karimi
Iman Karimi

Posted on

Mastering Snake Game with Reinforcement Learning and Linear Q-Network (with Python)

Artificial Intelligence (AI) has come a long way from its initial conceptual stages. The world of Reinforcement Learning (RL) is one of the most fascinating subfields of AI, where agents learn by interacting with environments to maximize cumulative rewards. The real beauty of RL lies in its capacity for trial-and-error learning, which is a stark contrast to traditional rule-based programming. In this article, we explore how RL can be used to teach a machine to play the classic Snake game, a task that requires planning, strategy, and adaptability.

Our primary tool for this exploration is the Linear Q-Network (LQN), a neural network architecture built to implement Q-Learning, a popular RL technique. We’ll walk through the entire process, from setting up the environment, training the agent, and finally integrating everything into a self-learning Snake game AI.

The Basics of Snake and AI
Before diving into RL, let’s break down the Snake game and the challenges it presents. The Snake game is a simple arcade-style game where a snake moves continuously in a grid. The player’s task is to guide the snake to eat food and avoid hitting walls or its own body. For every food consumed, the snake grows longer, and the challenge increases as the space becomes tighter.

Teaching an AI agent to play Snake is difficult because it requires the agent to:

  • Avoid self-collisions.
  • Strategically navigate towards the food.
  • Handle dynamic game states where the environment constantly changes.

This is where reinforcement learning shines. By giving the agent rewards for good behavior (like eating food) and penalties for mistakes (like hitting a wall), the agent can learn an optimal strategy for playing the game.

What is Reinforcement Learning?
Reinforcement Learning is a type of machine learning where an agent interacts with an environment, makes decisions (actions), and receives feedback (rewards or penalties) based on those decisions. Over time, the agent aims to maximize the cumulative reward by adjusting its behavior.

In reinforcement learning, the agent continuously follows a loop:

  • Observe the state: The agent gathers information from the environment.
  • Choose an action: Based on the state, the agent decides on the best course of action.
  • Perform the action: The agent executes the action and moves to a new state.
  • Receive feedback: The agent receives a reward or penalty depending on the outcome of the action.

The agent’s goal is to learn an optimal policy, which is a mapping from states to actions, to maximize long-term cumulative rewards. In the case of Snake, the agent’s state includes the snake’s position, food location, and the direction the snake is heading. Its actions are simple (turn left, turn right, or move straight), but the game dynamics make it a non-trivial task.

Q-Learning: The Foundation of Our Agent
Q-Learning is an off-policy RL algorithm where the agent learns a Q-value function that estimates the value of taking an action in a particular state. The Q-value essentially represents the future reward the agent can expect from that action, and over time, the agent improves its predictions by adjusting these Q-values.

The Q-value function is updated using the Bellman equation:

Q_new(state, action) = reward + gamma * max(Q_next_state(all_actions))

Where:

  • reward is the immediate reward the agent receives after taking an action.
  • gamma is the discount factor that determines how much future rewards are valued.
  • max(Q_next_state) is the maximum expected reward for the next state, considering all possible actions.

By iteratively updating the Q-values based on experience, the agent learns which actions lead to better outcomes in the long run.

Linear Q-Network (LQN): Neural Network for Q-Learning
Q-Learning in its raw form uses a Q-table, which maps states to actions. However, as the state space grows (e.g., the many possible positions of the snake), maintaining a Q-table becomes impractical due to memory and computational constraints. This is where Linear Q-Networks (LQN) come in.

An LQN approximates the Q-value function using a neural network. Instead of a Q-table, we have a model that takes the state as input and outputs the Q-values for each possible action. The network is trained using backpropagation, minimizing the difference between predicted Q-values and the actual target Q-values.

Architecture of Linear Q-Network
The Linear Q-Network for the Snake game has a straightforward architecture:

Input Layer: This takes in the state representation of the game, which includes details like the position of the snake, its direction, the location of food, and potential dangers (walls or the snake’s own body).
Hidden Layer: A fully connected layer that learns abstract features from the input state.
Output Layer: This outputs Q-values for each possible action (turn left, turn right, or continue moving forward). The action with the highest Q-value is chosen as the next move.

The network uses ReLU activation functions to add non-linearity to the model, allowing it to learn complex relationships between the state and the best actions.

The Snake Game Environment
The Snake game environment is built using Pygame, a popular Python library for game development. The game handles the snake’s movement, detects collisions (with walls or the snake itself), places food randomly, and checks for game-over conditions.

Key functions in the environment include:

  • Move Snake: Moves the snake forward based on the current action.
  • Place Food: Places food at a random location on the grid.
  • Check Collision: Determines if the snake has hit a wall or its own body.

The game constantly updates, providing new states to the agent, which then chooses its next action. By training on this dynamic environment, the agent improves its decision-making.

Training the Agent
To train the agent, we use a Replay Memory and Batch Training mechanism. At each time step, the agent’s experiences (state, action, reward, next state) are stored in memory. At each training step, a random batch of experiences is sampled, and the network is trained using these past experiences.

This method helps stabilize training by reducing the correlation between consecutive experiences and enables the agent to learn from a wide variety of game situations.

The training process follows these steps:

  • Observe the current state of the game (snake position, food, danger).
  • Predict the Q-values for the possible actions using the LQN model.
  • Choose an action: The agent either exploits its knowledge (chooses the action with the highest Q-value) or explores new actions (random choice), based on an exploration-exploitation trade-off.
  • Execute the action, move the snake, and observe the reward.
  • Store the experience in memory.
  • Train the model by sampling a batch of past experiences and updating the network’s weights.

This process repeats until the agent becomes proficient at the game.

Visualizing the Agent’s Progress
To track the agent’s learning progress, we plot the game score and the moving average of scores over time. As the agent improves, it will survive longer, eat more food, and increase its score. You can use Matplotlib to visualize the training results in real time.

Modifying and Integrating the Agent
This project can be easily modified and extended. You can experiment with different neural network architectures, adjust the reward structure, or even create new game rules to increase the challenge. Additionally, the trained agent can be integrated into various applications, such as mobile games or AI competitions.

Conclusion
Reinforcement Learning is a powerful tool that enables agents to learn from their interactions with the environment. By applying RL to the Snake game, we’ve created a self-learning AI capable of playing the game at a high level. The journey from Q-Learning to Linear Q-Networks offers insights into how neural networks can be combined with RL to solve complex tasks.

This project serves as an excellent starting point for anyone interested in RL, game AI, or neural networks. The code can be easily extended, and the learning process can be applied to other games or real-world problems.

Source Code
You can download Python source code from GitHub using the following link: Source Code

Reference
Snake Game with Reinforcement Learning

Top comments (1)

Collapse
 
anshumansinha3301 profile image
Anshuman Sinha

insightful