1

R を使用して単純なグリッド ワールドの q 学習プログラムを作成しています。これが私のグリッド ワールドです。

ここに画像の説明を入力

この単純なグリッドの世界には 6 つの状態があり、状態 1 と状態 6 が開始状態と終了状態です。グリッドの世界をできるだけシンプルに保つために、ファイヤー ピット、壁、風を追加することは避けました。報酬マトリックスの場合、開始状態の値は-0.1、終了状態は+1、残りの状態は0です。開始状態の-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)
  }
}

現在、私のアルゴリズムが開始するとき、エージェントは常に状態 1 から開始します。最初の状態 (R の最初の行) には、Right(R(1,2)) または Up(R(1,4)) のいずれかの 2 つのアクションがあります。ランダムに選択されたアクションがUp (R(1,4))と言う場合、エージェントはアクション Q(4,action) として次の状態に移動します。

しかし、状態 4 (4 行目または R) を考えてみましょう。Right-R(4,2) と Down-R(4,3) の 2 つのアクションがあり、これが私のアルゴリズムに問題を引き起こします。論理的には 5 番目の状態に移動する必要がありますが、上記のコードではアクション 2 を次の状態として使用しています。つまり、5 番目の状態ではなく 2 番目の状態になります。

最終的に、状態行列とアクション行列の次元が同じ(mxm)の場合、私のアルゴリズムは完全に機能しますが、私の問題では、状態行列とアクション行列が異なります(mxn)。この問題の解決策を見つけようとしましたが、$max(Q(s',a'))$ の次の状態を見つけるための論理的なアプローチを見つけることができませんでした。

4

1 に答える 1

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]
于 2016-10-07T05:46:35.853 に答える