-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathApp.py
158 lines (141 loc) · 5.48 KB
/
App.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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
"""
Aplicación que implementa un algoritmo de optimización utilizando algoritmos genéticos.
"""
__author__ = "Gonzalo Chacaltana Buleje"
import sys
from random import randint
from individual import Individual
class App(object):
"""
Clase que implementa la aplicación de consola
"""
def __init__(self):
self.max_length_objetive: int = 300
self.min_length_objetive: int = 1
self.max_population: int = 300
self.min_population: int = 100
self.min_rate_mutation: float = 0.0
self.max_rate_mutation: float = 1.0
self.number_population: int = 0
self.objetive: str = ""
self.populations = []
self.parents = []
def run(self):
"""
Método principal de la aplicación
"""
self.input_params()
self.execute_genetic_algorithm()
def input_params(self):
"""
Método para el ingreso de parámetros
"""
self.input_objetive()
self.input_population()
self.input_rate_mutation()
def input_objetive(self):
"""
Método para el ingreso del texto objetivo
"""
self.objetive = input("Ingrese el texto objetivo: ")
if len(self.objetive) == 0:
raise Exception("Exception: El objetivo no fue ingresado!")
if len(self.objetive) < self.min_length_objetive:
raise Exception("Exception: El objetivo es muy corto!")
if len(self.objetive) > self.max_length_objetive:
raise Exception("Exception: El objetivo es muy extenso!")
def input_population(self):
"""
Método para el ingreso de datos de la población
"""
self.number_population = int(
input("Ingrese cantidad de individuos por poblacion [100 a 300]: "))
if (self.number_population == 0):
raise Exception(
"Exception: La poblacion de individuos es invalida!")
if (self.number_population < self.min_population):
raise Exception(
"Exception: La poblacion de individuos es muy reducida!")
if (self.number_population > self.max_population):
raise Exception(
"Exception: La poblacion de individuos es muy extensa!")
def input_rate_mutation(self):
"""
Método para el ingreso del ratio de mutación.
"""
self.rate_mutation = float(
input("Ingrese la tasa de mutacion [0 a 1]: "))
if (self.rate_mutation < self.min_rate_mutation):
raise Exception(
"Exception: La tasa de mutacion no puede ser menor de %s" % self.min_rate_mutation)
if (self.rate_mutation > self.max_rate_mutation):
raise Exception(
"Exception: La tasa de mutacion no puede ser mayor de %s" % self.max_rate_mutation)
def execute_genetic_algorithm(self):
"""
Método para ejecutar el algoritmo genético
"""
for _ in range(0, self.number_population):
individual = Individual()
individual.generate_genes(len(self.objetive), self.objetive)
self.populations.append(individual)
self.generation = 0
print("Buscando mejor individuo....")
while True:
self.evaluate_members_generation()
self.select_members_generation()
self.reproduction_members_generation()
def evaluate_members_generation(self):
"""
Método para evaluar miembros de una generación
"""
self.generation += 1
print(f"\n GENERACION {self.generation}\n")
for x in range(0, self.number_population):
print(
f"Generacion[{self.generation}] | Individuo[{x}]: {self.populations[x].get_phenotype()} | fitness: {self.populations[x].get_fitness()}")
if self.evaluate_objetive(self.populations[x]):
sys.exit()
def select_members_generation(self):
"""
Método para seleccionar a los miembros de una generación
"""
self.parents = []
for _ in range(0, self.number_population):
n = int(self.populations[_].get_fitness()*100)
if n > 0:
self.parents.append(self.populations[_])
def reproduction_members_generation(self):
"""
Método que implementa la reproducción de miembros de una generación
"""
total_parents: int = len(self.parents)
print("Padres seleccionados: ", total_parents)
for i in range(0, self.number_population):
a = int(randint(0, (total_parents-1)))
b = int(randint(0, (total_parents-1)))
father = self.parents[a]
mother = self.parents[b]
children = father.cross(mother)
children.mutate(self.rate_mutation)
self.populations[i] = children
def evaluate_objetive(self, individual: Individual):
"""
Método para evaluar objetivo
"""
if individual.get_fitness() == 1.0:
print(f"Objetivo encontrado: {individual.get_phenotype()}")
return True
return False
def show_individual_phenotype(self):
"""
Método para mnostrar fenotipo individual
"""
for j in range(0, self.number_population):
print(f"Individuo {j} : {self.populations[j].get_phenotype()}")
if __name__ == "__main__":
try:
app = App()
app.run()
except (ValueError, FileNotFoundError, AttributeError, Exception) as ex:
print(ex)