Il s'agit ici de simuler le modèle de Hardy-Weinberg pour un gène avec 2 allèles A et a.
Compléter le code ci-dessous en indiquant la fréquence de p. Puis, cliquer dans la cellule ci-dessous et cliquer sur le bouton "Exécuter".
p = # Indiquer ici la valeur de p
q = 1 - p
Dans la cellule ci-dessous, choisir un nombre d'individus qui sera stocké dans la variable x.
x = # Indiquer ici le nombre d'individus
La commande ci-dessous permet d'importer un module pour générer des nombres pseudo-aléatoires (exécuter la cellule ci-dessous).
import random
La fonction permettant de générer une population comportant x individus est définie ci-dessous (exécuter la cellule).
def generation_population(x):
zygotes = []
i = 0
while i < x:
# Génération du gamète 1
if random.random() < p:
gamete1 = "A"
else:
gamete1 = "a"
# Génération du gamète 2
if random.random() < p:
gamete2 = "A"
else:
gamete2 = "a"
# Formation du zygote et ajout à la population des zygotes
zygotes.append(gamete1+gamete2)
i += 1
return zygotes
Dans la cellule ci-dessous, compléter le code pour utiliser la fonction précédente et afficher le résultat pour une population de 100 individus.
print(generation_population(# Compléter le code ici
Dans la cellule ci-dessous, choisir le nombre de générations au bout duquel on veut regarder la composition de la population.
generation = # Indiquer ici le nombre de générations
Pour connaître la composition de la population au bout de n générations, il faut répéter la fonction précédente n fois.
De plus, comme la composition de la population évolue, il faut à chaque génération dénombrer le nombre d'allèles A et a afin de suivre l'évolution des probabilités p et q.
Compléter le code ci-dessous afin qu'il soit fonctionnel.
evo_p = [p]
evo_q = [q]
j = 0
while j < generation:
zygotes = generation_population(x)
# Dénombrement des allèles A et a
nbA = 0
nba = 0
for i in range(len(zygotes)):
if zygotes[i] == "AA":
nbA += 2
elif zygotes[i] == "aa":
nba += # Compléter ici
else:
nbA += # Compléter ici
nba += # Compléter ici
# Nouvelles valeurs de p et q
p = nbA/(nbA+nba)
q = nba/(nbA+nba)
# Sauvegarde des valeurs de p et q
evo_p.append(p)
evo_q.append(q)
j += 1
Exécuter le code ci-dessous.
import matplotlib.pyplot as plt
plt.plot(range(len(evo_p)), evo_p, label="p : Fréquence de l'allèle A")
plt.plot(range(len(evo_q)), evo_q, label="q : Fréquence de l'allèle a")
plt.legend()
plt.xlabel("Nombre de générations")
plt.ylabel("Fréquence des allèles")
plt.ylim(0, 1)
plt.title('Simulation du modèle de Hardy-Weinberg sur ' + str(generation) +
' générations avec ' + str(x) + ' individus par génération')
plt.show()
Essayer en modifiant p, le nombre d'individus (x) ou le nombre de générations (variable generation dans le code ci-dessous).
Ou alors réessayer en conservant les mêmes valeurs pour voir si le résultat est toujours le même.
# Modifier une ou plusieurs des 4 variables ci-dessous pour observer les changements
p = 0.5
q = 1 - p
x = 100
generation = 100
# =================================================================================== #
evo_p = [p]
evo_q = [q]
j = 0
while j < generation:
zygotes = generation_population(x)
# Dénombrement des allèles A et a
nbA = 0
nba = 0
for i in range(len(zygotes)):
if zygotes[i] == "AA":
nbA += 2
elif zygotes[i] == "aa":
nba += 2
else:
nbA += 1
nba += 1
# Nouvelles valeurs de p et q
p = nbA/(nbA+nba)
q = nba/(nbA+nba)
# Sauvegarde des valeurs de p et q
evo_p.append(p)
evo_q.append(q)
j += 1
# Ci-dessous, le code pour tracer le graphique
plt.plot(range(len(evo_p)), evo_p, label="p : Fréquence de l'allèle A")
plt.plot(range(len(evo_q)), evo_q, label="q : Fréquence de l'allèle a")
plt.legend()
plt.xlabel("Nombre de générations")
plt.ylabel("Fréquence des allèles")
plt.ylim(0, 1)
plt.title('Simulation du modèle de Hardy-Weinberg sur ' + str(generation) +
' générations avec ' + str(x) + ' individus par génération')
plt.show()
Une des hypothèses du modèle de Hardy-Weinberg est que la population est infinie. En quoi peut-on voir ici que c'est une hypothèse importante ?