Question 0 : Intuition

A mon sens, au fil des générations, la proportion de personnes avec les yeux bleus va diminuer progressivement et que quelque soit la configuration initiale, les individus aux yeux marrons vont prendre le pas sur ceux aux yeux bleus.

Question 1 : Cas d’une petite population

Configuration du seed

#seed
set.seed(42)

Initialisation de la population initiale P0

#Expression de la population P0 sous la forme d'un vecteur de valeurs : 
# 0 -> 2 allèles bleus
# 1 -> 1 allèle bleu et un marron
# 2 -> 2 allèles marron
init_p0=function(BB0,MM0,P,preserve){
  P0 = c()
  P0[1:BB0]=0
  P0[(BB0+MM0+1):P]=1
  P0[(BB0+1):(BB0+MM0)]=2 
  
  # si on veut préserver, on remplace le premier par 2 allèles bleus et le 2ème par 2 allèles marrons
  if(preserve){
    P0[1]=0 
    P0[2]=2
  }
  return(P0)
}

Fonction de choix d’un allèle bleu ou marron

# choix_allele = fonction qui choisir un allèle entre bleu et marron
#sortie : 0 -> allèle bleu choisi 
#         2 -> allèle marron choisi
choix_allele = function(){
  return(ifelse(runif(1)<0.5,0,2))
}

Fonction de génération d’un individu enfant à partir de deux individus parents

# genere_enfant = fonction qui donne l'enfant a partir des parents x1 et x2
# entree : x1 => parent 1
#          x2 => parent 2
# sortie: s = somme des valeurs des deux allèles(mère et père)
genere_enfant = function(x1,x2){
  s = 0
  #Si Xi = 0 alors l'individu a 2 allèles bleus => pas besoin d'aléatoire pour choisir un allèle
  #Si Xi = 2 alors l'individu a 2 allèles marrons => pas besoin d'aléatoire pour choisir un allèle
  #Si Xi = 1 alors l'individu a 1 allèle bleu et 1 marron => Choisir l'un des deux aléatoirement
  if(x1 == 1){
    s = s+choix_allele()
  }else{
    s = s + x1
  }
  if(x2 == 1){
    s = s+choix_allele()
  }else{
    s = s + x2
  }
  s = s / 2
  return(s)
}

Fonctions d’affichage

#affiche les 10 courbes de couleurs(1 pour chaque réalisation), représentant l'évolution au cours des 20 générations du rapport BBi/P
affichage_courbes_bbi=function(bb,mm,BBi,Imax,N){
  xrange = seq(1,Imax,1)

  plot(xrange, BBi[[1]]*100, type="l", xlab=" ième génération",
    ylab="Proportion d'individus aux yeux bleus(%)",ylim = c(0,100)) 

  colors = rainbow(N)


  # ajout des courbes dans le plot
  for (i in 2:N) { 
    lines(xrange, BBi[[i]]*100, type="l", lwd=1.5, col=colors[i]) 
  } 

  # ajout titre et sous-titre
  title("Evolution de la proportion du nombre d'individus aux yeux bleus sur 20 générations",sub=paste("Configuration P0 : ",bb,mm,collapse = ","))
  
  
}

#affichage_courbes_mmi affiche les 10 courbes de couleurs(1 pour chaque réalisation), représentant l'évolution au cours des 20 générations du rapport MMi/P
affichage_courbes_mmi=function(bb,mm,MMi,Imax,N){
  xrange = seq(1,Imax,1)

  plot(xrange, MMi[[1]]*100, type="l", xlab=" ième génération",
    ylab="Proportion d'individus aux yeux marrons(%)",ylim = c(0,100)) 

  colors = rainbow(N)

  # ajout lignes
  for (i in 2:N) { 
    lines(xrange, MMi[[i]]*100, type="l", lwd=1.5, col=colors[i]) 
  } 

  # ajout titre et sous-titre
  title("Evolution de la proportion du nombre d'individus aux yeux marrons sur 20 générations",sub=paste("Configuration P0 : ",bb,mm,collapse = ","))
}

Fonction principale de simulation

simulation=function(bb,mm,P0,Imax,P,N,preserve){
    #population[i][j] = j eme personne de la ieme population
  population = list()
  population[[1]] = P0
  
  #vecteur temporaire qui stocke les enfants
  vect = c()
  
  #BBi = vecteur contenant les valeurs BBi/P pour chacune des 10 réalisations
  BBi = list()
  #MMi = vecteur contenant les valeurs MMi/P pour chacune des 10 réalisations
  MMi = list()
  #initialisation des vecteurs
  for(i in 1:10){
    BBi[i] = 1
    MMi[i] = 1
  }
  
  #realisation = vecteur contenant pour chaque realisation, population[Imax]
  realisation = list()
  
  #Pour chaque realisation (jusqu'à N)
  for(i in 1:N){
    for(j in 1:Imax){
      # Pour chaque population (jusqu'à Imax)
      for(k in 1:P){
        #X = une variable aléatoire représentant le tirage de deux individus dans P.
        X = sample(size = 2, x = population[[j]] , replace = T)
        vect[k]=genere_enfant(X[1],X[2])  
      }
      if(preserve){
        vect[k-1]=0
        vect[k]=2
      }
      population[[j+1]] = vect
      BBi[[i]][j] = sum(population[[j]]==0)/P # proportion d'yeux bleus dans la jème population de la ième réalisation
      MMi[[i]][j] = 1 - BBi[[i]][j] # proportion d'yeux marrons dans la jème population de la ième réalisation
    }
    #sauvegarde des populations générées pour chaque réalisation
    realisation[[i]] = population
  }
  affichage_courbes_bbi(bb,mm,BBi,Imax,N)
  affichage_courbes_mmi(bb,mm,MMi,Imax,N)
  
}

Résultats des différentes configurations de départ

#Configuration 1 P0=(BBi,MMi)=(4,12)
simulation(4,12,init_p0(4,12,20,0),20,20,10,0)

Le premier des deux graphiques présentés ci-dessus montre 10 simulations de l’évolution de la proportion d’individus avec les yeux bleus sur 20 générations. Le second représente 10 simulations de l’évolution de la proportion d’individus avec les yeux marrons sur 20 générations. Dans cette configuration, on peut voir que la proportion d’individus aux yeux bleus est et reste globalement faible(- de 20%) au fil des générations. De facto, la proportion d’individus aux yeux marrons est élevé (+ 80%) quelque soit la génération.

#Configuration 2 P0=(BBi,MMi)=(12,4)
simulation(12,4,init_p0(12,4,20,0),20,20,10,0)

Dans cette configuration, (BB = 12 et MM = 4) on remarque que dans la majorité des réalisations, la proportion d’individus aux yeux bleus baisse au fil des générations (7 réalisations sur 10 font baisser cette proportion). A contrario, la proportion d’individus aux yeux marrons augmente progressivement (6 simulations sur 10 terminent à + de 60%)

#Configuration 3 P0=(BBi,MMi)=(5,5)
simulation(5,5,init_p0(5,5,20,0),20,20,10,0)

Dans cette configuration(BB=5 et MM=5), aucune tendance ne se dégage réellement de ces deux graphiques même si on peut dire que la proportion d’individus aux yeux bleus augmente légèrement en moyenne au fil des générations alors que la proportion d’individus aux yeux marrons à tendence à baisser.

Pour conclure, il semblerait que dans le cas d’une petite population, la configuration de départ, c’est-à-dire la constitution de la population initiale, influe sur l’évolution du nombre d’individus aux yeux bleus et aux yeux marrons. Au regard des configurations 1 et 3 où la proportion d’individus aux yeux marrons est élevé, on aurait pu penser que le nombre d’individus aux yeux bleus allait inévitablement baisser au fil des générations. Or il n’en est rien : En effet, dans la configuration 1, certes la proportion d’individus aux yeux bleus est faible mais elle semble évoluer entre 10 et 20%. Dans la configuration 3, il semblerait même que ce rapport augmente globalement. Je pense cependant que le fait que la population soit petite et que le nombre de générations soit faible, ne permet pas de donner de conclusions sur le comportement de ce système.

Question 2 : Cas d’une grande population

#Configuration 1 P0=(BBi,MMi)=(400,1200)
simulation(400,1200,init_p0(400,1200,2000,0),100,2000,10,0)

Sur les graphiques ci-dessus, on peut distinguer plusieurs choses : Tout d’abord, la proportion d’individus aux yeux bleus varie en moyenne autour de 10 %. On remarque une chute rapide de ce rapport dès les premières générations (chute de 20% à 10%). De même au niveau de la proportion d’individus aux yeux marrons, on observe une hausse rapide de 80% à 90% puis cela varie très peu autour de 90% au fil des générations. Enfin, on observe que plus on avance dans les générations plus les courbes “s’écartent” entre elles, comme si elles s’éloignaient de plus en plus d’une valeur moyenne.

#Configuration 2 P0=(BBi,MMi)=(1200,400)
simulation(1200,400,init_p0(1200,400,2000,0),100,2000,10,0)