Saataa andagii !

This commit is contained in:
Lukian 2024-12-17 10:55:50 +01:00
parent d39467f070
commit 10bfdd3fde
4 changed files with 87 additions and 37 deletions

View file

@ -21,8 +21,7 @@ def max_i(array: list[int]) -> int:
max_i = i max_i = i
return max_i return max_i
def new_population(pm, ng, n, ts, tm, alpha, fm):
def new_population(pm, ng, n, ts, tm, alpha, fm): # -> set(list(set(str)), str, int, int, int, float, float, float, int)
""" """
fonction qui renvoie une nouvelle population fonction qui renvoie une nouvelle population
""" """
@ -43,7 +42,7 @@ def new_population(pm, ng, n, ts, tm, alpha, fm): # -> set(list(set(str)), str,
return population return population
def new_individual(): # -> set(str) def new_individual():
""" """
fonction qui renvoie un nouvel individu fonction qui renvoie un nouvel individu
""" """
@ -66,7 +65,8 @@ def fitness1(individual, pm) -> int:
""" """
sum = 0 sum = 0
for i in range(len(individual["chromozome"])): for i in range(len(individual["chromozome"])):
sum += abs(ord(individual["chromozome"][i]) - ord(pm[i])) if i < len(pm) and i < len(individual["chromozome"]):
sum += abs(ord(individual["chromozome"][i]) - ord(pm[i]))
return -sum return -sum
def fitness2(individual, pm, alpha) -> int: def fitness2(individual, pm, alpha) -> int:
@ -76,7 +76,7 @@ def fitness2(individual, pm, alpha) -> int:
match = 0 match = 0
missed_placed = 0 missed_placed = 0
for i in range(len(individual["chromozome"])): for i in range(len(individual["chromozome"])):
if i > len(pm): if i >= len(pm):
missed_placed += len(individual["chromozome"]) - len(pm) missed_placed += len(individual["chromozome"]) - len(pm)
break break
elif individual["chromozome"][i] == pm[i]: elif individual["chromozome"][i] == pm[i]:
@ -104,13 +104,17 @@ def get_fitness(population, individual) -> int:
case _: case _:
return fitness1(individual, population["pm"]) return fitness1(individual, population["pm"])
def get_fitness_list(population):
fitness_list = []
for individual in population["individuals"]:
fitness_list.append(get_fitness(population, individual))
return fitness_list
def get_best(population): def get_best(population):
""" """
Methode qui renvoie le meilleur individu de la population Methode qui renvoie le meilleur individu de la population
""" """
fitness_list = [] fitness_list = get_fitness_list(population)
for individual in population["individuals"]:
fitness_list.append(get_fitness(population, individual))
return population["individuals"][max_i(fitness_list)] return population["individuals"][max_i(fitness_list)]
def print_best(population) -> None: def print_best(population) -> None:
@ -119,49 +123,57 @@ def print_best(population) -> None:
""" """
print(get_best(population)["chromozome"]) print(get_best(population)["chromozome"])
def mutate(individual) -> None:
"""
Methode qui change un des caractères du chromozome
"""
new = list(individual["chromozome"])
if random.randint(1, 2) == 1: new.insert(random.randint(0, len(new) - 1), chr(random.randint(0, 255)))
else : new[random.randint(0, len(new) - 1)] = chr(random.randint(0, 255))
individual["chromozome"] = "".join(new)
def select(population) -> None: def select(population) -> None:
""" """
Methode qui sélectionne les meilleurs individus Methode qui sélectionne les meilleurs individus
""" """
fitness_list = [] fitness_list = get_fitness_list(population)
for individual in population["individuals"]:
fitness_list.append(get_fitness(population, individual))
for i in range(int((1 - population["ts"]) * population["n"])): for i in range(int((1 - population["ts"]) * population["n"])):
least = min_i(fitness_list) least = min_i(fitness_list)
fitness_list.pop(least) fitness_list.pop(least)
population["individuals"].pop(least) population["individuals"].pop(least)
def get_two_random_individuals(population):
i = random.randint(0, len(population["individuals"]) - 1)
j = random.randint(0, len(population["individuals"]) - 1)
while i == j:
j = random.randint(0, len(population["individuals"]) - 1)
return (population["individuals"][i], population['individuals'][j])
def reproduct(population) -> None: def reproduct(population) -> None:
""" """
Methode qui reproduit les individus entre eux jusqu'à obtenir une population de taille N Methode qui reproduit les individus entre eux jusqu'à obtenir une population de taille N
""" """
new = [] new = []
while len(population["individuals"]) + len(new) != population["n"]: while len(population["individuals"]) + len(new) != population["n"]:
i = random.randint(0, len(population["individuals"]) - 1) indivi_1, indivi_2 = get_two_random_individuals(population)
j = random.randint(0, len(population["individuals"]) - 1)
while i == j:
j = random.randint(0, len(population["individuals"]) - 1)
indivi_1 = population["individuals"][i]
indivi_2 = population['individuals'][j]
avg = (len(indivi_1) + len(indivi_2)) // 2 avg = (len(indivi_1) + len(indivi_2)) // 2
cut = random.randint(avg // 3, 2 * avg // 3) cut = random.randint(avg // 3, 2 * avg // 3)
while cut > len(indivi_1) or cut > len(indivi_2): cut = random.randint(avg // 3, 2 * avg // 3) while cut > len(indivi_1) or cut > len(indivi_2):
new_chromozome = indivi_1["chromozome"][:cut] + indivi_2["chromozome"][-cut:] cut = random.randint(avg // 3, 2 * avg // 3)
new_chromozome = indivi_1["chromozome"][:cut] + indivi_2["chromozome"][cut:]
child = new_individual() child = new_individual()
child["chromozome"] = new_chromozome child["chromozome"] = new_chromozome
new.append(child) new.append(child)
population["individuals"] += new population["individuals"] += new
def mutate(individual) -> None:
"""
Methode qui change un des caractères du chromozome
"""
new = list(individual["chromozome"])
dice = random.randint(1,3)
if dice == 1 and len(new) < 30:
new.insert(random.randint(0, len(new) - 1), chr(random.randint(0, 255)))
elif dice == 2 and len(new) > 4:
new.pop(random.randint(0, len(new) - 1))
else :
new[random.randint(0, len(new) - 1)] = chr(random.randint(0, 255))
individual["chromozome"] = "".join(new)
def mutate_pop(population) -> None: def mutate_pop(population) -> None:
""" """
Methode qui mute une partie de la population selon le taut de mutation Methode qui mute une partie de la population selon le taut de mutation

View file

@ -8,7 +8,7 @@ import lib.ultra_mastermind_pp_imp as libppimp
# constants # constants
PM = "" PM = ""
NG = 500 NG = 500
N = 200 N = 300
TS = 0.5 TS = 0.5
TM = 0.25 TM = 0.25
ALPHA = 0.5 ALPHA = 0.5

View file

@ -1,2 +1,13 @@
contourpy==1.3.1
cycler==0.12.1
fonttools==4.55.0
kiwisolver==1.4.7
Levenshtein==0.26.1 Levenshtein==0.26.1
matplotlib==3.9.2
numpy==2.1.3
packaging==24.2
pillow==11.0.0
pyparsing==3.2.0
python-dateutil==2.9.0.post0
RapidFuzz==3.10.1 RapidFuzz==3.10.1
six==1.16.0

View file

@ -5,6 +5,7 @@ import matplotlib.pyplot as plt
# project libs importations # project libs importations
import lib.ultra_mastermind_obj as libobj import lib.ultra_mastermind_obj as libobj
import lib.ultra_mastermind_imp as libimp import lib.ultra_mastermind_imp as libimp
import lib.ultra_mastermind_pp_imp as libppimp
# Variation du nombre de générations # Variation du nombre de générations
PM = "Hello, world!" PM = "Hello, world!"
@ -13,20 +14,46 @@ N = 400
TS = 0.5 TS = 0.5
TM = 0.25 TM = 0.25
ALPHA = 0.5 ALPHA = 0.5
FITNESS_METHOD = 1 FITNESS_METHOD = 3
fitness_ng = [] fitness_ng = []
all_ng = [] all_ng = []
for i in range(1, 21): for i in range(1, 11):
NG = i * 100 NG = i * 200
all_ng.append(NG) all_ng.append(NG)
pop = libimp.new_population(PM, NG, N, TS, TM, ALPHA, FITNESS_METHOD) pop = libppimp.new_population(PM, NG, N, TS, TM, ALPHA, FITNESS_METHOD)
libimp.run(pop) libppimp.run(pop)
fitness_ng.append(libimp.get_fitness(pop, libimp.get_best(pop))) fitness_ng.append(libppimp.get_fitness(pop, libppimp.get_best(pop)))
plt.plot(all_ng, fitness_ng) plt.plot(all_ng, fitness_ng)
plt.title("Fitness du meilleur individu en fonciton du nombre de générations") plt.title("Fitness du meilleur individu en fonction du nombre de générations")
plt.xlabel("Nombre de générations") plt.xlabel("Nombre de générations")
plt.ylabel("Fitness du meilleur individu") plt.ylabel("Fitness du meilleur individu")
plt.show() plt.show()
# Variation du nombre de générations
PM = "Hello, world!"
NG = 500
# N = 400
TS = 0.5
TM = 0.25
ALPHA = 0.5
FITNESS_METHOD = 3
fitness_n = []
all_n = []
for i in range(1, 11):
N = i * 100
all_n.append(N)
pop = libppimp.new_population(PM, NG, N, TS, TM, ALPHA, FITNESS_METHOD)
libppimp.run(pop)
fitness_n.append(libppimp.get_fitness(pop, libppimp.get_best(pop)))
plt.plot(all_n, fitness_n)
plt.title("Fitness du meilleur individu en fonction de la taille de population")
plt.xlabel("Taille de population")
plt.ylabel("Fitness du meilleur individu")
plt.show()