Fonction de calcul d’une génération

nextP = function(P, N)
{
  PP = rep(0,3)
  for(i in 1:N)
  {
    pere = sample(1:3,1,prob=P)
    if(pere==3)
      pall = 1
    else if(pere==1)
        pall = 0
    else
      pall = sample(0:1,1)
    mere = sample(1:3,1,prob=P)
    if(mere==3)
      mall = 1
    else if(mere==1)
      mall = 0
    else
      mall = sample(0:1,1)
    PP[pall + mall + 1] = PP[pall + mall + 1] + 1/N
  }
  PP
}

Fonction de test

test = function(p, m, b, it, n, seuil, fnext)
{
  seuil = 1/seuil
  psize = p + 1
  lp = 1;
  PX = c()
  PY = c()
  PC = rep(0,psize*3)
  P = c()
  for(j in 1:n)
  {
    P[1] = m/p
    P[2] = (p-m-b)/p
    P[3] = b/p
    for(i in 1:it)
      P = fnext(P,m+b)
    
    P[1] = P[1]*p
    P[2] = P[2]*p
    P[3] = P[3]*p
    
    if(PC[P[1] + 1] == 0)
    {
      PY[lp] = P[1]
      PX[lp] = 0
      lp = lp + 1
    }
    if(PC[psize + P[2] + 1] == 0)
    {
      PY[lp] = P[2]
      PX[lp] = 1
      lp = lp + 1
    }
    
    if(PC[psize*2 + P[3] + 1] == 0)
    {
      PY[lp] = P[3]
      PX[lp] = 2
      lp = lp + 1
    }
    PC[P[1] + 1] = PC[P[1] + 1] + 1;
    PC[psize + P[2] + 1] = PC[psize + P[2] + 1] + 1;
    PC[psize*2 + P[3] + 1] = PC[psize*2 + P[3] + 1] + 1;
  }
  
  cc = function(cx,cy){
    v = (PC[cy+1+cx*psize]*seuil/(n))
    nnul = function(x){
      for(i in 1:(length(x)))
        if(x[i]<0) x[i] = 0
        else if(x[i]>1) x[i] = 1
        x
    }
    c = rgb(blue=nnul(1-(v*2)^2),green=nnul(1-(v*2-1)^2),red=nnul(1-((1-nnul(1-v))*2-2)^2))
    
    #c = rgb(green=nnul(1-v^2),blue=0,red=nnul(1-((1-nnul(1-v))-1)^2))
    c
  }
  plot.default(PX,PY, col=cc(PX,PY),type = 'p',pch = 15)
}

Intuition: Pour de petite population sur de grand tirage c’est la couleur dominante qui devrait l’emporter en moyenne. Pour de grande population la proportion devrait rester stable au niveau des proportions de départ.

(PC[PY+1+PX*psize]-cmin)/(cmax-cmin) Question 1: Petite Population P=20, I=20

(4,12)

set.seed(15)
test(20,4,12,20,100,0.2,nextP)

La majeur partie du temps les yeux bleus restent les seul, un peu moins souvent la population devient de la forme (0.25,0.5,0.25).

(12,4)

set.seed(15)
test(20,12,4,20,100,0.2,nextP)

De même, les tirages sont symétrique entre marron et bleu donc les résultats sont les même que (4,12) avec les bleus à la place des marron.

(5,5)

set.seed(15)
test(20,5,5,20,100,0.2,nextP)

Lorsque les proportions sont équilibrée, deux choses peuvent se produire: Le plus souvent une couleur l’emporte (le gagnant est aussi souvent l’un ue l’autre) et reste la seule. Et moins souvent la population devient équilibrée, avec une majorité d’allèles mixte. (0.25, 0.5, 0.25)

Question2: Grande population P=2000, I=100

(400,1200)

set.seed(15)
test(2000,400,1200,10,100,0.2,nextP)

On peut voir que les personnes ayant les 2 allèles bleus deviennent majoritaire bien qu’il reste un importante proportion de personne (30-40%) aux allèles mixtes. Si on prends en compte le fait que les allèles bleus sont récessifs, alors cette population à pour la moitié des yeux bleus et la moitiés des yeux marrons.

(1200,400)

set.seed(15)
test(2000,1200,400,10,100,0.2,nextP)

De même mais en inversé bleus et marrons (pour les allèles). Si on prends en compte que le gène bleus est récessif alors 90% de cette population à des yeux marrons et 10% des yeux bleus (même si 40% possèdent au moins une allèle bleu).

(500,500)

set.seed(15)
test(2000,500,500,10,100,0.2,nextP)

Dans ce contexte là on peut voir que la population reste stable et mixte. Elle est de la forme (0.25,0.5,0.25). En prenant en compte que le gène bleus est récessif, 75% de cette population à les yeux marrons et 25% les yeux bleus.

(700,300)

set.seed(15)
test(2000,700,300,10,100,0.2,nextP)

La population reste stable sur les valeurs initiales.

(900,500)

set.seed(15)
test(2000,900,500,10,100,0.2,nextP)

La population passe à l’état (700,1000,300).

(800,400)

set.seed(15)
test(2000,800,400,10,100,0.2,nextP)

La population se rapproche de l’état (700,1000,300).

Question 3: petite population avec préservation P=20,I=2000 Fonction de calcul d’une génération avec préservation

PnextP = function(P, N)
{
  PP = rep(0,3)
  for(i in 1:(N-2))
  {
    pere = sample(1:3,1,prob=P)
    if(pere==3)
      pall = 1
    else if(pere==1)
        pall = 0
    else
      pall = sample(0:1,1)
    mere = sample(1:3,1,prob=P)
    if(mere==3)
      mall = 1
    else if(mere==1)
      mall = 0
    else
      mall = sample(0:1,1)
    PP[pall + mall + 1] = PP[pall + mall + 1] + 1/N
  }
  PP[3] = PP[3] + 1/N
  PP[1] = PP[1] + 1/N
  PP
}

(4,12)

set.seed(15)
test(20,4,12,20,100,0.2,PnextP)

La population est du type (0.25,0.5,0.25) mais les résultats sont relativement étalés autours de cette valeur.

(12,4)

set.seed(15)
test(20,12,4,20,100,0.2,PnextP)

La population est du type (0.25,0.5,0.25) mais les résultats sont relativement étalés autours de cette valeur.

(5,5)

set.seed(15)
test(20,5,5,20,100,0.2,PnextP)

La population varie entre (0.25,0.5,0.25) et (0.33,0.33,0.33).

Pour un petite population, lorsque qu’une allèle a l’avantage elle prenait rapidement le dessus en faisant disparaitre l’autre. Ici non seulemet une allèle ne peut plus disparaitre donc elle peut toujours regrandir en proportion mais en plus 10% de la nouvelle génération est par défaut équilibré ce qui la augmente les chances que le résultat soit plutôt équilibré. Dans ce mode, la population tend vers un équilibre du type (0.25,0.5,0.25).

Question 4: Conclusion Comme selon mon intuition il y a effectivement des zone stable mais contrairement à ce que je pensais il y en a peu (principalement 3: (0.25,0.5,0.25),(0.6,0.4,0.1),(0.1,0.4,0.6)). La chose la plus importante à modifier dans le modèle est le fait qu’une personne ne peut pas être à la fois le père et la mère d’une autre personne, celà engendre je pense une perturbation visible pour les petites populations.