Chaque tirage se modélise par une variable aléatoire indépendante suivant une loi de Bernouilli de probabilité pour la machine ou pour la machine .
Dans l’énoncé, la fonction suivante nous est donnée :
Notre intuition nous mène à penser que indique si nous sommes en positif ou en négatif (en terme de gain) lors d’une certaine tentative selon une probabilité . Par exemple si on a une probabilité , on est censé gagner une fois sur deux. Si c’est le cas, alors vaudra . Dans le cas contraire, la valeur sera positive si on a plus perdu que gagné et négative si on a plus gagné que perdu. On peut ainsi nommer cette variable “le regret” car elle représente le fait que notre stratégie nous fait plus gagner qu’une autre. Une “bonne” stratégie est donc une stratégie qui nous permet d’avoir plus de que de . Le but principal étant de sortir du casino avec des gains, on doit donc avoir un négatif (ce qui nous indique que nous avons des gains et non des pertes).
Dans cette stratégie, on commence par alterner les machines entre chaque tentative. Puis, arrivé à un certain nombre d’essai, on regarde quelle machine nous a le plus fait gagner puis on joue ensuite uniquement sur celle qui nous a le plus fait gagner au départ.
Il nous semble que les trajectoire de vont dans un premier temps anormalement varier puis stagner dans un second temps apres . Cette stratégie ne nous parait pas meilleure qu’une stratégie où on decide de jouer seulement sur une machine.
Dans cette stratégie, la machine est sélectionnée selon l’ensemble des tentatives précédentes et selon une probabilité de ce qui fait que l’on a une plus grande chance de continuer à jouer avec la machine qui gagne le plus.
Cette stratégie semble être prometteuse car on n’a plus de chance de jouer avec la machine qui gagne le plus (Sur l’ensemble des tentatives et pas seulement sur les premiers lancers comme pour ) tout en variant parfois de machine.
Cette fois, le choix d’une machine ne suit pas une loi de parametre mais une loi Beta de paramètre Le fonctionnement d’une loi Beta ne nous parait pas très clair pour le moment donc il nous est difficile de juger l’efficacité de cette dernière stratégie pour le moment.
On commence par définir les variables qui nous seront utiles pour les prochains exercices.
set.seed(69)
# On va effectuer 1000 tirages pour chaque stratégie
Tmax = 1000
# Probabilité de succès sur les machines A et B
pA = 0.65
pB = 0.55
simul_strat <- function(m, p) {
# Explications :
# - On simule 1000 tirages avec la stratégie m utilisant une machine
# avec une probabilité de gain p
# - On compte le nombre de succès
# - On calcul le regret pour cette stratégie
succes = sum(rbinom(n = Tmax, size = 1, prob = p) == 1)
print(paste("Nombre de succes =", succes))
regret = pA - succes/Tmax
print(paste("Regret pour la stratégie m", m," = ", round(regret, digits = 5), sep = ""))
}
# Simulation pour la stratégie m1
simul_strat(1,pA)
## [1] "Nombre de succes = 658"
## [1] "Regret pour la stratégie m1 = -0.008"
Au moment de calculer le nombre de tirage réussi pour cette stratégie, on s’attend a obtenir une valeur proche de . En effet, on obtient bien une valeur proche de cela.
# Simulation pour la stratégie m2
simul_strat(2,pB)
## [1] "Nombre de succes = 568"
## [1] "Regret pour la stratégie m2 = 0.082"
Au moment de calculer le nombre de tirage réussi pour cette stratégie, on s’attend a obtenir une valeur proche de . En effet, on obtient une valeur proche de cela.
# Simulation pour la stratégie m3
machineA = 0
machineB = 0
tirages = c()
# On simule cette stratégie sur 1000 tirages
for(i in 1:Tmax){
machine = runif(1)
# machine A
if(machine >= 0.5){
tirages = c(tirages, rbinom(n = 1, size = 1, prob = pA))
machineA = machineA + 1
# machine B
}else{
tirages = c(tirages, rbinom(n = 1, size = 1, prob = pB))
machineB = machineB + 1
}
}
succes = sum(tirages == 1)
regret = pA - succes / Tmax
print(paste("Nombre de succes =", succes))
## [1] "Nombre de succes = 612"
print(paste("Nombre de tirage avec la machine A :", machineA))
## [1] "Nombre de tirage avec la machine A : 501"
print(paste("Nombre de tirage avec la machine B :", machineB))
## [1] "Nombre de tirage avec la machine B : 499"
print(paste("Regret pour la stratégie m3 = ", round(regret, digits = 5), sep = ""))
## [1] "Regret pour la stratégie m3 = 0.038"
On doit donc obtenir un nombre de succès proche de correspondant au calcul de de cette stratégie pour et .
Pour montrer l’intérêt du regret de la stratégie, on va reprendre les codes R précédents et ajouter le calcul de pour les 3 stratégies précédentes.
La formule de consiste a calculer le nombre de réussite d’une stratégie sur le nombre de tirage et de soustraire la valeur obtenue à une probabilité (ici ). Or on voit que dans la premiere stratégie, est toujours proche de car si on idéalise le calcul de dans ce cas là, on obtient . permet donc de comparer la probabilité de gagner de deux stratégies.
De plus, si on idéalise le calcul de Rm(T) pour la deuxieme stratégie, on a or on voit dans le code que est proche de pour la stratégie utilisant que la machine .
On en déduit donc que permet de comparer deux stratégies (ici ). On observe aussi que si est positif, cela veut dire que la stratégie est moins efficace que celle qui utilise que la machine . Au contraire si est négatif, la stratégie se trouve être plus efficace que d’utiliser que la machine .
On pourra aussi remplacer dans le calcul de par la probabilité d’une autre stratégie afin de pouvoir comparer plusieurs autres stratégies entres elles.
library("ggplot2")
library(reshape2)
# Fonction utilitaire pour factoriser le code utilisé dans
# les cas A et B du switch ci dessous
get_df_strat <- function(data, N, p) {
for (i in 1:N) {
# Chaine de caractère pour nommer la colonne
# dans la data frame retournée par casino
colname = paste("Tirage", i, sep = "_")
tirages = rbinom(n = Tmax, size = 1, prob = p)
Rmt = pA - cumsum(tirages) / c(1:Tmax)
d <- data.frame(colname = Rmt)
data[,colname] <- d
}
return(data)
}
# Rappel :
# - pA = 0.65
# - pB = 0.55
# - Tmax = 1000
casino <- function(x) {
N = 100 # Nombre de trajectoires
# Data frame qui va etre renvoyé par la fonction casino
res <- data.frame("t" = 1:Tmax)
switch(x,
# Stratégie m1 - pour obtenir la data frame
# liée à l'utiliation de la machine A
"A" = {
return(get_df_strat(res, N, pA))
},
# Stratégie m2 - pour obtenir la data frame
# liée à l'utilisation de la machine B
"B" = {
return(get_df_strat(res, N, pB))
},
# Stratégie de la question 2
"1" = {
epsilon = 0.05 # On fixe la valeur de epsilon
etude = Tmax * epsilon # Nombre de tirage selon epsilon
# Boucle pour chaque trajectoire
for (j in 1:N) {
tirages = c() # Liste contenant l'ensemble des tirages
alt = 0 # Pour alterner le choix de la machine
compteurA = 0 # Nombre de fois où A est utilisée
compteurB = 0 # Nombre de fois où B est utilisée
proba = 0 # Probabilité de la machine prometteuse
colname = paste("Tirage", j, sep = "_")
# On réalise les premiers tirages selon epsilon
for (i in 1:etude) {
# On alterne les machines à chaque tirage
if (alt %% 2 == 0) {
tirage = rbinom(n = 1, size = 1, prob = pA)
compteurA = compteurA + tirage
} else {
tirage = rbinom(n = 1, size = 1, prob = pB)
compteurB = compteurB + tirage
}
tirages = c(tirages, tirage)
alt = alt + 1
}
# On détermine ensuite quelle machine est la plus prometteuse
if (compteurA >= compteurB) proba = pA else proba = pB
# On joue avec la machine de probabilité proba jusqu'à Tmax
tirages = c(tirages, rbinom(n = Tmax-etude, size = 1, prob = proba))
Rmt = pA - cumsum(tirages) / c(1:Tmax)
d <- data.frame(colname = Rmt)
res[,colname] <- d
}
return(res)
},
"2" = {
# Valeur de epsilon chapeau
epsilon_chap = 0.1
# On réalise les N trajectoires
for (j in 1:N) {
# Compteurs pour choisir la machine utiliser lors d'un tirage
compteurA = 0
compteurB = 0
pMA = 0
pMB = 0
# Liste contenant les resultats
tirages = c()
# Chaine de caractere contenant le nom de la colonne dans la data frame
colname = paste("Tirage", j, sep = "_")
# On réalise les TMax tirages
for(i in 1:Tmax){
# On modifier la probabilité de choisir la machine A ou la machine B selon les tirages précédents
if(compteurA > compteurB){
pMA = 1 - epsilon_chap
pMB = epsilon_chap
}else if(compteurB > compteurA){
pMB = 1 - epsilon_chap
pMA = epsilon_chap
}else{
pMA = 1/2
pMB = 1/2
}
# On tire une valeur afin de determiner la machine qui va etre utilisée
val = runif(1,min=0,max=1)
# Tirage d'une valeur selon la machine utilisée
if(val <= pMA){
tirages = c(tirages, rbinom(n = 1,size=1,prob=pA))
}else{
tirages = c(tirages, rbinom(n = 1,size=1,prob=pB))
}
}
# On sauvegarde la valeur de Rm(t) des tirages obtenus dans la data frame
Rmt = pA-cumsum(tirages)/c(1:Tmax)
d <- data.frame(colname = Rmt)
res[,colname] <- d
}
# On retourne la data frame
res
},
"3"={
# On réalise les N trajectoires
for( j in 1:N){
# Liste des valeurs des tirages
tirages = c()
# Nombre de succès de chaque machine au cours des tirages
success_A = 0
success_B = 0
# Valeur de t au cours des tirages
t = 1
# Chaine de caractere pour nommer la colonne de la data frame
colname = paste("Tirage", j, sep = "_")
# Réalisation des tirages
for( i in 1:Tmax){
# On determine la machine utilisé selon une loi beta
if(rbeta(1, shape1 = success_A, shape2 = t-success_A) >= rbeta(1, shape1 = success_B, shape2 = t-success_B)){
tirages = c(tirages, rbinom(n = 1, size = 1, prob = pA))
success_A = success_A + tirages[t]
}else{
tirages = c(tirages, rbinom(n = 1, size = 1, prob = pB))
success_B = success_B + tirages[t]
}
t = t + 1
}
# On sauvegarde la valeur de Rm(t) des tirages obtenus dans la data frame
RmT = pA-cumsum(tirages)/c(1:Tmax)
d <- data.frame(colname = RmT)
res[,colname] <- d
}
# On retourne la data frame
res
},
stop("valeur de x non valide"))
}
# calcul de la moyenne selon une data frame passée en parametre
moyenne_essai <- function(res){
# Liste contenant la moyenne des Rmt selon t
moy = c()
# On parcourt
for(i in 1:Tmax){
sum = 0
for(j in 2:101){
# On somme chaque valeur
sum = sum + res[i,j]
}
# On calcul la moyenne
moy = c(moy,sum/100)
}
# On retourne une data frame contenant la moyenne pour chaque t
mean <- data.frame("t"= 1:Tmax, "moyenne"= moy)
mean
}
Execution de la stratégie
# Simulation
resA = casino("A")
moyenne = moyenne_essai(resA)
resA <- melt(resA, id.vars = 't', variable.name = 'essais')
# Plot de la simulation
ggplot(resA, aes(t,value)) + geom_line(alpha=0.1) + geom_line(moyenne,mapping = aes(x=t,y=moyenne,colour="red")) + ggtitle("RmA(t) au cours du temps t") + theme(legend.position="none") + labs(y="p_opt-Gt/t", x = "t")
Execution de la stratégie
# Simulation
resB = casino("B")
moyenne = moyenne_essai(resB)
resB <- melt(resB, id.vars = 't', variable.nam = 'essai')
# Plot de la simulation
ggplot(resB, aes(t,value)) + geom_line(alpha=0.1) + geom_line(moyenne,mapping = aes(x=t,y=moyenne,colour="red")) + ggtitle("RmB(t) au cours du temps t") + theme(legend.position="none") +
labs(y="p_opt-Gt/t", x = "t")
# Simulation Question 2
res = casino("1")
moyenne = moyenne_essai(res)
res <- melt(res, id.vars = 't', variable.nam = 'essai')
# Plot de la simulation de la question 2
ggplot(res, aes(t,value)) + geom_line(alpha=0.1) + geom_line(moyenne,mapping = aes(x=t,y=moyenne,colour="red")) + ggtitle("RmL(t) au cours du temps t") + theme(legend.position="none") +
labs(y="p_opt-Gt/t", x = "t")
On voit que la moyenne des trajectoires (en rouge sur la graphe) est proche de 0 et qu’elle est même légérement au dessus de . La valeur de est ainsi positive. Donc la stratégie est moins efficace que la stratégie visant à n’utiliser que la machine . Cependant, on voit qu’il y a de grand écart entre certaine trajectoires, un écart d’environ . On en déduit que ces écarts sont surement du au choix de la machine. Les trajectoires utilisant la machine B sont surement ceux aboutissant à un positif à presque . Alors que les valeurs de des trajectoires utilsant la machine A sont proches de et parfois négatif. On en deduit donc que la stratégie est parfois plus efficace que de jouer seulement avec la machine .
# Simulation Qestion 3
res2 = casino("2")
moyenne = moyenne_essai(res2)
res2 <- melt(res2, id.vars = 't', variable.nam = 'essai')
# Plot de la simulation de la question 3
ggplot(res2, aes(t,value)) + geom_line(alpha=0.1) + geom_line(moyenne,mapping = aes(x=t,y=moyenne,colour="red")) +
ggtitle("RmT(t) au cours du temps t") + theme(legend.position="none") +
labs(y="p_opt-Gt/t", x = "t")
On regarde d’abord la moyenne (en rouge), cette dernière est toujours au dessus de . on en deduit que la stratégie est bien moins efficace que de jouer que avec la machine . De plus, quasi aucune trajectoire n’est inferieure à (quand on tend vers , il n’y a plus du tout de trajectoire inférieure à ). Cela renforce l’idée que cette stratégie est bien moins efficace.
# Simulation Question 4
res3 = casino("3")
moyenne = moyenne_essai(res3)
res3 <- melt(res3, id.vars = 't', variable.name = 'essai')
# Plot de la simulation de la question 4
ggplot(res3, aes(t,value)) + geom_line(alpha=0.1) + geom_line(moyenne,mapping = aes(x=t,y=moyenne,colour="red")) + ggtitle("RmT(t) au cours du temps t") + theme(legend.position="none") + labs(y="p_opt-Gt/t", x = "t")
On observe que la moyenne(en rouge sur le graphe) est superieur à donc on en déduis que cette stratégie est aussi moins efficace que . Certaines trajectoires sont moins efficaces que mais d’autres terminent avec un négatif ce qui signifie que parfois, cette stratégie peut amener à gagner plus qu’avec . L’écart entre l’ensemble des trajectoires est très faible. On en déduit donc que cette stratégie est trés proche de .
Après une première lecture du sujet, nous pensions qu’au moins une de ces trois stratégies serait plus efficace que . Au final, nous constatons que ces stratégies peuvent avoir une valeur de négative pour certaines trajectoires signifiant que la probabilité de gagner était supérieur à (probabilité de ). Cependant ces stratégies sont dans la plupart des cas moins fiables que celle consistant à jouer seulement avec la machine . On en conclu qu’au casino, il n’existe pas de réelle stratégie pour augmenter ses gains. Il serait peut être préférable de laisser tomber les machine à sous pour tester le poker.