Code zur Einführung in RL mit n-armigen Banditen.
This commit is contained in:
parent
84c3f80ab0
commit
442e82ce7e
1 changed files with 118 additions and 0 deletions
118
Reinforcement/nBandits.R
Normal file
118
Reinforcement/nBandits.R
Normal file
|
@ -0,0 +1,118 @@
|
|||
#####
|
||||
# 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)
|
Reference in a new issue