Reinforcement comparison, Pursuit und inkrementelle Updates
This commit is contained in:
parent
442e82ce7e
commit
6782ffebb5
1 changed files with 172 additions and 0 deletions
172
Reinforcement/nBandits2.R
Normal file
172
Reinforcement/nBandits2.R
Normal file
|
@ -0,0 +1,172 @@
|
||||||
|
#####
|
||||||
|
# nBandits: Anzahl der Arme am Banditen
|
||||||
|
# eps: Explorationswahrscheinlichkeit
|
||||||
|
# init: Ausgangswert für die Erwartungswerte
|
||||||
|
# plays: Anzahl der Versuche
|
||||||
|
#
|
||||||
|
# Simuliert das n-armige Banditenproblem mit epsilon-greedy-Strategie.
|
||||||
|
#
|
||||||
|
# Gibt eine Liste mit der Belohnung für jedes Spiel, den Mittelwerten der
|
||||||
|
# Normalverteilungen und den gewählten Banditen zurück.
|
||||||
|
#####
|
||||||
|
epsBandits<-function(nBandits = 10L, eps = .1, init = 0, plays) {
|
||||||
|
# Unterschiedlicher Mittelwert für die Normalverteilungen
|
||||||
|
bandits <- rnorm(nBandits)
|
||||||
|
|
||||||
|
expected <- rep(init, length(bandits)) # Gespeicherter Erwartungswert
|
||||||
|
reward <- numeric(plays) # Ergebnisse aller Durchläufe
|
||||||
|
picks <- numeric(plays) # Aufzeichnung aller Aktionen
|
||||||
|
k <- rep(0L, nBandits) # Zähler für Aktionen
|
||||||
|
|
||||||
|
# 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(expected == max(expected))
|
||||||
|
# Bei Gleichstand wird zufällig aus den Besten gewählt
|
||||||
|
if (length(pick) > 1) {
|
||||||
|
pick <- sample(pick, 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
reward[i] <- rnorm(1, mean = bandits[pick])
|
||||||
|
expected[pick] <- expected[pick] + (reward[i] - expected[pick]) / (k[pick] + 1)
|
||||||
|
picks[i] <- pick
|
||||||
|
k[pick] <- k[pick] + 1
|
||||||
|
}
|
||||||
|
return(list(reward=reward, bandits = bandits, picks = picks))
|
||||||
|
}
|
||||||
|
|
||||||
|
#####
|
||||||
|
# nBandits: Anzahl der Arme am Banditen
|
||||||
|
# eps: Explorationswahrscheinlichkeit
|
||||||
|
# init: Ausgangswert für die Erwartungswerte
|
||||||
|
# alpha: Schrittweitenparameter zur Berechnung des Erwartungswertes
|
||||||
|
# plays: Anzahl der Versuche
|
||||||
|
#
|
||||||
|
# Simuliert das n-armige Banditenproblem mit epsilon-greedy-Strategie.
|
||||||
|
# Zur Schrittweitensteuerung wird alpha statt k verwendet.
|
||||||
|
#
|
||||||
|
# Gibt eine Liste mit der Belohnung für jedes Spiel, den Mittelwerten der
|
||||||
|
# Normalverteilungen und den gewählten Banditen zurück.
|
||||||
|
#####
|
||||||
|
epsBanditsalpha<-function(nBandits = 10L, eps = .1, init = 0, alpha = .1, plays) {
|
||||||
|
# Unterschiedlicher Mittelwert für die Normalverteilungen
|
||||||
|
bandits <- rnorm(nBandits)
|
||||||
|
|
||||||
|
expected <- rep(init, length(bandits)) # Gespeicherter Erwartungswert
|
||||||
|
reward <- numeric(plays) # Ergebnisse aller Durchläufe
|
||||||
|
picks <- numeric(plays) # Aufzeichnung aller Aktionen
|
||||||
|
|
||||||
|
# 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(expected == max(expected))
|
||||||
|
# Bei Gleichstand wird zufällig aus den Besten gewählt
|
||||||
|
if (length(pick) > 1) {
|
||||||
|
pick <- sample(pick, 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
reward[i] <- rnorm(1, mean = bandits[pick])
|
||||||
|
expected[pick] <- expected[pick] + alpha * (reward[i] - expected[pick])
|
||||||
|
picks[i] <- pick
|
||||||
|
}
|
||||||
|
return(list(reward=reward, bandits = bandits, picks = picks))
|
||||||
|
}
|
||||||
|
|
||||||
|
#####
|
||||||
|
# nBandits: Anzahl der Arme am Banditen
|
||||||
|
# eps: Explorationswahrscheinlichkeit
|
||||||
|
# init: Ausgangswert für die Erwartungswerte
|
||||||
|
# alpha: Schrittweitenparameter zur Berechnung des Erwartungswertes
|
||||||
|
# beta: Schrittweitenparameter für Prioritäten
|
||||||
|
# plays: Anzahl der Versuche
|
||||||
|
#
|
||||||
|
# Simuliert das n-armige Banditenproblem mit reinforcement comparison-Strategie.
|
||||||
|
#
|
||||||
|
# Gibt eine Liste mit der Belohnung für jedes Spiel, den Mittelwerten der
|
||||||
|
# Normalverteilungen und den gewählten Banditen zurück.
|
||||||
|
#####
|
||||||
|
rfcompBandits<-function(nBandits = 10L, init = 0, alpha = .1, beta = .1, plays) {
|
||||||
|
# Unterschiedlicher Mittelwert für die Normalverteilungen
|
||||||
|
bandits <- rnorm(nBandits)
|
||||||
|
pref <- rep(0, nBandits)
|
||||||
|
prob <- rep(1/nBandits, nBandits)
|
||||||
|
|
||||||
|
expected <- init # Gespeicherter Erwartungswert
|
||||||
|
reward <- numeric(plays) # Ergebnisse aller Durchläufe
|
||||||
|
picks <- numeric(plays) # Aufzeichnung aller Aktionen
|
||||||
|
|
||||||
|
# Rouletteauswahl proprotional zur jeweiligen Wahrscheinlichkeit
|
||||||
|
for (i in seq_len(plays)) {
|
||||||
|
pick <- which(cumsum(prob) - runif(1) >= 0)[1]
|
||||||
|
reward[i] <- rnorm(1, mean = bandits[pick])
|
||||||
|
picks[i] <- pick
|
||||||
|
|
||||||
|
# Prioritäten mit Ergebnis abgleichen
|
||||||
|
pref[pick] <- pref[pick] + beta * (reward[i] - expected)
|
||||||
|
prob <- exp(pref) / sum(exp(pref))
|
||||||
|
expected <- expected + alpha * (reward[i] - expected)
|
||||||
|
}
|
||||||
|
return(list(reward=reward, bandits = bandits, picks = picks))
|
||||||
|
}
|
||||||
|
|
||||||
|
#####
|
||||||
|
# nBandits: Anzahl der Arme am Banditen
|
||||||
|
# eps: Explorationswahrscheinlichkeit
|
||||||
|
# init: Ausgangswert für die Erwartungswerte
|
||||||
|
# beta: Schrittweitenparameter für Prioritäten
|
||||||
|
# plays: Anzahl der Versuche
|
||||||
|
#
|
||||||
|
# Simuliert das n-armige Banditenproblem mit pursuit-Strategie.
|
||||||
|
#
|
||||||
|
# Gibt eine Liste mit der Belohnung für jedes Spiel, den Mittelwerten der
|
||||||
|
# Normalverteilungen und den gewählten Banditen zurück.
|
||||||
|
#####
|
||||||
|
pursuitBandits<-function(nBandits = 10L, init = 0, beta = .01, plays) {
|
||||||
|
# Unterschiedlicher Mittelwert für die Normalverteilungen
|
||||||
|
bandits <- rnorm(nBandits)
|
||||||
|
pref <- rep(0, nBandits)
|
||||||
|
prob <- rep(1/nBandits, nBandits)
|
||||||
|
|
||||||
|
expected <- rep(init, length(bandits)) # Gespeicherte Erwartungswerte
|
||||||
|
reward <- numeric(plays) # Ergebnisse aller Durchläufe
|
||||||
|
picks <- numeric(plays) # Aufzeichnung aller Aktionen
|
||||||
|
k <- rep(0L, nBandits) # Zähler für Aktionen
|
||||||
|
|
||||||
|
# Rouletteauswahl proprotional zur jeweiligen Wahrscheinlichkeit
|
||||||
|
for (i in seq_len(plays)) {
|
||||||
|
pick <- which(cumsum(prob) - runif(1) >= 0)[1]
|
||||||
|
reward[i] <- rnorm(1, mean = bandits[pick])
|
||||||
|
picks[i] <- pick
|
||||||
|
|
||||||
|
expected[pick] <- expected[pick] + (reward[i] - expected[pick]) / (k[pick] + 1)
|
||||||
|
k[pick] <- k[pick] + 1
|
||||||
|
|
||||||
|
pick <- which(expected == max(expected))
|
||||||
|
if (length(pick) > 1) {
|
||||||
|
pick <- sample(pick, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Greedy-Aktion wahrscheinlicher machen
|
||||||
|
prob[pick] <- prob[pick] + beta * (1 - prob[pick])
|
||||||
|
prob[-pick] <- prob[-pick] + beta * (0 - prob[-pick])
|
||||||
|
}
|
||||||
|
return(list(reward=reward, bandits = bandits, picks = picks))
|
||||||
|
}
|
||||||
|
|
||||||
|
# plays <- 1000
|
||||||
|
# res <- epsBandits(plays = plays, eps = .1)
|
||||||
|
# res <- epsBanditsalpha(plays = plays, eps = .1, alpha = .1)
|
||||||
|
# res <- rfcompBandits(plays = plays, alpha = .1, beta = .1)
|
||||||
|
# res <- pursuitBandits(plays = plays, beta = .01)
|
Reference in a new issue