2016-10-07 9 views
1

Я пишу программу простого мира сетки д-обучение с использованием R. Это мой мир сеткиProgrammaticaly найти следующее состояние для макс (Q (S', а ')) в Q-обучение с использованием R

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) 
    } 
} 

В настоящее время, когда мой алгоритм запускает агент, всегда начинайте с состояния-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')) $ в настоящее время я застрял?

ответ

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]