-
Notifications
You must be signed in to change notification settings - Fork 0
/
individual.py
51 lines (41 loc) · 1.87 KB
/
individual.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
from genome_parameters import GenomeParameters
from evolution_parameters import EvolutionParameters
from mutation import Mutation
from crossover import Crossover
from genomes import Genome
from fitness import FitnessEvaluator
class Individual:
next_id = 0
def __init__(self,
evolution_params : EvolutionParameters,
genome_params : GenomeParameters,
device,
genome = None):
self.id = Individual.next_id
Individual.next_id += 1
if genome:
self.genome = genome
else:
self.genome = Genome(genome_params)
self.evolution_params = evolution_params
self.genome_params = genome_params
self.device = device
self.failed = False
self.fitness_needs_update = True
self.measure_fitness()
def mutate(self):
'''Mutate the individual with a given probability
TODO: extend if new mutation functions are added'''
Mutation.random_resetting(self, self.evolution_params.mutation_probability)
def crossover(self, other):
'''Crossover with another individual'''
if True: #TODO: if other crossover functions are added, we can check evolution_params.crossover_type here
res = Individual(self.evolution_params, self.genome_params, self.device, genome = Crossover.uniform(self, other))
return res
def measure_fitness(self):
'''Measure the fitness of the individual'''
self.fitness = FitnessEvaluator(self.evolution_params, self, self.device).evaluate()
#TOFO: refine; the next operation should be done in fitness.py
#TODO: does the indexing make sense here even??
self.fitness = -self.fitness[0][-1] #Take the last accuracy value
self.fitness_needs_update = False