2016-12-14 5 views
1

제 연구 사례에 문제가 있습니다. gridworld 모델의 강화 학습에 흥미로운 점이 있습니다. 모델은 운동을 위해 7x7 필드의 미로입니다. 필드의 미로를 고려하십시오. 위, 아래, 왼쪽 및 오른쪽 (또는 N, E, S, W) 네 가지 방향이 있습니다. 따라서 대부분의 정책이 있습니다. 많은 사람들이 벽에 부딪 치면서 즉각적인 처벌을받을 때 배제 될 수 있습니다. 추가로 억제 금지 원칙을 적용하면 일반적으로 더 적은 조치가 허용됩니다. 많은 정책은 목표를 달성 한 이후의 부분에서만 또는 그와 동등한 차이가 있습니다.R 프로그램에서 SARSA 코드를 gridworld 모델로 가져 오는 방법은 무엇입니까?

▼ 미국 : 만약 R = 1의 경우 S = G 어떤 허용 이동을 위해, 다른 R = 0, 다른 R = -100 ▼ 초기화 : Q0 (A, S) ~ N (0 장애물 ▼ 보상과 , 0.01)

이 모델을 해결하려면 R 코드를 만들지 만 제대로 작동하지 않습니다.

모델 : 7 × 7, S는 :

[O,O,G,X,O,O,S] 
[O,X,O,X,O,X,X] 
[O,X,O,X,O,O,O] 
[O,X,O,X,O,X,O] 
[O,X,O,O,O,X,O] 
[O,X,O,X,O,X,O] 
[O,O,O,X,O,O,O] 

그래서 내가 (코드 uppon하지이 gridworld 모델에 대한 코드를 수정할 수있는 방법을 알고 싶어 벽 : 터미널 상태, O : 접근 상태, X 상태, G 시작) SARSA 모델을 통해이 모델을 어떻게 해결할 수 있는지 알고 싶습니다.

actions <- c("N", "S", "E", "W") 

x <- 1:7 
y <- 1:7 

rewards <- matrix(rep(0, 49), nrow=7) 

rewards[1, 1] <- 0 
rewards[1, 2] <- 0 
rewards[1, 3] <- 1 
rewards[1, 4] <- -100 
rewards[1, 5] <- 0 
rewards[1, 6] <- 0 
rewards[1, 7] <- 0 
rewards[2, 1] <- 0 
rewards[2, 2] <- -100 
rewards[2, 3] <- 0 
rewards[2, 4] <- -100 
rewards[2, 5] <- 0 
rewards[2, 6] <- -100 
rewards[2, 7] <- -100 
rewards[3, 1] <- 0 
rewards[3, 2] <- -100 
rewards[3, 3] <- 0 
rewards[3, 4] <- -100 
rewards[3, 5] <- 0 
rewards[3, 6] <- 0 
rewards[3, 7] <- 0 
rewards[4, 1] <- 0 
rewards[4, 2] <- -100 
rewards[4, 3] <- 0 
rewards[4, 4] <- -100 
rewards[4, 5] <- 0 
rewards[4, 6] <- -100 
rewards[4, 7] <- 0 
rewards[5, 1] <- 0 
rewards[5, 2] <- -100 
rewards[5, 3] <- 0 
rewards[5, 4] <- 0 
rewards[5, 5] <- 0 
rewards[5, 6] <- -100 
rewards[5, 7] <- 0 
rewards[6, 1] <- 0 
rewards[6, 2] <- -100 
rewards[6, 3] <- 0 
rewards[6, 4] <- -100 
rewards[6, 5] <- 0 
rewards[6, 6] <- -100 
rewards[6, 7] <- 0 
rewards[7, 1] <- 0 
rewards[7, 2] <- 0 
rewards[7, 3] <- 0 
rewards[7, 4] <- -100 
rewards[7, 5] <- 0 
rewards[7, 6] <- 0 
rewards[7, 7] <- 0 

values <- rewards # initial values 

states <- expand.grid(x=x, y=y) 

# Transition probability 
transition <- list("N" = c("N" = 0.8, "S" = 0, "E" = 0.1, "W" = 0.1), 
     "S"= c("S" = 0.8, "N" = 0, "E" = 0.1, "W" = 0.1), 
     "E"= c("E" = 0.8, "W" = 0, "S" = 0.1, "N" = 0.1), 
     "W"= c("W" = 0.8, "E" = 0, "S" = 0.1, "N" = 0.1)) 

# The value of an action (e.g. move north means y + 1) 
action.values <- list("N" = c("x" = 0, "y" = 1), 
     "S" = c("x" = 0, "y" = -1), 
     "E" = c("x" = 1, "y" = 0), 
     "W" = c("x" = -1, "y" = 0)) 

# act() function serves to move the robot through states based on an action 
act <- function(action, state) { 
    action.value <- action.values[[action]] 
    new.state <- state 
     if(state["x"] == 1 && state["y"] == 7 || (state["x"] == 1 && state["y"] == 3)) 
     return(state) 
    # 
    new.x = state["x"] + action.value["x"] 
    new.y = state["y"] + action.value["y"] 
    # Constrained by edge of grid 
    new.state["x"] <- min(x[length(x)], max(x[1], new.x)) 
    new.state["y"] <- min(y[length(y)], max(y[1], new.y)) 
    # 
    if(is.na(rewards[new.state["y"], new.state["x"]])) 
     new.state <- state 
    # 
    return(new.state) 
} 


rewards 

bellman.update <- function(action, state, values, gamma=1) { 
    state.transition.prob <- transition[[action]] 
    q <- rep(0, length(state.transition.prob)) 
    for(i in 1:length(state.transition.prob)) {   
     new.state <- act(names(state.transition.prob)[i], state) 
     q[i] <- (state.transition.prob[i] * (rewards[state["y"],  state["x"]] + (gamma * values[new.state["y"], new.state["x"]]))) 
    } 
    sum(q) 
} 

value.iteration <- function(states, actions, rewards, values, gamma, niter,  n) { 
    for (j in 1:niter) { 
     for (i in 1:nrow(states)) { 
      state <- unlist(states[i,]) 
      if(i %in% c(7, 15)) next # terminal states 
      q.values <- as.numeric(lapply(actions, bellman.update,  state=state, values=values, gamma=gamma)) 
      values[state["y"], state["x"]] <- max(q.values) 
     } 
    } 
    return(values) 
} 

final.values <- value.iteration(states=states, actions=actions,  rewards=rewards, values=values, gamma=0.99, niter=100, n=10) 

final.values 

답변

0

귀하의 처벌은 보상보다 훨씬 큽니다. 에이전트는 보상을 얻으려고 시도하는 것보다 벽에 던져 넣는 것을 선호합니다. 이는 국가 행동 값이 행동의 보상에 따라 매우 낮은 실수로, 심지어 -100보다 낮게 수렴하기 때문에 발생합니다.

enter image description here

값의 테이블은 화상에서 모델 값의 상태를 나타낸다 : 여기

난 (사르 사이 수렴되어야하는 값을 제공한다) 값 반복 시뮬레이션 이루어지는 모델 , 그러나 그것은 (나는 아직 그것을 고치지 않았기 때문에) 거꾸로되어있다.

이 경우, 보상 및 처벌의 가치를 모델과 매우 유사하게 둡니다. -15는 공정한 상태 (벽), 1.0은 공, -100은 블록입니다. 에이전트는 각 동작에 대해 0.0을 얻으며 전환 가능성도 동일합니다.

에이전트가 공에 도달해야하지만 상태를 볼 때 아주 작은 값으로 수렴됩니다. 여기에서 공이있는 인접한 상태의 값이 더 낮다는 것을 알 수 있습니다. 그래서 에이전트는 결코 목표를 달성하지 못한다.

문제를 해결하려면 처벌을 줄이십시오.