A classic game of snake that is controlled by a neural network and trained using a genetic algorithm
Switch branches/tags
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.idea
lib
out/production/WRCI_ass5
src
README.md
Read me.txt
Thumbs.db
WRCI Results.xls
WRCI_Assignment_3.5_Group_9.docx
WRCI_ass5.iml
apple.png
apple.psd
body.png
body.psd
head.png
head.psd

README.md

SnakeGame

A classic game of snake that is controlled by a neural network (NN) and trained using a genetic algorithm (GA)

Written in Java, the objective of the game is to maximize the snake's length without running into it's own body or the boundry wall. The game is run using a neural network made up 15 input neurons, 7 hidden layer neurons and 4 output neurons.


Input neurons consist of (note, all values are taken as x and y PIXEL coordinates):

0: position of head x

1: position of head y

2: position of midpoint of body x

3: position of midpoint of body y

4: position of tail x

5: position of tail y

6: position of food x

7: position of food y

8: distance to food x

9: distance to food y

10: is the block on the left of the head free? (1 or 0)

11: is the block on the right of the head free? (1 or 0)

12: is the block on the up of the head free? (1 or 0)

13: is the block on the down of the head free? (1 or 0)

14: bias (-1)

(note the bias is -1, as the formula in the activation function is given as a negative

Output neruons are:

0: move left

1: move right

2: move down

3: move up


Training of the neural network happens through a genetic algorithm through the updating of weights that are optimized around a fitness function. Random weights are initially generated for the population size of the genetic alorithm (GA) and then a game of snake is played by the NN for every chromozone in the population At the end of each playing cycle, the GA performs cross overs and mutations around a fitness function in order to try and better each chromozone's score. The fitness function is: if (stalled) out = (stepsTaken/4) + (snakeLength * 100000.0); else out = (stepsTaken/2) + (snakeLength * 100000.0);

It should be noted, that the stalled value is 1, when a game ends because the snake has not found food with a set number of moves.