Programmaticaly使用R

时间:2016-10-07 04:22:49

标签: r reinforcement-learning q-learning

我正在使用R编写一个简单的网格世界q学习程序。这是我的网格世界

enter image description here

这个简单的网格世界有6个状态,其中状态1和状态6是开始和结束状态。我避免添加火坑,墙壁,风,以保持我的网格世界尽可能简单。对于奖励矩阵,我有起始状态值-0.1和结束状态+1和状态0的其余部分。起始状态的A -0.1奖励是阻止代理返回起始位置。

#Reward and action-value matrix 
Row=state(1:6)
Column=actions(1:4)[Left,Right,Down,Up in that order]

我在R中编写了我的程序,但是当前状态大于第4行时遇到了查找下一状态的问题。 Q矩阵在第4行之后不会更新。

#q-learning example
#https://en.wikipedia.org/wiki/Q-learning

# 2x3 grid world
# S for starting grid G for goal/terminal grid
# actions left right down up
#  4 5 6 state
#########
# [0,0,G]
# [S,0,0]
#########
#  1 2 3 state

#setting seed
set.seed(2016)
#number of iterations
N=10
#discount factor
gamma=0.9

#learning rate
alpha=0.1

#target state
tgt.state=6

#reward matrix starting grid has -0.1 and ending grid has 1
R=matrix( c( NA,  0,  NA,  0,
            -0.1, 0,  NA,  0,
             0,  NA,  NA,  1,
             NA,  0,-0.1, NA,
             0,   1,   0, NA, 
             0,   NA,  0, NA
            ),
          nrow=6,ncol=4,byrow = TRUE) 

#initializing Q matrix with zeros
Q=matrix( rep( 0, len=dim(R)[1]*dim(R)[2]), nrow = dim(R)[1],ncol=dim(R)[2])


for (i in 1:N) {
  ## for each episode, choose an initial state at random
  cs <- 1
  ## iterate until we get to the tgt.state
  while (1) {
    ## choose next state from possible actions at current state
    ## Note: if only one possible action, then choose it;
    ## otherwise, choose one at random
    next.states <- which(R[cs,] > -1)
    if (length(next.states)==1)
      ns <- next.states
    else
      ns <- sample(next.states,1)
    ## this is the update
    Q[cs,ns] <- Q[cs,ns] + alpha*(R[cs,ns] + gamma*max(Q[ns, which(R[ns,] > -1)]) - Q[cs,ns])
    ## break out of while loop if target state is reached
    ## otherwise, set next.state as current.state and repeat      
    if (ns == tgt.state) break
    cs <- ns
    Sys.sleep(0.5)
    print(Q)
  }
}

目前,当我的算法启动时,代理始终从state-1开始。在第一状态(R的第一行)中,有两个动作:Right(R(1,2))或Up(R(1,4))。如果随机选择一个动作说 Up(R(1,4)),则代理移动到下一个状态作为动作Q(4,动作)。

但现在考虑状态-4(第四行或R)它有两个动作Right-R(4,2)和Down-R(4,3)这导致我的算法问题,如果随机选择一个动作说,对。逻辑上它应该移动到第五状态,但我的上面的代码 使用动作2作为下一个状态。因此,不是进入第五州,而是进入第二州。

最后,如果状态和动作矩阵的维度相同(m×m),我的算法将完美地工作,但在我的问题中,我的状态和动作矩阵是不同的(m×n)。我试图找到这个问题的解决方案,但未能找到一个合理的方法来找到$ max的下一个状态(Q(s&#39;,a&#39;))$目前我被卡住了?

1 个答案:

答案 0 :(得分:1)

(代码中的注释与您实际执行的操作不符。请尽量避免这种情况。)

您正在混淆过渡和奖励矩阵。对于非随机环境,它们看起来应该是这样的:

R <- matrix(c(
    -1, -1, -1, -1,
    -1, -1, -1, -1,
    -1, -1, -1, 10,
    -1, -1, -1, -1,
    -1, 10, -1, -1,
    10, 10, -1, -1),
    nrow=6, ncol=4, byrow=T)

T <- matrix(c(
    1, 2, 1, 4,
    1, 3, 2, 5,
    2, 3, 3, 6,
    4, 5, 1, 4,
    4, 6, 2, 5,
    6, 6, 3, 5),
    nrow=6, ncol=4, byrow=T)

ε-贪婪的策略是:

greedy  <- function(s)    which(Q[s,] == max(Q[s,]))
egreedy <- function(s, e) if (runif(1, 0, 1) < e) greedy(s) else sample(1:ncol(Q), 1)
ca <- egreedy(cs, epsilon)

然后选择下一个状态就是:

ns <- T[cs, ca]