def test_sort_into_species(functions_object, genome_four_nodes, genome_six_nodes): config = get_config() i_four_1 = individual.Individual(genome_four_nodes, config['kBias_node']) i_four_2 = individual.Individual(genome_four_nodes, config['kBias_node']) i_four_3 = individual.Individual(genome_four_nodes, config['kBias_node']) i_six_1 = individual.Individual(genome_six_nodes, config['kBias_node']) i_six_2 = individual.Individual(genome_six_nodes, config['kBias_node']) i_four_2.assigned_specie = "Not Assigned" i_six_1.assigned_specie = "Not Assigned" s1 = species.Species(0, i_four_1, config=get_config()) individuals = [i_four_1, i_four_2, i_four_3, i_six_1, i_six_2] all_species = {s1.id: s1} assert i_four_2.assigned_specie == "Not Assigned" assert i_six_1.assigned_specie == "Not Assigned" functions_object.sort_into_species(all_species, individuals, 1) assert len(all_species) == 2 assert all_species[2].generation_created == 1 assert all_species[2].representative is i_six_1 assert len(all_species[1].members) == 4 assert len(all_species[2].members) == 2 assert i_four_2.assigned_specie == 1 assert i_six_1.assigned_specie == 2
def species_one_member(genome_basic): config = get_config() i1 = individual.Individual(genome_basic, config['kBias_node']) i1.fitness = 1 s1 = species.Species(0, i1, config=get_config()) s1.members = [i1] return s1
def test_mate_inverted_fitness(genome_four_nodes, genome_five_nodes): config = get_config() i1 = Individual(genome_four_nodes, config['kBias_node']) i2 = Individual(genome_five_nodes, config['kBias_node']) i1.fitness = 5 i2.fitness = 10 species_object = Species(0, i1, config=get_config()) offspring = species_object.mate(i1, i2) assert offspring.genome.get_genome_size() == i2.genome.get_genome_size() for innov_num in range(1, 12): assert innov_num in offspring.genome.get_all_gene_ids()
def genome_basic(): config = get_config() c1 = genome.ConnectionGene(1, 2, 0.1, innov_num=3) n1 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], node_type='input', innov_num=1) n2 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], node_type='output', innov_num=2) connections = { c1.innov_num: c1, } nodes = { n1.innov_num: n1, n2.innov_num: n2, } g1 = genome.Genome(config=config) g1.node_genes = nodes g1.connection_genes = connections return g1
def species_five_members(genome_basic): config = get_config() i1 = individual.Individual(genome_basic, config['kBias_node']) i2 = individual.Individual(genome_basic, config['kBias_node']) i3 = individual.Individual(genome_basic, config['kBias_node']) i4 = individual.Individual(genome_basic, config['kBias_node']) i5 = individual.Individual(genome_basic, config['kBias_node']) i1.fitness = 10 i2.fitness = 15 i3.fitness = 40 i4.fitness = 80 i5.fitness = 5 s1 = species.Species(0, i1, config=get_config()) s1.members = [i1, i2, i3, i4, i5] return s1
def genome_simple_shuffle(): config = get_config() c1 = genome.ConnectionGene(1, 3, 0.5, innov_num=5) c2 = genome.ConnectionGene(2, 3, 0.5, innov_num=6) c3 = genome.ConnectionGene(1, 4, 0.1, innov_num=7) c4 = genome.ConnectionGene(4, 3, 0.8, innov_num=8) c5 = genome.ConnectionGene(9, 3, 0.25, innov_num=10) c6 = genome.ConnectionGene(4, 9, 0.333, innov_num=11) c7 = genome.ConnectionGene(2, 12, 0.22, innov_num=13) c8 = genome.ConnectionGene(12, 4, 0.22, innov_num=14) c9 = genome.ConnectionGene(1, 15, 0.1, innov_num=16) c10 = genome.ConnectionGene(15, 3, 0.1, innov_num=17) n1 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], node_type='input', innov_num=1) n2 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], node_type='input', innov_num=2) n3 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], node_type='output', innov_num=3) n4 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], innov_num=4) n5 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], innov_num=9) n6 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], innov_num=12) n7 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], innov_num=15) connections = { c1.innov_num: c1, c2.innov_num: c2, c3.innov_num: c3, c4.innov_num: c4, c5.innov_num: c5, c6.innov_num: c6, c7.innov_num: c7, c8.innov_num: c8, c9.innov_num: c9, c10.innov_num: c10 } nodes = { n1.innov_num: n1, n2.innov_num: n2, n3.innov_num: n3, n4.innov_num: n4, n5.innov_num: n5, n6.innov_num: n6, n7.innov_num: n7 } g1 = genome.Genome(config=config) g1.node_genes = nodes g1.connection_genes = connections return g1
def test_add_member(species_six_members, genome_basic): config = get_config() new_member = Individual(genome_basic, config['kBias_node']) assert new_member.assigned_specie is None assert len(species_six_members.members) == 6 species_six_members.add_member(new_member) assert new_member.assigned_specie == species_six_members.id assert len(species_six_members.members) == 7
def genome_six_nodes(): config = get_config() c1 = genome.ConnectionGene(1, 3, 0.6, innov_num=5) c2 = genome.ConnectionGene(2, 3, 0.75, innov_num=6) c3 = genome.ConnectionGene(1, 4, 0.6, innov_num=7) c4 = genome.ConnectionGene(4, 3, -0.1, innov_num=8) c5 = genome.ConnectionGene(1, 9, 0.1, innov_num=10) c6 = genome.ConnectionGene(9, 3, 0.1, innov_num=11) c7 = genome.ConnectionGene(1, 12, 0.3, innov_num=13) c8 = genome.ConnectionGene(12, 4, 0.1, innov_num=14) n1 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], node_type='input', innov_num=1) n2 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], node_type='input', innov_num=2) n3 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], node_type='output', innov_num=3) n4 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], innov_num=4) n5 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], innov_num=9) n6 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], innov_num=12) connections = { c1.innov_num: c1, c2.innov_num: c2, c3.innov_num: c3, c4.innov_num: c4, c5.innov_num: c5, c6.innov_num: c6, c7.innov_num: c7, c8.innov_num: c8 } nodes = { n1.innov_num: n1, n2.innov_num: n2, n3.innov_num: n3, n4.innov_num: n4, n5.innov_num: n5, n6.innov_num: n6 } g1 = genome.Genome(config=config) g1.node_genes = nodes g1.connection_genes = connections return g1
def genome_recursive_two_outputs(): config = get_config() c1 = genome.ConnectionGene(1, 3, 1.0, innov_num=5) c2 = genome.ConnectionGene(2, 3, 1.0, innov_num=6) c3 = genome.ConnectionGene(1, 4, -1.0, innov_num=7) c4 = genome.ConnectionGene(2, 4, -1.0, innov_num=8) c5 = genome.ConnectionGene(1, 9, 0.0, innov_num=10) c6 = genome.ConnectionGene(9, 4, 0.5, innov_num=11) c7 = genome.ConnectionGene(9, 9, 1.0, innov_num=12) n1 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], node_type='input', innov_num=1) n2 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], node_type='input', innov_num=2) n3 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], node_type='output', innov_num=3) n4 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], node_type='output', innov_num=4) n5 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], innov_num=9) connections = { c1.innov_num: c1, c2.innov_num: c2, c3.innov_num: c3, c4.innov_num: c4, c5.innov_num: c5, c6.innov_num: c6, c7.innov_num: c7 } nodes = { n1.innov_num: n1, n2.innov_num: n2, n3.innov_num: n3, n4.innov_num: n4, n5.innov_num: n5 } g1 = genome.Genome(config=config) g1.node_genes = nodes g1.connection_genes = connections return g1
def genome_isolated_output_node(): config = get_config() c1 = genome.ConnectionGene(1, 3, 0.1, innov_num=5) c2 = genome.ConnectionGene(2, 3, 0.25, innov_num=6) c3 = genome.ConnectionGene(1, 4, 0.1, innov_num=7) c4 = genome.ConnectionGene(2, 4, -0.6, innov_num=8) n1 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], node_type='input', innov_num=1) n2 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], node_type='input', innov_num=2) n3 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], node_type='output', innov_num=3) n4 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], node_type='output', innov_num=4) # Isolate output node 4 c3.enabled = False c4.enabled = False connections = { c1.innov_num: c1, c2.innov_num: c2, c3.innov_num: c3, c4.innov_num: c4 } nodes = { n1.innov_num: n1, n2.innov_num: n2, n3.innov_num: n3, n4.innov_num: n4, } g1 = genome.Genome(config=config) g1.node_genes = nodes g1.connection_genes = connections return g1
def genome_four_nodes_recursive(): config = get_config() c1 = genome.ConnectionGene(1, 3, 0.1, innov_num=5) c2 = genome.ConnectionGene(2, 3, 0.25, innov_num=6) c3 = genome.ConnectionGene(1, 4, 0.1, innov_num=7) c4 = genome.ConnectionGene(4, 3, -0.6, innov_num=8) c5 = genome.ConnectionGene(4, 4, 0.25, innov_num=9) # Recursive connection n1 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], node_type='input', innov_num=1) n2 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], node_type='input', innov_num=2) n3 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], node_type='output', innov_num=3) n4 = genome.NodeGene(sigmoid_power=config['kSigmoid_power'], innov_num=4) connections = { c1.innov_num: c1, c2.innov_num: c2, c3.innov_num: c3, c4.innov_num: c4, c5.innov_num: c5 } nodes = { n1.innov_num: n1, n2.innov_num: n2, n3.innov_num: n3, n4.innov_num: n4, } g1 = genome.Genome(config=config) g1.node_genes = nodes g1.connection_genes = connections return g1
def __init__(self, inputs, outputs, _config=None): super().__init__() self.config = get_config() if not _config else _config self.functions = Functions(config=self.config) self.persistence = persistence.Persistence(self.config) self.generation = 0 self.population = self._get_initial_population(inputs, outputs) self.current_unused_innov = self.population[ 0].genome.get_greatest_innov() + 1 self.session_stats = visualization.Visualization() self.current_champion = None # TESTING: self.all_innovs = dict() first_species = species.Species(self.generation, self.population[0], config=self.config) self.species = {first_species.id: first_species} for individual in self.population[1:]: self.species[first_species.id].add_member(individual)
while not game_over: output_vector = individual.frame(board_state) strongest_signal = output_vector.index(max(output_vector)) game_over, board_state = tetris_game.do_frame( strongest_signal) individual.fitness = tetris_game.score self.child_conn.send(sub_population) print("Ending Process") if __name__ == '__main__': xor_config = get_config("tetris_config") session = NEATSession(200, 5, xor_config) parent_conn, child_conn = Pipe() parent_conn2, child_conn2 = Pipe() parent_conn3, child_conn3 = Pipe() parent_conn4, child_conn4 = Pipe() p = ParallelTetrisPlayer(child_conn) p2 = ParallelTetrisPlayer(child_conn2) p3 = ParallelTetrisPlayer(child_conn3) p4 = ParallelTetrisPlayer(child_conn4) p.start() p2.start() p3.start()
def functions_object(): f1 = functions.Functions(config=get_config()) return f1
} options = list(inputs.keys()) random.shuffle(options) for choice in options: inputs[choice] = individual.evaluate(inputs[choice])[0] squared_performance = ((1 - inputs['neither']) + inputs['left'] + inputs['right'] + (1 - inputs['both'])) ** 2 _individual.fitness = squared_performance if __name__ == '__main__': target_fitness = 14 xor_config = get_config("XOR_config") session = NEATSession(2, 1, xor_config) for generation in range(10000): population = session.get_individuals() for individual in population: evaluate_task(individual) session.collect_individuals(population) session.advance_generation() print(session.current_champion.fitness, "Number of species: {0}".format(len(session.species))) if session.current_champion.fitness > target_fitness: print("Success on generation {0}".format(generation)) session.show_stats(session.current_champion) break
class Persistence(object): def __init__(self, config): super().__init__() self.config = config self.genome_folder = self._get_genome_directory_path() def _get_genome_directory_path(self): #Make the folder if it doesn't exist final_path = self.config['Project Root'] specified_folder = self.config['kGenome_folder'].split(".") while specified_folder: final_path = os.path.join(final_path, specified_folder.pop(0)) return final_path def save_genomes(self, genomes): # Save out a list of gnomes to that folder with a unique timestamp print(self.config['Project Root']) pass def load_genomes(self): # Try to load any genomes from the specified directory return "testing" if __name__ == '__main__': config = get_config() test_persist = Persistence(config) test_persist.save_genomes('test')