Esempio n. 1
0
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
Esempio n. 2
0
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
Esempio n. 3
0
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()
Esempio n. 4
0
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
Esempio n. 5
0
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
Esempio n. 6
0
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
Esempio n. 7
0
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
Esempio n. 8
0
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
Esempio n. 9
0
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
Esempio n. 10
0
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
Esempio n. 11
0
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
Esempio n. 12
0
    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)
Esempio n. 13
0
                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()
Esempio n. 14
0
def functions_object():
    f1 = functions.Functions(config=get_config())
    return f1
Esempio n. 15
0
    }

    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
Esempio n. 16
0
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')