使用 R 在 q-learning 中以编程方式查找 max(Q(s',a')) 的下一个状态
Programmaticaly find next state for max(Q(s',a')) in q-learning using R
我正在使用 R 编写一个简单的网格世界 q-learning 程序。这是我的网格世界
这个简单的网格世界有 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))。如果随机 selected 一个动作说 Up (R(1,4)) 然后代理移动到下一个状态作为动作 Q(4,action)。
但是现在考虑状态 4(第四行或 R)它有两个动作 Right-R(4,2) 和 Down-R(4,3) 这会给我的算法带来问题,如果随机 select 一个动作说,对。从逻辑上讲它应该移动到第五状态但是我上面的代码
使用动作 2 作为下一个状态。所以它不会进入第 5 个状态,而是进入第 2 个状态。
最后,如果状态和动作矩阵的维数相同 (m x m),我的算法将完美运行,但在我的问题中,我的状态和动作矩阵不同 (m x n)。我试图找到解决此问题的方法,但未能找到逻辑方法来找到 $max(Q(s',a'))$ 的下一个状态,目前我被卡住了?
(您代码中的注释与您实际执行的操作不符。请始终避免这种情况。)
您将转换矩阵和奖励矩阵混为一谈。对于非随机环境,它们应该看起来像这样:
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]
我正在使用 R 编写一个简单的网格世界 q-learning 程序。这是我的网格世界
这个简单的网格世界有 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))。如果随机 selected 一个动作说 Up (R(1,4)) 然后代理移动到下一个状态作为动作 Q(4,action)。
但是现在考虑状态 4(第四行或 R)它有两个动作 Right-R(4,2) 和 Down-R(4,3) 这会给我的算法带来问题,如果随机 select 一个动作说,对。从逻辑上讲它应该移动到第五状态但是我上面的代码 使用动作 2 作为下一个状态。所以它不会进入第 5 个状态,而是进入第 2 个状态。
最后,如果状态和动作矩阵的维数相同 (m x m),我的算法将完美运行,但在我的问题中,我的状态和动作矩阵不同 (m x n)。我试图找到解决此问题的方法,但未能找到逻辑方法来找到 $max(Q(s',a'))$ 的下一个状态,目前我被卡住了?
(您代码中的注释与您实际执行的操作不符。请始终避免这种情况。)
您将转换矩阵和奖励矩阵混为一谈。对于非随机环境,它们应该看起来像这样:
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]