Programme gene.py


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

créé avec py2html version:0.62