Partie 1

LE JOUEUR BIAISE

1.1

Soit X la variable aléatoire à support 1, 0 et -1 pour le gain l’égalité et la perte. L’espérence de gain du joueur B contre A :

pa = c(1/4, 1/4, 1/2)
pb = c(1/4, 1/4, 1/2)

EX = pa[1]*pb[1]*0 + pa[1]*pb[2]*1 + pa[1]*pb[3]*-1 + pa[2]*pb[1]*-1 + pa[2]*pb[2]*0 + pa[2]*pb[3]*1 + pa[3]*pb[1]*1 + pa[3]*pb[2]*-1 + pa[3]*pb[3]*0

EX
## [1] 0

1.2

pa = c(1/4, 1/4, 1/2)
pb = c(1/3, 1/3, 1/3)

EX = pa[1]*pb[1]*0 + pa[1]*pb[2]*1 + pa[1]*pb[3]*-1 + pa[2]*pb[1]*-1 + pa[2]*pb[2]*0 + pa[2]*pb[3]*1 + pa[3]*pb[1]*1 + pa[3]*pb[2]*-1 + pa[3]*pb[3]*0

EX
## [1] 0

1.3

Faisons varier x et y, l’espérence maximale vaut :

pa = c(1/4, 1/4, 1/2)

EX = c() 
pb = c(0,0,1)
max = pa[1]*pb[1]*0 + pa[1]*pb[2]*1 + pa[1]*pb[3]*-1 + pa[2]*pb[1]*-1 + pa[2]*pb[2]*0 + pa[2]*pb[3]*1 + pa[3]*pb[1]*1 + pa[3]*pb[2]*-1 + pa[3]*pb[3]*0

for (x in 0:10){
  for (y in 0:(10-x)){
    pb = c(x/10, y/10, 1-(x/10)-(y/10))
    if ((EX[x*10+y] = pa[1]*pb[1]*0 + pa[1]*pb[2]*1 + pa[1]*pb[3]*-1 + pa[2]*pb[1]*-1 + pa[2]*pb[2]*0 + pa[2]*pb[3]*1 + pa[3]*pb[1]*1 + pa[3]*pb[2]*-1 + pa[3]*pb[3]*0) > max){
      max = EX[x*10+y]
      xmax = x/10
      ymax = y/10
    }
  }
}

max
## [1] 0.25
xmax
## [1] 1
ymax
## [1] 0
plot(EX)

1.4

L’espérence est maximale pour x = 1 et y = 0. La stratégie optimale pour le joueur B est P(B) = (1, 0, 0).

1.5

E(X) =1/4y + 1/4(1-x-y)-1 + 1/4x-1 + 1/4(1-x-y)1 + 1/2x1 + 1/2y*-1

= y(1/4 + 1/4 - 1/4 - 1/2) + x(1/4 - 1/4 - 1/4 + 1/2) = y(-1/4) + x(1/4)

On a 0<=x, y<=1, cette expréssion est donc maximale pour y = 0 et x = 1.

LE JOUEUR NON BIAISE

1.1

Soit X la variable aléatoire à support 1, 0 et -1 pour le gain l’égalité et la perte. L’espérence de gain du joueur B contre A :

pa = c(1/3, 1/3, 1/3)
pb = c(1/4, 1/4, 1/2)

EX = pa[1]*pb[1]*0 + pa[1]*pb[2]*1 + pa[1]*pb[3]*-1 + pa[2]*pb[1]*-1 + pa[2]*pb[2]*0 + pa[2]*pb[3]*1 + pa[3]*pb[1]*1 + pa[3]*pb[2]*-1 + pa[3]*pb[3]*0

EX
## [1] 0

1.2

pa = c(1/3, 1/3, 1/3)
pb = c(1/3, 1/3, 1/3)

EX = pa[1]*pb[1]*0 + pa[1]*pb[2]*1 + pa[1]*pb[3]*-1 + pa[2]*pb[1]*-1 + pa[2]*pb[2]*0 + pa[2]*pb[3]*1 + pa[3]*pb[1]*1 + pa[3]*pb[2]*-1 + pa[3]*pb[3]*0

EX
## [1] 0

1.3

Faisons varier x et y, l’espérence maximale vaut :

pa = c(1/3, 1/3, 1/3)

EX = c() 
pb = c(0,0,1)
max = pa[1]*pb[1]*0 + pa[1]*pb[2]*1 + pa[1]*pb[3]*-1 + pa[2]*pb[1]*-1 + pa[2]*pb[2]*0 + pa[2]*pb[3]*1 + pa[3]*pb[1]*1 + pa[3]*pb[2]*-1 + pa[3]*pb[3]*0

for (x in 0:10){
  for (y in 0:(10-x)){
    pb = c(x/10, y/10, 1-(x/10)-(y/10))
    if ((EX[x*10+y] = pa[1]*pb[1]*0 + pa[1]*pb[2]*1 + pa[1]*pb[3]*-1 + pa[2]*pb[1]*-1 + pa[2]*pb[2]*0 + pa[2]*pb[3]*1 + pa[3]*pb[1]*1 + pa[3]*pb[2]*-1 + pa[3]*pb[3]*0) > max){
      max = EX[x*10+y]
      xmax = x/10
      ymax = y/10
    }
  }
}

max
## [1] 2.775558e-17
xmax
## [1] 0.2
ymax
## [1] 0.7
plot(EX)

1.4

L’espérence est nulle. Il n’y a donc pas de stratégie optimale pour le joueur B.

1.5

E(X) =1/3y + 1/3(1-x-y)-1 + 1/3x-1 + 1/3(1-x-y)1 + 1/3x1 + 1/3y*-1

= y(1/3 + 1/3 - 1/3 - 1/3) + x(1/3 - 1/3 - 1/3 + 1/3) = y(0) + x(0) = 0

Le joueur non biaisé a théoriquement autant de chance de perdre que de gagner. Mais le fait d’être biaisé lui confère un certain avantage.

Partie 2

2.1

Ce premier algorithme consiste à diminuer de 10% la probabilité de jouer un coup si celui-ci nous a fait perdre, et à l’augmenter de 10% sinon. On réduit ou augmente les deux autres probabilités en conséquence afin de conserver une somme des probabilités égale à 1 (donc +/- 5%).

pb = c(1/3, 1/3, 1/3)
pa = c(1/4, 1/4, 1/2)

coup = function(p = c(1/3, 1/3, 1/3)){
  coup = runif(1)
  if(coup <= p[1]){
    1    #Pierre
  }else if(coup <= p[1] + p[2]){
    2    #Feuille
  }else{
    3    #Ciseau
  }
}

simul = function(N = 100){
  vb = c()
  prec = 0
  for (i in 1:N){
    coup_b = coup(pb)
    coup_a = coup(pa)
    if (coup_b == 1){
      if (coup_a == 2){
        vb[i] = prec - 1
        pb[1] = pb[1] - 0.1
        pb[2] = pb[2] + 0.05
        pb[3] = pb[3] + 0.05
      }
      else if (coup_a == 3){
        vb[i] = prec + 1
        pb[1] = pb[1] + 0.1
        pb[2] = pb[2] - 0.05
        pb[3] = pb[3] - 0.05
      }else if (coup_a == 1){
        vb[i] = prec
      }
    }else if (coup_b == 2){
      if (coup_a == 1){
        vb[i] = prec + 1
        pb[2] = pb[2] + 0.1
        pb[1] = pb[1] - 0.05
        pb[3] = pb[3] - 0.05
      }
      else if (coup_a == 3){
        vb[i] = prec - 1
        pb[2] = pb[2] - 0.1
        pb[1] = pb[1] + 0.05
        pb[3] = pb[3] + 0.05
      }else if (coup_a == 2){
        vb[i] = prec
      }
    }else if (coup_b == 3){
      if (coup_a == 2){
        vb[i] = prec + 1
        pb[3] = pb[3] + 0.1
        pb[2] = pb[2] - 0.05
        pb[1] = pb[1] - 0.05
      }
      else if (coup_a == 1){
        vb[i] = prec - 1
        pb[3] = pb[3] - 0.1
        pb[2] = pb[2] + 0.05
        pb[1] = pb[1] + 0.05
      }
      else if (coup_a == 3){
        vb[i] = prec
      }
    }
    prec = vb[i]
  }
  vb
}

N = 10000
res = simul(N)
plot(res)

res[N]
## [1] 2486

2.2

Le graphique permet de visualiser l’évolution du jeu au cours du temps et d’estimer les gains.

2.3

L’algorithme précédent est assez prévisible en effet il est possible de déduire les coups que celui va jouer. On peut améliorer celui-ci en analysant plus en profondeur les coups jouer par l’adversaire.

La fonction simul, simule un jeu de N partie avec apprentissage du joueur B. A l’instant t, la probabilité que B joue le coup i est le nombre de fois où A à joué le complémentaire de i (exemple feuille(B) et pierre(A)) divisé par le nombre de parties.

pb = c(1/3, 1/3, 1/3)
pa = c(1/4, 1/4, 1/2)

coup = function(p = c(1/3, 1/3, 1/3)){
  coup = runif(1)
  if(coup <= p[1]){
    1    #Pierre
  }else if(coup <= p[1] + p[2]){
    2    #Feuille
  }else{
    3    #Ciseau
  }
}

simul = function(N = 100){
  nbp = 0
  nbf = 0
  nbc = 0
  vb = c()
  prec = 0
  for (i in 1:N){
    coup_b = coup(pb)
    coup_a = coup(pa)
    if(coup_a == 1){
      nbp = nbp + 1
    }else if(coup_a == 2){
      nbf = nbf + 1
    }else{
      nbc = nbc + 1
    }
    pb[1] = nbc / i
    pb[2] = nbp / i
    pb[3] = nbf / i
    if (coup_b == 1){
      if (coup_a == 2){
        vb[i] = prec - 1
      }
      else if (coup_a == 3){
        vb[i] = prec + 1
      }else if (coup_a == 1){
        vb[i] = prec
      }
    }else if (coup_b == 2){
      if (coup_a == 1){
        vb[i] = prec + 1
      }
      else if (coup_a == 3){
        vb[i] = prec - 1
      }else if (coup_a == 2){
        vb[i] = prec
      }
    }else if (coup_b == 3){
      if (coup_a == 2){
        vb[i] = prec + 1
      }
      else if (coup_a == 1){
        vb[i] = prec - 1
      }
      else if (coup_a == 3){
        vb[i] = prec
      }
    }
    prec = vb[i]
  }
  vb
}
N = 10000
res = simul(N)
plot(res)

res[N]
## [1] 760

2.4

On voit sur le graphe représentant la variable aléatoire X, l’évolution du jeu au cours du temps.

Partie 3: Extension spéciale Big Bang Theory

Nous adaptons donc le premier programme de la question 2 pour qu’il fonctionne avec le jeu Pierre - Feuille - Ciseaux - Lézard - Spock. On conserve le même principe d’algorithme : on diminue de 10% la probabilité de jouer un coup si celui-ci nous a fait perdre, et on l’augmente de 10% sinon. On réduit ou augmente les quatre autres probabilités en conséquence afin de conserver une somme des probabilités égale à 1 (donc +/- 2,5%)

pb = c(1/5, 1/5, 1/5, 1/5, 1/5)
pa = c(3/10, 3/10, 1/5, 1/10, 1/10)

coup = function(p = c(1/5, 1/5, 1/5, 1/5, 1/5)){
  coup = runif(1)
  if(coup <= p[1]){
    1    #Pierre
  }else if(coup <= p[1] + p[2]){
    2    #Feuille
  }else if(coup <= p[1] + p[2] + p[3]){
    3    #Ciseaux
  }else if(coup <= p[1] + p[2] + p[4]){
    4    #Lézard
  }else{
    5    #Spock
  }
}

simul = function(N = 100){
  vb = c()
  prec = 0
  for (i in 1:N){
    coup_b = coup(pb)
    coup_a = coup(pa)
    if (coup_b == 1){
      if (coup_a == 2 || coup_a == 5){
        vb[i] = prec - 1
        pb[1] = pb[1] - 0.1
        pb[2] = pb[2] + 0.025
        pb[3] = pb[3] + 0.025
        pb[4] = pb[4] + 0.025
        pb[5] = pb[5] + 0.025
      }else if (coup_a == 3 || coup_a == 4){
        vb[i] = prec + 1
        pb[1] = pb[1] + 0.1
        pb[2] = pb[2] - 0.025
        pb[3] = pb[3] - 0.025
        pb[4] = pb[4] - 0.025
        pb[5] = pb[5] - 0.025
      }else if (coup_a == 1){
        vb[i] = prec
      }
    }else if (coup_b == 2){
      if (coup_a == 3 || coup_a == 4){
        vb[i] = prec - 1
        pb[1] = pb[1] + 0.025
        pb[2] = pb[2] - 0.1
        pb[3] = pb[3] + 0.025
        pb[4] = pb[4] + 0.025
        pb[5] = pb[5] + 0.025
      }else if (coup_a == 1 || coup_a == 5){
        vb[i] = prec + 1
        pb[1] = pb[1] - 0.025
        pb[2] = pb[2] + 0.1
        pb[3] = pb[3] - 0.025
        pb[4] = pb[4] - 0.025
        pb[5] = pb[5] - 0.025
      }else if (coup_a == 2){
        vb[i] = prec
      }
    }else if (coup_b == 3){
      if (coup_a == 1 || coup_a == 5){
        vb[i] = prec - 1
        pb[1] = pb[1] + 0.025
        pb[2] = pb[2] + 0.025
        pb[3] = pb[3] - 0.1
        pb[4] = pb[4] + 0.025
        pb[5] = pb[5] + 0.025
      }else if (coup_a == 2 || coup_a == 4){
        vb[i] = prec + 1
        pb[1] = pb[1] - 0.025
        pb[2] = pb[2] - 0.025
        pb[3] = pb[3] + 0.1
        pb[4] = pb[4] - 0.025
        pb[5] = pb[5] - 0.025
      }else if (coup_a == 3){
        vb[i] = prec
      }
    }else if (coup_b == 4){
      if (coup_a == 1 || coup_a == 3){
        vb[i] = prec - 1
        pb[1] = pb[1] + 0.025
        pb[2] = pb[2] + 0.025
        pb[3] = pb[3] + 0.025
        pb[4] = pb[4] - 0.1
        pb[5] = pb[5] + 0.025
      }else if (coup_a == 2 || coup_a == 5){
        vb[i] = prec + 1
        pb[1] = pb[1] - 0.025
        pb[2] = pb[2] - 0.025
        pb[3] = pb[3] - 0.025
        pb[4] = pb[4] + 0.1 
        pb[5] = pb[5] - 0.025
      }else if (coup_a == 4){
        vb[i] = prec
      }
    }else if (coup_b == 5){
      if (coup_a == 1 || coup_a == 5){
        vb[i] = prec - 1
        pb[1] = pb[1] + 0.025
        pb[2] = pb[2] + 0.025
        pb[3] = pb[3] + 0.025
        pb[4] = pb[4] + 0.025
        pb[5] = pb[5] - 0.1
      }else if (coup_a == 2 || coup_a == 4){
        vb[i] = prec + 1
        pb[1] = pb[1] - 0.025
        pb[2] = pb[2] - 0.025
        pb[3] = pb[3] - 0.025
        pb[4] = pb[4] - 0.025
        pb[5] = pb[5] + 0.1
      }else if (coup_a == 5){
        vb[i] = prec
      }
    }
    prec = vb[i]
  }
  vb
}

N = 1000
res = simul(N)
plot(res)

res[N]
## [1] NA