Partie 1

Joueur biaisé

On suppose que le joueur A joue avec probabilités \(P(A)=(\frac{1}{4},\frac{1}{4},\frac{1}{2})\)

1)Estimer l’espérance de gain du joueur B contre le joueur A lorsque \(P(B)=(\frac{1}{4},\frac{1}{4},\frac{1}{2})\).

nb_parties = 100000


#Simule un coup pour un joueur dont le vecteur de probabilité vaut P(A)=(a,b,c)
coup_joueur = function(a=1/3,b=1/3,c=1/3){
  u = runif(1)
  #if (b+a != 1-c)
    #erreur
  if (u<a){
    #Pierre
    0
  } else if (u<(b+a)){
    #Papier
    1
  } else {
    #Ciseau
    2
  }
}

#Retourne 1 si a a gagné la partie contre b, -1 si a a perdu la partie et 0 en cas de match nul
Partie = function(a=0,b=0){
  if (a==0){
    if(b==2)
      1
    else if(b==1)
      -1
    else
      0
  } else if(a==1){
    if(b==0)
      1 
    else if(b==2)
      -1
    else
      0
  } else {
    if (b==1)
      1
    else if(b==0)
      -1
    else
      0
  }
}

esperance=0
for (i in 1 : nb_parties){
  esperance= esperance + Partie(coup_joueur(1/4,1/4,1/2), coup_joueur(1/4,1/4,1/2))
}

esperance/nb_parties 
## [1] -0.00174

2)Même question lorsque \(P(B)=(\frac{1}{3},\frac{1}{3},\frac{1}{3})\).

esperance=0
for (i in 1 : nb_parties){
  esperance = esperance + Partie(coup_joueur(), coup_joueur(1/4,1/4,1/2))
}

esperance / nb_parties
## [1] 0.00252

3)Estimer l’espérance de gain du joueur B tel que \(P(B)=(x,y,1−x−y)\) lorsque x et y varient entre 0 et 1 par pas de 0.1 ?

i=0
nb_parties = 10000
esperance = 0
result = c()
#x de 0 à 1 avec un pas de 0.1
for(x in (0:10)/10){
  #y de 0 à 1-x avec un pas de 0.1
  for(y in (0:(10-x*10))/10){
    esperance = 0
    for (j in 1 : nb_parties){
       esperance = esperance + Partie(coup_joueur(x,y,(1-x-y)),coup_joueur(1/4,1/4,1/2))
    }
    result[i] = esperance / nb_parties
    i = i+1
  }
}

plot(result)

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

La stratégie optimale serait de toujours jouer pierre.

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).

\(Espérance = 1 * P(Gagner) - 1* P(Perdre)\)

Or \(P(Gagner)=P(B=Pierre)*P(A=Ciseaux) + P(B=Feuille)*P(A=Pierre) + P(B=Ciseaux)*P(A=Feuille) = \frac{1}{2}x + \frac{1}{4} y + \frac{1}{4} (1-x-y)\) comme les tirages de A et B sont indépendant.

Et \(P(Perdre) = P(B=Pierre)*P(A=Feuille) + P(B=Feuille)*P(A=Ciseaux) + P(B=Ciseaux)*P(A=Pierre) = \frac{1}{4}x + \frac{1}{2}y + \frac{1}{4} (1-x-y)\)

Donc \(Espérance = \frac{1}{2}x + \frac{1}{4}y + \frac{1}{4}(1-x-y) - \frac{1}{4}x -\frac{1}{2}y - \frac{1}{4}(1-x-y) = \frac{1}{2}x - \frac{1}{2}y\)

Joueur non biaisé

Mêmes questions que précédement mais lorsque le joueur A est non biaisé, i.e., lorsque \(P(A)=(\frac{1}{3},\frac{1}{3},\frac{1}{3})\)

1)Estimer l’espérance de gain du joueur B contre le joueur A lorsque \(P(B)=(\frac{1}{4},\frac{1}{4},\frac{1}{2})\).

nb_parties = 100000
esperance=0

for (i in 1 : nb_parties){
    esperance = esperance + Partie(coup_joueur(1/4,1/4,1/2), coup_joueur())
}

esperance / nb_parties
## [1] 0.00072

2)Même question lorsque \(P(B)=(\frac{1}{3},\frac{1}{3},\frac{1}{3})\).

nb_parties = 100000
esperance=0

for (i in 1 : nb_parties){
    esperance = esperance +Partie(coup_joueur(), coup_joueur())
}

esperance / nb_parties
## [1] -0.00382

3)Estimer l’espérance de gain du joueur B tel que \(P(B)=(x,y,1−x−y)\) lorsque x et y varient entre 0 et 1 par pas de 0.1 .

i=0
nb_parties = 10000
esperance = 0
result = c()
for(x in (0:10)/10){
  for(y in (0:(10-x*10))/10){
    esperance = 0
    for (j in 1 : nb_parties){
         esperance = esperance + Partie(coup_joueur(x,y,(1-x-y)),coup_joueur())
    }
    result[i] = esperance / nb_parties
    i = i+1
  }
}

plot(result)

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

Peu importe ce que le joueur B joue l’espérance est environ la même.

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).

Comme précédemment mais certaines probabilités ont été modifié.

\(Espérance = 1 * P(Gagner) - 1* P(Perdre)\)

Or \(P(Gagner)=P(B=Pierre)*P(A=Ciseaux) + P(B=Feuille)*P(A=Pierre) + P(B=Ciseaux)*P(A=Feuille) = \frac{1}{3}x + \frac{1}{3} y + \frac{1}{3} (1-x-y)\) comme les tirages de A et B sont indépendant.

Et \(P(Perdre) = P(B=Pierre)*P(A=Feuille) + P(B=Feuille)*P(A=Ciseaux) + P(B=Ciseaux)*P(A=Pierre) = \frac{1}{3}x + \frac{1}{3}y + \frac{1}{3} (1-x-y)\)

Donc \(Espérance = \frac{1}{3}x + \frac{1}{3}y + \frac{1}{3}(1-x-y) - \frac{1}{3}x -\frac{1}{3}y - \frac{1}{3}(1-x-y) = 0\)

Un joueur non biaisé peut-il perdre ? Peut-il gagner ?

Un joueur non biaisé peut perdre ou gagner.

Partie 2

  1. Proposez un algorithme qui “apprenne” les fréquences de jeu d’un adversaire et s’y adapte optimalement en permanence.
nb_parties = 10000
Coup_Robot = function(coups_precedent){
    if(coups_precedent[1]==coups_precedent[2]&& coups_precedent[2]==coups_precedent[3] && coups_precedent[3]==coups_precedent[1]){
      retour=coup_joueur()
    }else if((coups_precedent[3] >= coups_precedent[1] && coups_precedent[3] > coups_precedent[2])){
      retour=0
    }else if ((coups_precedent[1] > coups_precedent[3] && coups_precedent[1] >=coups_precedent[2])){
      retour=1
    }else if ((coups_precedent[2] >= coups_precedent[3] && coups_precedent[2] > coups_precedent[1])){
      retour=2
    }
    
    retour
    
  
  
}  
  
coups_precedent = c(0,0,0)
esperance = 0
result=c()
gain=c()


for (i in 1:nb_parties){
  coup_humain = coup_joueur(1/4,1/4,1/2)
  coup_robot=Coup_Robot(coups_precedent)

  esperance = esperance + Partie(coup_robot,coup_humain)
  coups_precedent[coup_humain+1]= coups_precedent[coup_humain+1]+1
         
  result[i]=esperance / i
  gain[i]=esperance
}
  1. Évaluer le gain de votre algorithme contre un joueur biaisé qui jouerait avec P(A)=(1/4,1/4,1/2). N’hésitez pas à visualiser l’évolution du jeu au cours du temps.
plot(gain)

plot(result)

  1. Votre algorithme a-t-il une chance de battre un humain pas trop bête?

Si l’humain comprend comment le robot fonctionne il pourra gagner à toutes les manches.

Comment pourriez vous simplement l’améliorer ?

Il faudrait rajouter un peu plus de hasard dans la decision du robot. Par exemple soit il utilise son algo de calcul par rapport à ce que l’humain a joué précédement soit il fait un coup normal. Ainsi, il ne va pas faire toujours le même coup, et l’humain ne va pas deviner le coup que le robot va faire. Il pourrait même peut être croire que le robot joue de manière aléatoire si il ne fait pas attention qu’il fait souvent le même coup.

  1. Vous évaluerez la performance de votre nouvel algorithme contre un joueur biaisé qui jouerait avec P(A)=(1/4,1/4,1/2).
Coup_Robot_bis = function(coups_precedent){
  choix=runif(1)
  
  if(choix<0.5){
    retour=coup_joueur()
  }else{
    if(coups_precedent[1]==coups_precedent[2]&& coups_precedent[2]==coups_precedent[3] && coups_precedent[3]==coups_precedent[1]){
      retour=coup_joueur()
    }else if((coups_precedent[3] >= coups_precedent[1] && coups_precedent[3] > coups_precedent[2])){
      retour=0
    }else if ((coups_precedent[1] > coups_precedent[3] && coups_precedent[1] >=coups_precedent[2])){
      retour=1
    }else if ((coups_precedent[2] >= coups_precedent[3] && coups_precedent[2] > coups_precedent[1])){
      retour=2
    }
  }

    retour

} 


coups_precedent = c(0,0,0)
esperance = 0
result=c()
gain=c()


for (i in 1:nb_parties){
  coup_humain = coup_joueur(1/4,1/4,1/2)
  coup_robot=Coup_Robot_bis(coups_precedent)

  esperance = esperance + Partie(coup_robot,coup_humain)
  coups_precedent[coup_humain+1]= coups_precedent[coup_humain+1]+1
         
  result[i]=esperance / i
  gain[i]=esperance
}


plot(gain)

plot(result)

Adapter votre programme et votre étude au jeu Pierre-Papier-Ciseaux-Lézard-Spock.

nb_parties = 100000

#Simule un coup pour un joueur dont le vecteur de probabilité vaut P(A)=(a,b,c,d,e)
coup_joueur_plus = function(a=1/5,b=1/5,c=1/5,d=1/5,e=1/5){
  u = runif(1)
  #if (b+a != 1-c)
    #erreur
  if (u<a){
    #Pierre
    0
  } else if (u<(b+a)){
    #Papier
    1
  } else  if(u < (a+b+c)){
    #Ciseau
    2
  } else if(u<a+b+c+d){
    #Spok
    3
  }else {
    #Lezard
    4
  }
}


#Retourne 1 si a a gagné la partie contre b, -1 si a a perdu la partie et 0 en cas de match nul
Partie_plus = function(a=0,b=0){
  if (a==0){
    if(b==2 || b==4)
      1
    else if(b==1 || b==3)
      -1
    else
      0
  } else if(a==1){
    if(b==0 || b == 3)
      1 
    else if(b==2 || b == 4)
      -1
    else
      0
  } else if (a == 2){
    if (b==1||b==4)
      1
    else if (b==0||b==3)
      -1
    else 
      0
  } else if (a == 3){
    if (b==0||b==2)
      1
    else if (b==1||b==4)
      -1
    else 
      0
  } else {
    if (b==1||b==3)
      1
    else if (b==0||b==2)
      -1
    else 
      0
  }
}

nb_victoires = 0
esperance=0
for (i in 1 : nb_parties){
  p = Partie_plus(coup_joueur_plus(1/5,1/5,1/5,1/5,1/5), coup_joueur_plus(1/6,1/6,1/6,1/6,1/3))
  if (p==1)
    nb_victoires = nb_victoires + 1
  esperance= esperance + p
}

nb_victoires/nb_parties
## [1] 0.39941
esperance/nb_parties 
## [1] -0.00209