diff --git a/Reinforcement/nBandits.R b/Reinforcement/nBandits.R new file mode 100644 index 0000000..9d11cfa --- /dev/null +++ b/Reinforcement/nBandits.R @@ -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)