Fonctions:

pccprob = function(ppA,pcaA,pciA,ppB,pcaB,pciB){
  j1 = runif(1,1,100);
  j2 = runif(1,1,100);
  res = 0
  if(j1 <= ppA*100)
    if(j2 >= (ppB+pcaB)*100+1)
      res = 1
  if(j1 > ppA*100 && j1 <= (ppA+pcaA)*100)
    if(j2<=ppB*100)
      res = 1
  if(j1 >= (ppA+pcaA)*100+1)
    if(j2 >=ppB*100+1 && j2 <= (ppB+pcaB)*100)
      res = 1
  res
}
pccN2 = function(N=10000,ppA,pcaA,pciA,ppB,pcaB,pciB){
  res = 0
  for(i in 1:N)
    res = res+pccprob(ppA,pcaA,pciA,ppB,pcaB,pciB);
  res/N
}

fonction1_3 = function(ppA,pcaA,pciA){
  tab = matrix(0,nrow = 11,ncol = 11);
  for(x in 1:11)
  {
    for(y in 1:11)
    {
      x1 = (x-1)/10
      y1 = (y-1)/10
      if((x1+y1)<=1)
        tab[x,y] = pccN2(10000,ppA,pcaA,pciA,x1,y1,1-x1-y1);
      
    }
  }
      
  tab
}

maxtab = function(tab){
  is = 0;
  js = 0;
  max = 0;
  i=0;j=0;
  for( i in 1:nrow(tab))
    for(j in 1:ncol(tab))
    {
      if(tab[i,j] > max)
      {
        max = tab[i,j];
        is = i;
        js = j;
      }
    }
  c('Espérance max,pp,pca :',max,(is-1)/10,(js-1)/10);
  
}

joueurproba = function(pp,pca,pci){
   j1 = runif(1,1,100);
  res = 0
  if(j1 <= pp*100)
    res = 1
  if(j1 > pp*100 && j1 <= (pp+pca)*100)
    res = 2
  if(j1 >= (pp+pca)*100+1)
    res = 3
  res
}

jouertour = function(nbr_papier, nbr_cailloux, nbr_ciseaux)
  {
  
  m = max(nbr_papier,nbr_cailloux,nbr_ciseaux);
  tour = 0;
  if(m == 0)
  {
    tour = runif(1,1,3);
  }
  else
  {
    if(m ==nbr_papier)
    {
      tour = 3;
    }
    else 
    {
      if(m == nbr_cailloux)
      {
        tour = 1;
      }
      else
      {
        if(m == nbr_ciseaux)
          tour = 2
      }
    }
  }
   tour   
    
}

qui_a_gagne = function(a,b)
{
  res = 0
  
  if(a == 1)
    {
      if(b == 2)
        res = 1
      if(b == 3)
        res = 2
  }
  if(a == 2)
    {
      if(b == 3)
        res = 1
      if(b == 1)
        res = 2
  }
  if(a == 3)
    {
      if(b == 1)
        res = 1
      if(b == 2)
        res = 2
  }
  res
}

Q1: première partie (Nous avons remarqué au dernier moment que nous n’avons pas jouer au pierre/feuille/ciseaux mais a papier/cailloux/ciseaux)

  1. On estime l’espérance des gains du joueur B en réalisant un grand nombre d’experience et en divisant le résultat par ce nombre.
pccN2(100000,1/4,1/4,1/2,1/4,1/4,1/2);
## [1] 0.30086
  1. Comme la première question mais en changeant les probabilité
pccN2(100000,1/4,1/4,1/2,1/3,1/3,1/3);
## [1] 0.32334
  1. Pour cette question nous avons écris une fonction qui teste pour toute les valeurs possibles de x et y l’espérance et on regroupe le résultat dans une matrice.
question1_3 = fonction1_3(1/4,1/4,1/2);
  1. Pour répondre à cette question, nous cherchons les indices max dans notre tableau de résultat. Ces derniers correspondent aux proportions de papier et de cailloux avec la proportion de ciseaux = 1- pcailloux - ppapier. Dans notre cas la stratégie optimale est de ne jouer que des cailloux. En effet on peut voir grace aux probabilités que le joueur biaisé a plus de chance de jouer les ciseaux (1/2).
maxtab(question1_3)
## [1] "Espérance max,pp,pca :" "0.4985"                
## [3] "0"                      "1"

Q1 : deuxième partie Pour cette partie nous avons juste remplacer les valeurs dans l’appel de nos fonctions. 1)

pccN2(100000,1/3,1/3,1/3,1/4,1/4,1/2);
## [1] 0.32057
pccN2(100000,1/3,1/3,1/3,1/3,1/3,1/3);
## [1] 0.32204
tab = fonction1_3(1/3,1/3,1/3);
  1. il n’y a pas vraiment de strategie car le joueur d’en face joue avec des probabilités égales.
maxtab(tab)
## [1] "Espérance max,pp,pca :" "0.339"                 
## [3] "0.8"                    "0.1"

Q2:

  1. Voici notre algorithme: Il prend en compte les coups du joueur et joue le coups vainqueur sur celui qui a le plus de probabilité de tomber.
#papier = 1 , cailloux = 2 , ciseaux = 3
test = function()
{
  nbr_papier = 0;
  nbr_cailloux = 0;
  nbr_ciseaux = 0;
  nbr_victoires = 0;
  print('Saisir 1,2 ou 3 papier = 1 , cailloux = 2 , ciseaux = 3 :');
  l = readline();
  while(l != 'exit')
  {
    tour_bot = jouertour(nbr_papier, nbr_cailloux, nbr_ciseaux);
    if ((vainqueur = qui_a_gagne(l,tour_bot)) == 2)
    {
      nbr_victoires = nbr_victoires+1;
      print('Victoire du bot, t es nul !');
    }
    else if(vainqueur == 1)
    {
      print('Victoire');
    }
    else
    {
      print('Egalité');
    }
    if(l == 1)
      nbr_papier = nbr_papier + 1;
    if(l == 2)
      nbr_cailloux = nbr_cailloux + 1;
    if(l == 3)
      nbr_ciseaux = nbr_ciseaux + 1;
    print('Saisir 1,2 ou 3 papier = 1 , cailloux = 2 , ciseaux = 3 :')
    l = readline();
  }
  c('Nombres de victoires du bot:',nbr_victoires);
}
  1. Notre algorithme a approximativement 1/2 de gagner contre un joueur biaisé
test2 = function(N=1000,pp,pca,pci)
{
  i=0;
  nbr_papier = 0;
  nbr_cailloux = 0;
  nbr_ciseaux = 0;
  nbr_victoires = 0;
  while(i<N)
  {
    tour_joueur = joueurproba(pp,pca,pci);
    tour_bot = jouertour(nbr_papier, nbr_cailloux, nbr_ciseaux);
    if ((vainqueur = qui_a_gagne(tour_joueur,tour_bot)) == 2)
    {
      nbr_victoires = nbr_victoires+1;
    }
    if(tour_joueur == 1)
      nbr_papier = nbr_papier + 1;
    if(tour_joueur == 2)
      nbr_cailloux = nbr_cailloux + 1;
    if(tour_joueur == 3)
      nbr_ciseaux = nbr_ciseaux + 1;
    i = i + 1;
  }
  c('Nombres de victoires du bot:',nbr_victoires);
}
test2(10000,1/4,1/4,1/2)
## [1] "Nombres de victoires du bot:" "4977"
  1. Non, un humain pas trop bete peut changer de strategie en cours de partie ce qui induirais notre algorithme en erreur. Pour l’ameliorer on a choisis de réinitialiser les compteurs de coups du joueur tous les 5 tours.

  2. On peut voir que la probabilité de gagner contre un joueur biaisé est descendu mais il est plus efficace contre un joueur humain car on le réinitialise tous les 5 coups. C’est à cause de cette réinitialisation que le taux de victoire a baissé car le joueur biaisé ne change pas de stratégie .

test3 = function(N=1000,pp,pca,pci)
{
  i=0;
  nbr_papier = 0;
  nbr_cailloux = 0;
  nbr_ciseaux = 0;
  nbr_victoires = 0;
  while(i<N)
  {
    tour_joueur = joueurproba(pp,pca,pci);
    tour_bot = jouertour(nbr_papier, nbr_cailloux, nbr_ciseaux);
    if ((vainqueur = qui_a_gagne(tour_joueur,tour_bot)) == 2)
    {
      nbr_victoires = nbr_victoires+1;
    }
    if(tour_joueur == 1)
      nbr_papier = nbr_papier + 1;
    if(tour_joueur == 2)
      nbr_cailloux = nbr_cailloux + 1;
    if(tour_joueur == 3)
      nbr_ciseaux = nbr_ciseaux + 1;
    i = i + 1;
    if(nbr_ciseaux+nbr_cailloux+nbr_papier > 5)
    {
      nbr_cailloux = 0;
      nbr_ciseaux = 0;
      nbr_papier = 0;
    }
  }
  c('Nombres de victoires du bot:',nbr_victoires);
}
test3(10000,1/4,1/4,1/2)
## [1] "Nombres de victoires du bot:" "3042"