import random class Couleur : def __init__ (self, g1,g2) : self.g1 = g1 self.g2 = g2 def couleur (self) : """ deux genes differents : marron, deux genes egaux a marron : marron deux genes egaux a bleu : bleu""" if self.g1 != self.g2 : return "marron" elif self.g1 == "marron" : return "marron" else : return "bleu" def __str__ (self) : return self.couleur () def __add__ (self, autre) : """creation d'un fils, on tire au hasard le premier gene parmi ceux de self, on recommence pour le second gene parmi ceux de autre""" n = random.randint (0,1) if n == 0 : g1 = self.g1 else : g1 = self.g2 n = random.randint (0,1) if n == 0 : g2 = autre.g1 else : g2 = autre.g2 return Couleur (g1,g2) def creation_hasard_couleur (proportion_gene_bleu) : """cree un individu au hasard, proportion_gene_bleu est la proportion du gene bleu""" x = random.random () if x <= proportion_gene_bleu : g1 = "bleu" else : g1 = "marron" x = random.random () if x <= proportion_gene_bleu : g2 = "bleu" else : g2 = "marron" return Couleur (g1,g2) def simulation (proportion_gene_bleu, nb_couleur, nb_iteration) : """effectue une simulation en tenant du nombre d'invidu (nb_couleur), du nombre d'iteration (nb_iteration), de la proportion de gene bleu initiale (proportion_gene_bleu), cette proportion est differente de la proportion de gens aux yeux bleus, proportion_gene_bleu est la probabilite du gene bleu face au gene marron""" l = [ creation_hasard_couleur (proportion_gene_bleu) for i in range (0,nb_couleur) ] # on compte les proportions des couleurs des gens au debut # on utilise un dictionnaire prop_couleur = { "bleu":0 , "marron":0 } for c in l : prop_couleur [ c.couleur () ] += 1 print "distribution des couleurs d'yeux a la premiere generation " print prop_couleur for it in range (0, nb_iteration) : e = [] for i in range (0, len (l)) : n1 = random.randint (0, len (l)-1) n2 = random.randint (0, len (l)-1) e.append ( l [n1] + l [n2] ) if it % 100 == 0 : print it / 100, # pour l'avancement l = e # on compte les proportions des couleurs des gens a la fin # on utilise un dictionnaire prop_couleur_fin = { "bleu":0 , "marron":0 } for c in l : prop_couleur_fin [ c.couleur () ] += 1 print "\ndistribution des couleurs d'yeux a la derniere generation " print prop_couleur_fin l = [ 0.1 * (i+1) for i in range (0,9) ] for x in l : print "\nproportion_gene_bleu = ", x simulation (x,1000,1000) # ce programme effectue une simulation de 1000 iterations pour 1000 individus # pour toutes les proportions de gene bleu [ 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9] # l'objectif est de determiner a partir de quel seuil les gens aux yeux bleus ont une chance # de ne pas disparaitre # # pour chaque seuil, une seule simulation de permet de conclure, il faudrait # faire plusieurs centaines de simulation pour chaque seuil et ne conserver que la moyenne # pour avoir un resultat fiable