def test_3output_dimensions(self): nn=NN((2,2,3),verbose=0) inputs=([1,0],[0,1],[1,1],[0,0]) for i in inputs: nn.forward(i) self.assertEqual(nn.outputs[0].shape,(3,1)) self.assertEqual(nn.outputs[1].shape,(3,1)) self.assertEqual(nn.outputs[2].shape,(3,1)) self.assertEqual(nn.get_output().shape,(3,))
def test_3output_dimensions(self): nn = NN((2, 2, 3), verbose=0) inputs = ([1, 0], [0, 1], [1, 1], [0, 0]) for i in inputs: nn.forward(i) self.assertEqual(nn.outputs[0].shape, (3, 1)) self.assertEqual(nn.outputs[1].shape, (3, 1)) self.assertEqual(nn.outputs[2].shape, (3, 1)) self.assertEqual(nn.get_output().shape, (3, ))
def test_backward(self): X=[[0,0],[0,1],[1,0],[1,1]] Y=[[0],[1],[1],[0]] nn=NN([2,2,1],verbose=0) for i in range(4): nn.forward(X[i]) nn.backward(Y[i]) self.assertEqual(nn.outputs[0].shape,(3,1)) self.assertEqual(nn.outputs[1].shape,(3,1)) self.assertEqual(nn.outputs[2].shape,(1,1)) self.assertEqual(nn.get_output().shape,(1,))
def test_backward(self): X = [[0, 0], [0, 1], [1, 0], [1, 1]] Y = [[0], [1], [1], [0]] nn = NN([2, 2, 1], verbose=0) for i in range(4): nn.forward(X[i]) nn.backward(Y[i]) self.assertEqual(nn.outputs[0].shape, (3, 1)) self.assertEqual(nn.outputs[1].shape, (3, 1)) self.assertEqual(nn.outputs[2].shape, (1, 1)) self.assertEqual(nn.get_output().shape, (1, ))
class NNPaddle(object): def __init__(self, x_pos, y_pos, ball, game, four_player=False): self.bounds = pygame.Rect(x_pos, y_pos, 15, 100) self.ball = ball self.game = game self.four_player = four_player # self.net = NeuralNet(4, 1, 3) self.net = NeuralNet(3, 1, 3) self.generation = 0 self.score = 0 self.fitness = 0 self.contacts_ball = 0 self.name = self.random_name() self.parents = [] self.colors = None self.color_ndx = 0 self.seizure_reduction = 0 self.seize_rate = random.uniform(0, 15) self.set_colors() def __repr__(self): return str(self.name) + ' score: ' + str(self.score) + ' contacts: ' + str(self.contacts_ball) + \ ' gen: ' + str(self.generation) def __gt__(self, other): return self.fitness > other.fitness def draw(self, display): random.seed() if self.colors is None: self.set_colors() self.seizure_reduction += 1 if self.seizure_reduction > self.seize_rate: self.color_ndx = int(random.uniform(0, 4)) self.seizure_reduction = 0 pygame.draw.rect(display, (self.colors[self.color_ndx]), self.bounds) def set_colors(self): color_1 = (random.uniform(0, 255), random.uniform(0, 255), random.uniform(0, 255)) color_2 = (random.uniform(0, 255), random.uniform(0, 255), random.uniform(0, 255)) color_3 = (random.uniform(0, 255), random.uniform(0, 255), random.uniform(0, 255)) color_4 = (random.uniform(0, 255), random.uniform(0, 255), random.uniform(0, 255)) self.colors = [color_1, color_2, color_3, color_4] self.color_ndx = 0 self.color_ndx = int(random.uniform(0, 4)) def move_up(self, delta): self.bounds = self.bounds.move(0, -250 * delta) def move_down(self, delta): self.bounds = self.bounds.move(0, 250 * delta) def follow_ball(self, delta): y_pos = self.bounds.y + self.bounds.height ball_y = self.ball.bounds.y ball_speed = math.sqrt(self.ball.vel_x**2 + self.ball.vel_y**2) inputs = [y_pos, ball_y, ball_speed] output = self.net.get_output(inputs) if not self.four_player: if output > 0.5: if self.bounds.y + self.bounds.height < self.game.window_height: self.move_down(delta) else: if self.bounds.y > 0: self.move_up(delta) else: if output > 0.5: if self.bounds.y + self.bounds.height < self.game.window_height - 50: self.move_down(delta) else: if self.bounds.y > 50: self.move_up(delta) def reset(self, x_pos, y_pos, ball): self.ball = ball self.bounds = pygame.Rect(x_pos, y_pos, 15, 100) def save_genome(self, file_path='./genomes/'): path = file_path + str(self.name) f = open(path, 'w+') for synapse in self.net.synapses: f.write(str(synapse) + '\n') f.write(self.name + '\n') f.write(str(self.generation) + '\n') f.close() def load_genomes(self, file): try: f = open('./final_genomes/' + file) except FileNotFoundError: try: f = open('./genomes/' + file) except FileNotFoundError: print(FileNotFoundError) return layer_number = 0 synapses = [] name, gen = False, False for line in f: if len(line) > 0 and line[ 0] == '[' and layer_number <= self.net.num_hidden_layers: gene = [] synapse = line.split(',') for s in synapse: if '[' in s: gene.append(float(s.strip('['))) elif '\n' in s: gene.append(float(s.strip(']\n'))) else: gene.append(float(s)) synapses.append(gene) layer_number += 1 elif not name: self.name = line.strip('\n') name = True elif not gen: self.generation = int(line.strip('\n')) gen = True for i in range(len(self.net.synapses)): for j in range(len(self.net.synapses[i])): self.net.synapses[i][j].weight = synapses[i][j] print('Loaded genome:', self) @staticmethod def random_name(): names = [ 'Cheenis', 'Garreth', 'Baxter', 'Slidey', 'McPong', 'Jeeves', 'Jacob', 'Bool', 'Don', 'Cheedle', 'Don', 'Cheedle', 'Stanley', 'Alexa', 'The Pacer Test', 'Finn', 'Daniel', 'Dan the Man', 'Dad', 'The Alamo', 'Grobgobbler', 'Gavin', 'Doyle', '@RealGavin', 'Juul', 'Bruul', 'Dr.', 'Bichael', 'Flats', 'Andrew', 'Farquaad', 'Blanch', 'Son of', 'Dreyfuss', 'Chad', 'Donald', 'Chump', 'Too Many', 'Bocephus', 'Diengklurg', 'Antwaun', 'Dart', 'Joe', 'Szymczyk', 'Stratton', 'Go', 'Bears', 'Jabarbwire', 'Barbara', 'Bush', 'Dante', 'Soldavini', 'Rick' ] if random.uniform(0, 1) > 0.5: return random.choice(names) else: temp_names = list(names) f_name = random.choice(temp_names) temp_names.remove(f_name) l_name = random.choice(temp_names) return f_name + ' ' + l_name