-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathIndividual.py
74 lines (65 loc) · 2.23 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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
"""
Implementación de clase Individuo
"""
__author__ = "Gonzalo Chacaltana Buleje"
from random import randint
import random
class Individual(object):
"""
Clase que implementa al individuo de una generación
"""
def __init__(self):
self.min_number_char: int = 32
self.max_number_char: int = 128
self.min_rate_mutation: float = 0.0
self.max_rate_mutation: float = 1.0
self.objetive: str = ""
self.number_genes: int = 0
self.genes = []
def generate_genes(self, number_genes, objetive):
"""
Método para generar los genes
"""
self.number_genes = number_genes
self.objetive = objetive
for _ in range(0, self.number_genes):
self.genes.append(
chr(randint(self.min_number_char, self.max_number_char)))
def get_phenotype(self):
"""
Método que devuelve fenotipo de individuo
"""
return ''.join(self.genes).encode("utf-8")
def get_fitness(self):
"""
Método para obtener valor de fitness
"""
score: int = 0
for i in range(0, len(self.genes)):
if self.genes[i] == self.objetive[i]:
score += 1
return float(score)/float(len(self.objetive))
def cross(self, couple):
"""
Método que implementa el cruce del individuo
"""
children = Individual()
children.generate_genes(self.number_genes, self.objetive)
middlePoint = int(randint(1, len(self.genes) - 1))
for i in range(0, len(self.genes)):
if i > middlePoint:
children.genes[i] = self.genes[i]
else:
children.genes[i] = couple.genes[i]
return children
def mutate(self, rate_mutation):
"""
Método que implementa la mutación
"""
for i in range(0, len(self.genes)):
randRateMutation = float(random.uniform(
self.min_rate_mutation, self.max_rate_mutation))
if (randRateMutation < rate_mutation):
if (self.genes[i] != self.objetive[i]):
self.genes[i] = chr(
randint(self.min_number_char, self.max_number_char))