Skip to content

Commit d695d80

Browse files
committed
Antes de multiversion
1 parent dd86a02 commit d695d80

File tree

1 file changed

+37
-10
lines changed

1 file changed

+37
-10
lines changed

ga.py

+37-10
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
# -*- coding: utf-8 -*-
22

3-
import math
3+
# import math
44
import random
55

6+
import ga_aux
7+
68
_password = "Abre. Soy yo! Quién va a ser si no?"
9+
# _password = "El módulo estandariza un conjunto básico de herramientas rápidas y eficientes en memoria que son útiles por sí mismas o en combinación. Juntos, forman un álgebra iteradora que permite construir herramientas especializadas de manera sucinta y eficiente en Python puro."
10+
# _password = "Este módulo implementa una serie de bloques de construcción de iteradores inspirados en construcciones de APL, \"Haskell\" y SML. Cada uno ha sido refundido en una forma adecuada para Python. El módulo estandariza un conjunto básico de herramientas rápidas y eficientes en memoria que son útiles por sí mismas o en combinación. Juntos, forman un álgebra iteradora que permite construir herramientas especializadas de manera sucinta y eficiente en Python puro. Por ejemplo, SML proporciona una herramienta de tabulación: que produce una secuencia . El mismo efecto se puede lograr en Python combinando map() y count() para formar .tabulate(f)f(0), f(1), ...map(f, count()) Estas herramientas y sus contrapartes integradas también funcionan bien con las funciones de alta velocidad en el módulo del operador. Por ejemplo, el operador de multiplicación se puede mapear a través de dos vectores para formar un producto de punto eficiente: .sum(map(operator.mul, vector1, vector2))Iteradores infinitos: "
711

812
''' Settings for the genetic algorithm
913
aptitud:
@@ -24,9 +28,6 @@
2428
2529
'''
2630

27-
muestreo = "ruleta" or "torneo" or "elitista"
28-
aptitud = "proportional" or "ranked"
29-
3031

3132
def get_password_len():
3233
""" Return the length of the current password, for simulation purposes """
@@ -54,7 +55,8 @@ def initial_population(pop_size, chromosome_len):
5455
# Implemente la función mutate() que recibe un cromosoma y lo muta cambiando aleatoriamente un único gen por otro del gene_set().
5556
def mutate(chromosome):
5657
""" Mutate randomly one gen of the chromosome, which is a string with the characters of the password """
57-
chromosome[random.randint(0, len(chromosome) - 1)] = random.choice(gene_set())
58+
chromosome[random.randint(0, len(chromosome) - 1)
59+
] = random.choice(gene_set())
5860
return chromosome
5961

6062

@@ -64,33 +66,52 @@ def crossover(chromosome1, chromosome2):
6466
p = random.randint(0, get_password_len() - 1)
6567
return chromosome1[:p] + chromosome2[p:]
6668

69+
6770
"""
6871
• pop_size el tamaño de la población (por defecto 100) que se mantiene fijo entre generaciones
6972
• elite_rate la proporción de la población que se consideran buenas soluciones y que se usan para construir la siguiente población (por defecto es el 20%)
7073
• mutate_prob la proporción de candidatos que mutan (por defecto es el 80%) de la población entera (incluida la élite). Los candidatos que no se mutan, se cruzan con otro
7174
• max_generations el número máximo de generaciones que permitimos iterar en el
7275
algoritmo (pode defecto 10.000)
7376
"""
74-
def ga(pop_size=100, elite_rate=0.2, mutate_prob=0.8, max_generations=10000):
77+
78+
79+
def ga(pop_size=1000, elite_rate=0.2, mutate_prob=0.8, max_generations=10000):
7580
""" Genetic Algorithm driving the search of the password """
7681
pop = initial_population(pop_size, get_password_len())
77-
# pop.append([_password[i] for i in range(get_password_len())]) # Añadir la contraseña como último elemento de la población
7882
for i in range(max_generations):
7983
pop.sort(key=get_fitness)
80-
print("\nGeneration:", i, "\t", chromosome_to_string(pop[0]), "\tfitness:", get_fitness(pop[0]))
84+
ga_aux.clear()
85+
print("Password length:", get_password_len(), "\n\nGeneration:",
86+
i, "fitness:", get_fitness(pop[0]), "\n", chromosome_to_string(pop[0]))
8187
if get_fitness(pop[0]) == 0: return pop[0]
88+
# pop = next_generation_roulette(pop, elite_rate, mutate_prob)
8289
pop = next_generation(pop, elite_rate, mutate_prob)
90+
print("Password not found")
8391
return False
8492

8593

8694
def next_generation(pop, elite_rate, mutate_prob):
95+
""" Return the next generation """
96+
pop_size = len(pop)
97+
# Selecciona la elite
98+
pop = pop[:int(pop_size * elite_rate)]
99+
# Cruzar elite hasta completar la población
100+
while len(pop) < pop_size:
101+
pop.append(crossover(random.choice(pop), random.choice(pop)))
102+
# Mutar al mutate_prob de la poblacion
103+
pop = [pop[i] if random.random() > mutate_prob else mutate(pop[i]) for i in range(len(pop))]
104+
return pop
105+
106+
107+
def next_generation_roulette(pop, elite_rate, mutate_prob):
87108
""" Return the next generation """
88109
pop_size = len(pop)
89110
# Selecciona la elite
90111
split = int(pop_size * elite_rate)
91112
elite, non_elite = pop[:split], pop[split:]
92113
# Mutar entre los no elite
93-
non_elite = [non_elite[i] if random.random() < mutate_prob else mutate(non_elite[i]) for i in range(len(non_elite))]
114+
non_elite = [non_elite[i] if random.random() > mutate_prob else mutate(non_elite[i]) for i in range(len(non_elite))]
94115
# Cruzar para generar descendencia. Se cruza por parejas en orden para cruzar individuos de similar fitness
95116
progeny = [crossover(pop[i], pop[i+1]) for i in range(0, pop_size, 2)]
96117
return elite + roulette_wheeling(non_elite + progeny, num_winers=pop_size - len(elite))
@@ -104,7 +125,7 @@ def roulette_wheeling(players, num_winers):
104125
for _ in range(num_winers):
105126
domain = gauss_sum(len(players))
106127
tirada = random.randint(1, domain)
107-
winners.append(players.pop( int(inverse_gauss_sum(tirada))-1 ))
128+
winners.append(players.pop(int(inverse_gauss_sum(tirada))-1))
108129
return winners
109130

110131

@@ -123,4 +144,10 @@ def chromosome_to_string(chromosome):
123144
""" Return the string representation of the chromosome """
124145
return "".join(chromosome)
125146

147+
148+
# def clear():
149+
# if os.name == "nt": os.system("cls")
150+
# else: os.system("clear")
151+
152+
126153
gpassword = ga()

0 commit comments

Comments
 (0)