Я пишу программу простого мира сетки д-обучение с использованием R. Это мой мир сеткиProgrammaticaly найти следующее состояние для макс (Q (S', а ')) в Q-обучение с использованием R
Этот простой мир сетки имеет 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)
}
}
В настоящее время, когда мой алгоритм запускает агент, всегда начинайте с состояния-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), что вызывает проблему для моего алгоритма и если случайным образом выбрать действие , Правильно. Логически он должен перейти в 5-ое состояние, но мой код использует действие 2 как следующее состояние. поэтому вместо перехода в пятое состояние он переходит во 2-ое состояние.
В конечном итоге мой алгоритм будет работать отлично, если размерность состояний и матриц действия одинаковы (m x m), но в моей задаче мое состояние и матрицы действий различны (m x n). Я попытался найти решение этой проблемы, но не нашел логического подхода для поиска следующего состояния для $ max (Q (s ', a')) $ в настоящее время я застрял?