Question 1

Le joueur biaisé

joueur_biaise1 = function(N=100, manches = 10){
  total = 0  
  esperance_gain_b = 0
  for(j in  1:manches){
   for(i in 1:N){
      a = runif(1,0,1)
      b = runif(1,0,1)
      if(a < 1/4 && b >= 1/4 && b < 1/2){ #a->pierre b->feuille
        esperance_gain_b = esperance_gain_b + 1
      }
      else if(a < 1/4 && b >= 1/2){ #a->pierre b->ciseaux
        esperance_gain_b = esperance_gain_b - 1
      }
      else if(a < 1/2 && a >= 1/4 && b < 1/4){ #a->feuille b->pierre
        esperance_gain_b = esperance_gain_b - 1
      } 
      else if(a < 1/2 && a >= 1/4 && b >= 1/2){ #a->feuille b->ciseaux
        esperance_gain_b = esperance_gain_b + 1
      }
      else if(a >= 1/2 && b < 1/4){ #a->ciseaux b->pierre
        esperance_gain_b = esperance_gain_b + 1
      } 
      else if(a >= 1/2 && b < 1/2 && b >= 1/4){ #a->ciseaux b->feuille
        esperance_gain_b = esperance_gain_b - 1
      }
    }
   total = total + esperance_gain_b
   esperance_gain_b = 0
  }
  print(total/manches)
}

Sur 10 manches de 1000 parties jouées, le joueur B a un résultat d’en moyenne

joueur_biaise1(1000,10)
## [1] 17.5

On peut donc emettre l’hypothèse qu’il n’y a pas de joueur avantagé lorsque P(A) = P(B)

2.

joueur_biaise2 = function(N=100, manches = 10){
  total = 0  
  esperance_gain_b = 0
  for(j in  1:manches){
   for(i in 1:N){
      a = runif(1,0,1)
      b = runif(1,0,1)
      if(a < 1/4 && b >= 1/3 && b < 2/3){ #a->pierre b->feuille
        esperance_gain_b = esperance_gain_b + 1
      }
      else if(a < 1/4 && b >= 2/3){ #a->pierre b->ciseaux
        esperance_gain_b = esperance_gain_b - 1
      }
      else if(a < 1/2 && a >= 1/4 && b < 1/3){ #a->feuille b->pierre
        esperance_gain_b = esperance_gain_b - 1
      } 
      else if(a < 1/2 && a >= 1/4 && b >= 2/3){ #a->feuille b->ciseaux
        esperance_gain_b = esperance_gain_b + 1
      }
      else if(a >= 1/2 && b < 1/3){ #a->ciseaux b->pierre
        esperance_gain_b = esperance_gain_b + 1
      } 
      else if(a >= 1/2 && b < 2/3 && b >= 1/3){ #a->ciseaux b->feuille
        esperance_gain_b = esperance_gain_b - 1
      }
    }
   total = total + esperance_gain_b
   esperance_gain_b = 0
  }
  print(total/manches)
}

On a maintenant P(B)=(1/3,1/3,1/3).

joueur_biaise2(1000,10)
## [1] 0.6

On voit que le résultat est très peu différent du résultat de la première question, on peut donc en déduire que la différence de probabilité n’est pas assez significative pour changer drastiquement l’esperance de B.

3.

joueur_biaise3 = function(){
  pa = c(1/4,1/4,1/2)
  max = 0
  x = 0
  y = 0
  pb = c(x,y,1-x-y)
  Ex=c()
  for(x in 1:10){
      for(y in 1:(10-x)){
        pb = c(x,y,1-x-y)
        Ex[10*x+y] = pa[1]*pb[2] + pa[2]*pb[3] + pa[3]*pb[1] - pa[1]*pb[3] - pa[2]*pb[1] - pa[3]*pb[2]
        if(Ex[10*x+y] > max){
          max = Ex[10*x+y]
          xmax = x/10
          ymax = y/10
        }
      }
  }
  plot(Ex)
  cat("x optimal =", xmax)
  cat("\ny optimal =", ymax)
  cat("\nEsperance obtenue = ", max/10)
}

Cette fonction renvoie les probabilités optimales obtenues par simulation de jouer pierre et feuille (on peut facilement en déduire la probabilité de jouer ciseaux).

joueur_biaise3()

## x optimal = 1
## y optimal = 0
## Esperance obtenue =  0.25

On constate que le vecteur de probabilité assurant la meilleure esperance possible contient une probabilité de jouer Pierre haute et celle de jouer feuille basse. Ce qui est parfaitement logique car l’adversaire joue Ciseaux avec une probabilité supérieure à celle des deux autres choix.

4. La stratégie optimale pour B est donc clairement de jouer un maximum de Pierre pour contrer le Ciseaux du joueur A qui sort avec une probabilité d’un sur 2.

5. E(B) = P(B = 1) - P(B = -1)

= P((B = Pierre && A = Ciseaux) || (B = Feuille && A = Pierre) || (B = Ciseaux && A = Feuille)) - P((B = Pierre && A = Feuille) || (B = Feuille && A = Ciseaux) || (B = Ciseaux && A = Pierre))

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

= x/4 - y/4

On peut décomposer le calcul comme ci dessus car les variables sont indépendantes. On constate par le calcul que l’esperance de B est maximale pour x = 1 et y = 0, ce qui correspond bien à l’observation. Si on remplace x et y par 1/4 ou bien 1/3 on retrouve bien les résultats observés aux premières questions: l’esperance de B est de 0.

Le joueur non biaisé

  1. Ici on a exactement le même cas de figure que la question 2. de la partie “Joueur biaisé” avec P(B)=(1/4,1/4,1/2) et P(A)=(1/3,1/3,1/3). On avait vu que l’ecart de probabilité n’était pas suffisemment grand pour influencer suffisemment l’esperance (qui reste proche de 0).

  2. P(A) = (1/3,1/3,1/3) = P(B)

joueur_non_biaise2 = function(N=100, manches = 10){
  total = 0  
  esperance_gain_b = 0
  for(j in  1:manches){
   for(i in 1:N){
      a = runif(1,0,1)
      b = runif(1,0,1)
      if(a < 1/3 && b >= 1/3 && b < 2/3){ #a->pierre b->feuille
        esperance_gain_b = esperance_gain_b + 1
      }
      else if(a < 1/3 && b >= 2/3){ #a->pierre b->ciseaux
        esperance_gain_b = esperance_gain_b - 1
      }
      else if(a < 2/3 && a >= 1/3 && b < 1/3){ #a->feuille b->pierre
        esperance_gain_b = esperance_gain_b - 1
      } 
      else if(a < 2/3 && a >= 1/3 && b >= 2/3){ #a->feuille b->ciseaux
        esperance_gain_b = esperance_gain_b + 1
      }
      else if(a >= 2/3 && b < 1/3){ #a->ciseaux b->pierre
        esperance_gain_b = esperance_gain_b + 1
      } 
      else if(a >= 2/3 && b < 2/3 && b >= 1/3){ #a->ciseaux b->feuille
        esperance_gain_b = esperance_gain_b - 1
      }
    }
   total = total + esperance_gain_b
   esperance_gain_b = 0
  }
  print(total/manches)
}

Ce qui donne une esperence de gain de

joueur_non_biaise2(1000,10) 
## [1] 18.1

Pour 10 manches de 1000 parties. Les joueurs ayant les mêmes probabilités de faire telle ou telle action il est normal que l’esperance de la partie soit autour de 0 (en réalité l’esperance d’une telle expérience est égale à 0).

joueur_non_biaise3 = function(){
  pa = c(1/3,1/3,1/3)
  max = 0
  x = 0
  y = 0
  pb = c(x,y,1-x-y)
  Ex=c()
  for(x in 1:10){
      for(y in 1:(10-x)){
        pb = c(x,y,1-x-y)
        Ex[10*x+y] = pa[1]*pb[2] + pa[2]*pb[3] + pa[3]*pb[1] - pa[1]*pb[3] - pa[2]*pb[1] - pa[3]*pb[2]
        if(Ex[10*x+y] > max){
          max = Ex[10*x+y]
          xmax = x/10
          ymax = y/10
        }
      }
  }
  plot(Ex)
  cat("x optimal =", xmax)
  cat("\ny optimal =", ymax)
  cat("\nEsperance obtenue = ", max/10)
}

Ici comme les deux joueurs ont les memes probabilités il n’y a pas de vecteur optimal de probabilité assurant un meilleur gain de B.

joueur_non_biaise3()

## x optimal = 0.2
## y optimal = 0.4
## Esperance obtenue =  2.220446e-17
  1. Dans le cas d’un joueur non biaisé il n’y a donc pas de stratégie optimale, on ne peux pas “deviner” ce que le joueur va jouer et donc contrer son jeu. Cette expérience est bien complètement aléatoire.

  2. E(B) = P(B = 1) - P(B = -1)

= P((B = Pierre && A = Ciseaux) || (B = Feuille && A = Pierre) || (B = Ciseaux && A = Feuille)) - P((B = Pierre && A = Feuille) || (B = Feuille && A = Ciseaux) || (B = Ciseaux && A = Pierre))

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

= 0

On peut décomposer le calcul comme ci dessus car les variables sont indépendantes. On constate par le calcul que l’esperance de B est toujours égale à 0 quelque soient x et y ce qui confirme nos hypothèses.

Question 2

1.

apprentissage = function(N=100, manches = 10, pap, paf){
  gain_b=c()
  total = 0
  esperance_gain_b = 0
  pbp = 1/3 #on commence par assigner une valeur aux probabilités de B
  pbf = 1/3
  cat("P(B) initial : P(B)=(",pbp,", ",pbf,", ",1-pbp-pbf,")\n")
  for(j in  1:manches){
   for(i in 1:N){
      a = runif(1,0,1)
      b = runif(1,0,1)
      if(a < pap && b >= pbp && b < pbp+pbf){ #a->pierre b->feuille
        esperance_gain_b = esperance_gain_b + 1
        pbf = pbf + 0.025*pbp + 0.025*(1-pbp-pbf) #B gagne, on doit donc lui augmenter ses chances de jouer Feuille, on prend soin de diminuer les chances de jouer pierre et ciseaux afin que la somme des 3 probabilités vaille 1
        pbp = pbp - 0.025*pbp #Ici on choisi de diminuer les probabilités de 2.5% de leur valeur et la quantité retirée est ajoutée à la probabilité à augmenter ce qui assure que la somme des 3 probabilités reste égal à 1
      }
      else if(a < pap && b >= pbf+pbp){ #a->pierre b->ciseaux
        esperance_gain_b = esperance_gain_b - 1
        pbp = pbp + 0.025*(1-pbp-pbf) #B perd, on baisse donc ses chances de jouer ciseaux au profit des deux autres choix
        pbf = pbf + 0.025*(1-pbp-pbf)
      }
      else if(a < paf+pap && a >= pap && b < pbp){ #a->feuille b->pierre
        esperance_gain_b = esperance_gain_b - 1
        pbf = pbf - 0.025*pbf
        pbp = pbp - 0.025*pbp
      } 
      else if(a < paf+pap && a >= pap && b >= pbf+pbp){ #a->feuille b->ciseaux
        esperance_gain_b = esperance_gain_b + 1
        pbf = pbf - 0.025*pbf
        pbp = pbp - 0.025*pbp
      }
      else if(a >= paf+pap && b < pbp){ #a->ciseaux b->pierre
        esperance_gain_b = esperance_gain_b + 1
        pbf = pbf - 0.025*pbf
        pbp = pbp + 0.025*pbf + 0.025*(1-pbp-pbf)
      } 
      else if(a >= paf+pap && b < pbf+pbp && b >= pbp){ #a->ciseaux b->feuille
        esperance_gain_b = esperance_gain_b - 1
        pbp = pbp + 0.025*pbf + 0.025*(1-pbp-pbf)
        pbf = pbf - 0.025*pbf
      }
      gain_b[i]=esperance_gain_b
    }
   total = total + esperance_gain_b
   esperance_gain_b = 0
  }
  cat("P(B) adapté = (",pbp,", ", pbf, ", ", 1-pbp-pbf,")\n")
  cat("gain final de B =", total/manches)
  cat("\nesperance de B = ", total/(manches*N))
  plot(gain_b)
}

Le joueur A est associé à P(A) = (1/4,1/4,1/2). Ce joueur joue donc plus de ciseaux qu’autre chose, notre algortihme doit donc s’adapter pour jouer un maximum de pierres et un minimum de feuille.

apprentissage(1000,10,1/4,1/4)
## P(B) initial : P(B)=( 0.3333333 ,  0.3333333 ,  0.3333333 )
## P(B) adapté = ( 0.6873334 ,  0.04194994 ,  0.2707167 )
## gain final de B = 148.4
## esperance de B =  0.1484

La courbe représente l’évolution des gains de B au fil du temps sur une manche, on observe une évolution relativement constante.

  1. Si l’humain joue tour a tour pierre feuille et ciseaux de manière à ce que son vecteur de probabilité soit Pa = (1/3,1/3,/3) notre algorithme ne pourra pas le battre avec certitude. On va donc essayer d’implémenter un système permettant de débloquer cette situation.

apprentissage2=function(N,pap,paf){
  compte=c(0,0,0)
  gain_b = c()
  esperance_gain_b = 0
  pbp = 1/3 #on commence par assigner une valeur aux probabilités de B
  pbf = 1/3
  cat("P(B) initial : P(B)=(",pbp,", ",pbf,", ",1-pbp-pbf,")\n")
  for(i in 1:N){
      a = runif(1,0,1)
      b = runif(1,0,1)
      if(a < pap && b >= pbp && b < pbp+pbf){ #a->pierre b->feuille
        esperance_gain_b = esperance_gain_b + 1
        compte[1] = compte[1] +1 #on compte combien de fois l'adversaire a joué telle ou telle action et on joue en fonction des actions précédentes du joueur
      }
      else if(a < pap && b >= pbf+pbp){ #a->pierre b->ciseaux
        esperance_gain_b = esperance_gain_b - 1
        compte[1] = compte[1] +1
      }
      else if(a < pap && b < pbp){ #a->pierre b->pierre
        compte[1] = compte[1] +1
      }
      else if(a < paf+pap && a >= pap && b < pbp){ #a->feuille b->pierre
        esperance_gain_b = esperance_gain_b - 1
        compte[2] = compte[2] +1
      } 
      else if(a < paf+pap && a >= pap && b >= pbf+pbp){ #a->feuille b->ciseaux
        esperance_gain_b = esperance_gain_b + 1
        compte[2] = compte[2] +1
      }
      else if(a < pap+paf && b >= pbf+pbp){ #a->feuille b->feuille
        compte[2] = compte[2] +1
      }
      else if(a >= paf+pap && b < pbp){ #a->ciseaux b->pierre
        esperance_gain_b = esperance_gain_b + 1
        compte[3] = compte[3] +1
      } 
      else if(a >= paf+pap && b < pbf+pbp && b >= pbp){ #a->ciseaux b->feuille
        esperance_gain_b = esperance_gain_b - 1
        compte[3] = compte[3] +1
      }
      else if(a >= paf+pap && b >= pbf+pbp){ #a->ciseaux b->ciseaux
        compte[3] = compte[3] +1
      }
      gain_b[i]=esperance_gain_b
      pbp = compte[3]/i #on ajuste pb en fonction de ce qu l'adversaire a joué
      pbf = compte[1]/i 
    }
  cat("P(B) adapté = (",pbp,", ", pbf, ", ", 1-pbp-pbf,")\n")
  cat("gain final de B =", esperance_gain_b)
  cat("\nesperance de B = ", esperance_gain_b/N)
  plot(gain_b)
}
apprentissage2(1000, 1/4,1/4)
## P(B) initial : P(B)=( 0.3333333 ,  0.3333333 ,  0.3333333 )
## P(B) adapté = ( 0.5 ,  0.252 ,  0.248 )
## gain final de B = 52
## esperance de B =  0.052

On peut constater que cet algorithme est bien moins performant que le premier pour un Pa = (1/4,1/4,1/2).

apprentissage(1000,10,1/3,1/3)
## P(B) initial : P(B)=( 0.3333333 ,  0.3333333 ,  0.3333333 )
## P(B) adapté = ( 0.4355569 ,  0.2673362 ,  0.2971069 )
## gain final de B = -0.3
## esperance de B =  -3e-04

apprentissage2(1000, 1/3, 1/3)
## P(B) initial : P(B)=( 0.3333333 ,  0.3333333 ,  0.3333333 )
## P(B) adapté = ( 0.306 ,  0.358 ,  0.336 )
## gain final de B = 6
## esperance de B =  0.006

Malheureusement ce deuxieme algorithme ne résoud pas le problème et en plus est moins efficace que le premier. Nous n’avons donc pas réussi à créer un algorithme capable de battre un humain qui déciderai de jouer tour à tour pierre, feuille puis ciseaux.