This repository has been archived on 2024-01-26. You can view files and clone it, but cannot push or open issues or pull requests.
coding-corner/Reinforcement/nBandits.R

118 lines
4.1 KiB
R

#####
# nBandits: Anzahl der Arme am Banditen
# eps: Explorationswahrscheinlichkeit
# plays: Anzahl der Versuche
#
# Simuliert das n-armige Banditenproblem mit epsilon-greedy-Strategie.
# Gibt die Belohnung für jedes Spiel zurück.
#####
epsBandits<-function(nBandits = 10, eps = .1, plays) {
# Erzeugt Zufallsfunktionen mit unterschiedlichem Mittelwert
bandits <- rnorm(nBandits)
tries <- list() # Speichert die Ergebnisse am jeweiligen Automaten
expected <- rep(0, length(bandits)) # Zwischengespeicherter Erwartungswert
reward <- numeric(plays) # Ergebnisse aller Durchläufe
for (i in seq_along(bandits)) {
tries[i] <- list(NULL)
}
# Es wird der Automat mit dem höchsten Erwartungswert gewählt
# oder zufällig (gleichverteilt) einer der Automaten.
# Anschließend wird der Erwartungswert für den gewählten Automaten
# aktualisiert.
for (i in seq_len(plays)) {
if (runif(1) < eps) {
pick <- sample.int(nBandits, 1)
} else {
pick <- which.max(expected)
}
reward[i] <- rnorm(1, mean = bandits[pick])
tries[[pick]] <- c(tries[[pick]], reward[i])
expected[pick] <- mean(tries[[pick]]) # Einladung zum Optimieren
}
return(reward)
}
#####
# nBandits: Anzahl der Arme am Banditen
# eps: Explorationswahrscheinlichkeit
# plays: Anzahl der Versuche
#
# Simuliert das n-armige Banditenproblem mit epsilon-greedy-Strategie.
# Am Start wird jeder Arm einmal ausprobiert.
# Gibt die Belohnung für jedes Spiel zurück.
#####
epsBanditsPlayFirst<-function(nBandits = 10, eps = .1, plays) {
# Erzeugt Zufallsfunktionen mit unterschiedlichem Mittelwert
bandits <- rnorm(nBandits)
tries <- list() # Speichert die Ergebnisse am jeweiligen Automaten
expected <- rep(0, length(bandits)) # Zwischengespeicherter Erwartungswert
reward <- numeric(plays) # Ergebnisse aller Durchläufe
# Alle Automaten werden ausprobiert
for (i in seq_along(bandits)) {
expected[i] <- rnorm(1, mean = bandits[i])
tries[i] <- expected[i]
reward[i] <- expected[i]
}
# Es wird der Automat mit dem höchsten Erwartungswert gewählt
# oder zufällig (gleichverteilt) einer der Automaten.
# Anschließend wird der Erwartungswert für den gewählten Automaten
# aktualisiert.
for (i in seq((nBandits+1),plays)) {
if (runif(1) < eps) {
pick <- sample.int(nBandits, 1)
} else {
pick <- which.max(expected)
}
reward[i] <- rnorm(1, mean = bandits[pick])
tries[[pick]] <- c(tries[[pick]], reward[i])
expected[pick] <- mean(tries[[pick]]) # Einladung zum Optimieren
}
return(reward)
}
#####
# nBandits: Anzahl der Arme am Banditen
# init: Anfänglicher Erwartungswert für alle Arme
# plays: Anzahl der Versuche
#
# Simuliert das n-armige Banditenproblem mit optimistischer Strategie.
# Gibt die Belohnung für jedes Spiel zurück.
#####
optimisticBandits<-function(nBandits = 10, init = 5, plays) {
# Erzeugt Zufallsfunktionen mit unterschiedlichem Mittelwert
bandits <- rnorm(nBandits)
tries <- list() # Speichert die Ergebnisse am jeweiligen Automaten
expected <- rep(init, length(bandits)) # Zwischengespeicherter Erwartungswert
reward <- numeric(plays) # Ergebnisse aller Durchläufe
for (i in seq_along(bandits)) {
tries[i] <- list(init)
}
# Es wird der Automat mit dem höchsten Erwartungswert gewählt
# oder zufällig (gleichverteilt) einer der Automaten.
# Anschließend wird der Erwartungswert für den gewählten Automaten
# aktualisiert.
for (i in seq_len(plays)) {
pick <- which.max(expected)
reward[i] <- rnorm(1, mean = bandits[pick])
tries[[pick]] <- c(tries[[pick]], reward[i])
expected[pick] <- mean(tries[[pick]]) # Einladung zum Optimieren
}
return(reward)
}
# plays <- 1000
# reward01eps <- epsBandits(plays = plays, eps = 0.1)
# reward0eps <- epsBanditsPlayFirst(plays = plays, eps = 0)
# rewardOpt <- optimisticBandits(plays = plays, init = 5)