Q1

1

Estimer l’espérance de gain du joueur BB contre le joueur AA lorsque P(B)=(1/4,1/4,1/2)P(B)=(1/4,1/4,1/2).

Je fais deux runif de 0 à 4, 0~1:P(Pierre)=1/4, 1~2:P(Feuille)=1/4, 2~4:P(Ciseaux)=1/2

##1
fun1<-function(){
a=runif(1,min=0,max=4)
b=runif(1,min=0,max=4)
if(a>2 && a<=4){
  if(b>0 && b<=1){return(1) }
  else if(b>1 && b<=2){ return(0)}
  else if (b>2 && b<=4){return(0)}
}
else if(a>1 && a<=2){
  if(b>0 && b<=1){return(0) }
  else if(b>1 && b<=2){return(0) }
  else if (b>2 && b<=4){ return(1)}
}
else if(a>0 && a<1){
  if(b>0 && b<=1){return(0)}
  else if(b>1 && b<=2){return(1)}
  else if (b>2 && b<=4){return(0) }
}
}

test1<-function(N){
  z=c()
  sum=0
  for(i in 1:N){
    z[i]<-fun1()
    sum=sum+z[i]
  }
  sum
}
x=test1(100000)
print(x/100000)
## [1] 0.31183
#0.31

2

Même question lorsque P(B)=(1/3,1/3,1/3)P(B)=(1/3,1/3,1/3).

fun2<-function(){
  a=runif(1,min=0,max=4)
  b=runif(1,min=0,max=3)
  if(a>2 && a<=4){
    if(b>0 && b<=1){ return(0) }
    else if(b>1 && b<=2){ return(1)}
    else if (b>2 && b<=3){ return(0)}
  }
  else if(a>1 && a<=2){
    if(b>0 && b<=1){ return(1)}
    else if(b>1 && b<=2){ return(0)}
    else if (b>2 && b<=3){ return(0)}
  }
  else if(a>0 && a<1){
    if(b>0 && b<=1){return(0)}
    else if(b>1 && b<=2){return(0)}
    else if (b>2 && b<=3){ return(1)}
  }
}

test2<-function(N){
  z=c()
  sum=0
  for(i in 1:N){
    z[i]<-fun2()
    sum=sum+z[i]
  }
  sum
}

x=test2(10000)
print(x/10000)
## [1] 0.3374
#0.33

3

Estimer l’espérance de gain du joueur BB tel que P(B)=(x,y,1−x−y)P(B)=(x,y,1−x−y) lorsque xx et yy varient entre 00 et 11 par pas de 0.10.1 ?

fun3<-function(x,y){
  bmax=1/(x*y)
  a=runif(1,min=0,max=4)
  b=runif(1,min=0,max=bmax)
  if(a>2 && a<=4){
    if(b>0 && b<=bmax*x){ return(1)}
    else if(b>bmax*x && b<=bmax*(x+y)){ return(0) }
    else if (b>bmax*(x+y) && b<=bmax){ return(0)}
  }
  else if(a>1 && a<=2){
    if(b>0 && b<=bmax*x){ return(0)}
    else if(b>bmax*x && b<=bmax*(x+y)){ return(0)}
    else if (b>bmax*(x+y) && b<=bmax){ return(1) }
  }
  else if(a>0 && a<1){
    if(b>0 && b<=bmax*x){ return(0)}
    else if(b>bmax*x && b<=bmax*(x+y)){ return(1)}
    else if (b>bmax*(x+y) && b<=bmax){ return(0) }
  }
}

test3<-function(x,y,N){
  z=c()
  sum=0
  for(i in 1:N){
    z[i]<-fun3(x,y)
    sum=sum+z[i]
  }
  sum
}

test3_x_y<-function(N){
  for(i in 1:9){
    for(j in 1:9){
      if(i+j <10){
        result=test3(i/10,j/10,N)/N
        cat("i = ",i/10, " j = ",j/10 ," E = ",result," \n")
        
      }
    }
  }
}

test3_x_y(10000)
## i =  0.1  j =  0.1  E =  0.2769  
## i =  0.1  j =  0.2  E =  0.2765  
## i =  0.1  j =  0.3  E =  0.2671  
## i =  0.1  j =  0.4  E =  0.2746  
## i =  0.1  j =  0.5  E =  0.2802  
## i =  0.1  j =  0.6  E =  0.268  
## i =  0.1  j =  0.7  E =  0.2756  
## i =  0.1  j =  0.8  E =  0.2744  
## i =  0.2  j =  0.1  E =  0.3024  
## i =  0.2  j =  0.2  E =  0.2968  
## i =  0.2  j =  0.3  E =  0.2954  
## i =  0.2  j =  0.4  E =  0.2987  
## i =  0.2  j =  0.5  E =  0.3079  
## i =  0.2  j =  0.6  E =  0.3018  
## i =  0.2  j =  0.7  E =  0.3009  
## i =  0.3  j =  0.1  E =  0.3295  
## i =  0.3  j =  0.2  E =  0.3295  
## i =  0.3  j =  0.3  E =  0.3267  
## i =  0.3  j =  0.4  E =  0.3281  
## i =  0.3  j =  0.5  E =  0.3261  
## i =  0.3  j =  0.6  E =  0.3169  
## i =  0.4  j =  0.1  E =  0.3527  
## i =  0.4  j =  0.2  E =  0.3569  
## i =  0.4  j =  0.3  E =  0.3538  
## i =  0.4  j =  0.4  E =  0.3553  
## i =  0.4  j =  0.5  E =  0.3476  
## i =  0.5  j =  0.1  E =  0.3796  
## i =  0.5  j =  0.2  E =  0.3733  
## i =  0.5  j =  0.3  E =  0.3708  
## i =  0.5  j =  0.4  E =  0.3722  
## i =  0.6  j =  0.1  E =  0.3991  
## i =  0.6  j =  0.2  E =  0.3965  
## i =  0.6  j =  0.3  E =  0.3963  
## i =  0.7  j =  0.1  E =  0.4214  
## i =  0.7  j =  0.2  E =  0.4219  
## i =  0.8  j =  0.1  E =  0.4535

4

Déduisez-en la stratégie optimale pour le joueur B.

Pour le joueur B, on peut trouver la strategie optimale dans la reponse 3, quand x=0.8, y=0.1, il a l’esperance maximal–0.45 Parce que A a 1/2 proba de jouer ciseau, donc B doit jouer pierre autant que possible

5

Retrouver et vérifier les résultats précédents à l’aide d’un calcul exact de ces espérances (i.e, en obtenant une formule dépendant de x et de y).

A(1/4,1/4,1/2)
B(x,y,1-x-y)
E = P = 1/4y + 1/4(1-x-y) + 1/2x
=1/4
y + 1/4 -1/4x -1/4y +1/2x
=1/4 + 1/4
x

Quand x=0.9 , E est le maximum, E(max)= 1/4 + 1/4*9/10=0.475

6

Le joueur non biaisé Mêmes questions que précédemment mais lorsque le joueur A est non biaisé, i.e., lorsque P(A)=(1/3,1/3,1/3)P(A)=(1/3,1/3,1/3). Un joueur non biaisé peut-il perdre ? Peut-il gagner ?

A(1/3,1/3,1/3)
B(x,y,1-x-y)
E = P = 1/3y + 1/3(1-x-y) + 1/3*x
= 1/3
il est equitable pour joueur A et B , l’esperance est 0.33

Q2

Notre objectif est maintenant de créer un programme qui arrive à gagner contre un joueur humain. Nous savons que les humains jouent mal au hasard et peuvent en particulier avoir du mal à maintenir l’uniformité. ##1 Proposez un algorithme qui “apprenne” les fréquences de jeu d’un adversaire et s’y adapte optimalement en permanence.

Si on joue contre un humain, on ne peut pas joue avec la Probailite(0.1,0.8,0.1)
Donc si on apprenne les frequences d’un adversaire P=(a,b,c), on joue comme P=(b,c,a)

alg_q2<-function(a,b,c){
  #P=c*x + a*y+b*z
  l=c()
  x=c
  y=a
  z=b
  l[1]<-x
  l[2]<-y
  l[3]<-z
  l
}

2

Évaluer le gain de votre algorithme contre un joueur biaisé qui jouerait avec P(A)=(1/4,1/4,1/2)P(A)=(1/4,1/4,1/2). N’hésitez pas à visualiser l’évolution du jeu au cours du temps.

testq2<-function(a,b,c){
  l=alg_q2(a,b,c)
  cmax=1/(a*b*c)
  x=l[1]
  y=l[2]
  z=l[3]
  A=runif(1,min=0,max=cmax)
  B=runif(1,min=0,max=cmax)
  if(0<A && A<=cmax*a){
    if(0<B && B<=cmax*x)
      return(0)
    else if(cmax*x < B && B<=cmax*(x+y))
      return(1)
    else if(cmax*(x+y)< B && B<= cmax)
      return(0)
  }
  else if(cmax*a<A && A<=cmax*(a+b)){
    if(0<B && B<=cmax*x)
      return(0)
    else if(cmax*x < B && B<=cmax*(x+y))
      return(0)
    else if(cmax*(x+y)< B && B<= cmax)
      return(1)
  }
  else if(cmax*(a+b)<A && A<=cmax){
    if(0<B && B<=cmax*x)
      return(1)
    else if(cmax*x < B && B<=cmax*(x+y))
      return(0)
    else if(cmax*(x+y)< B && B<= cmax)
      return(0)
  }
}
testq2_2<-function(N){
  p=c()
  sum=0
  total=0
  for(i in 1:N){
    p[i]=testq2(1/4,1/4,1/2)
    sum=sum+p[i]
    total=total+1
    if(p[i]==1)
    cat("B win, win rate is ",sum/total,"\n")
    else
      cat("B doesn't win, win rate is ",sum/total,"\n")
  }
}
testq2_2(20)
## B doesn't win, win rate is  0 
## B win, win rate is  0.5 
## B doesn't win, win rate is  0.3333333 
## B doesn't win, win rate is  0.25 
## B doesn't win, win rate is  0.2 
## B doesn't win, win rate is  0.1666667 
## B win, win rate is  0.2857143 
## B win, win rate is  0.375 
## B doesn't win, win rate is  0.3333333 
## B win, win rate is  0.4 
## B doesn't win, win rate is  0.3636364 
## B win, win rate is  0.4166667 
## B win, win rate is  0.4615385 
## B win, win rate is  0.5 
## B win, win rate is  0.5333333 
## B doesn't win, win rate is  0.5 
## B win, win rate is  0.5294118 
## B win, win rate is  0.5555556 
## B win, win rate is  0.5789474 
## B doesn't win, win rate is  0.55

3

Votre algorithme a-t-il une chance de battre un humain pas trop bête? Comment pourriez-vous simplement l’améliorer?

J’ai trouve dans la reponse de Q1, il y a une probleme que si un humain pas trop bete avec le P(1/4,1/4,1/2), il va trouver que mon alg de Q1 joue avec le P(0.8,0.1,0.1). donc il va jouer avec le P(0.1,0.8,0.1) C’est pourquoi dans la reponse Q2-1, je cree un nouveau alg.

4

Vous évaluerez la performance de votre nouvel algorithme contre un joueur biaisé qui jouerait avec P(A)=(1/4,1/4,1/2)P(A)=(1/4,1/4,1/2).

Meme response que Q2-2

Q3 (bonus au choix):

Extension spéciale Big Bang Theory
Adapter votre programme et votre étude au jeu Pierre-Papier-Ciseaux-Lézard-Spock.
Désoleé, mon algo n’est pas très intéressant pour les questions.
Peut-etre on peut utiliser machine-learning pour analyser et augmenter la probabilité, mais en général, il est juste.