やってみよう分析!Rで強化学習(Q-learning, ε-greedy行動選択)

のR実装版。強化学習自体の解説は上の記事読んどいたらいい。めんどいのでとりあえずε-greedyのみやった。計算結果は

> Qlearning()
     [,1]     [,2]
[1,]    5 20.00000
[2,]   10  4.99903

となって、上のLINK先と同じなのでコードは間違ってなさそうだ。

以下、全コード。めんどいのでノーコメント。後で昔の俺が未来の俺の首を絞める可能性大だ。

#行動選択
selectAction <- function(s, numA, Qt)
{
  qa <- Qt[s,]
  max_indexes <- (1:length(qa))[qa==max(qa)]
  if(length(max_indexes) == 1){
    max_indexes
  }else{
    max_indexes[sample(length(max_indexes), 1)]
  }
}
epsilonGreedy <- function(epsilon, numA, s, Qt)
{
  if(runif(1) < epsilon)
  {
    sample.int(numA, 1)
  }else{
    selectAction(s, numA, Qt)
  }
}
nextState <- function(s, a)
{  
  ifelse(a==1, ifelse(s==1, 2, 1), s)
}
calcReward <- function(s, a, net)
{
  ifelse(a!=1 && s==1, net, 0)
}
Qlearning <- function()
{
  numA <- 2
  numS <- 2
  alpha <- 0.3
  gamma <- 0.5
  epsilon <- 0.1
  trialMax <- 10000
  stepMax <- 10
  net <- 10
  s = 1
  Qt <- matrix(0, numS, numA)
  
  for(i in 1:trialMax)
  {
    for(j in 1:stepMax)
    {
      a <- epsilonGreedy(epsilon, numA, s, Qt)
      sd <- nextState(s, a)
      reward <- calcReward(s, a, net)
      Qt[s, a] <- (1 - alpha)*Qt[s, a] + alpha*(reward + gamma*max(Qt[sd,]))

      if(reward > 0){
        s <- 1
        break
      } else{
        s <- sd        
      }
    }
  }
  Qt
}