Q-Learning por Anderson

Implementação do Q-learning para a disciplina de Aprendizagem de Máquina por Anderson Rocha Tavares (artavares .at. inf .dot. ufrgs.br). Implementado em NetLogo 4.1.3.

O applet requer Java 5 or maior para funcionar. Aparentemente não funciona mais para os browsers no Linux... de qualquer maneira, você pode copiar o código .nlogo e executá-lo no NetLogo 4.1.3


powered by NetLogo

ver/baixar implementação: TrabalhoAnderson.nlogo

O QUE É?

Esta é a implementação do algoritmo Q-Learning para o trabalho de Aprendizagem de Máquina


COMO FUNCIONA

O agente (tartaruga) explora o ambiente e percebe as recompensas recebidas. Em cada local, 4 ações estão disponíveis (mover-se para o local acima, abaixo, à esquerda e à direita). Tentar se mover em direção à parede faz com que o agente permaneça no mesmo lugar, recebendo a recompensa correspondente.

A idéia é fazer com que o agente aprenda o melhor caminho para o ponto laranja através da interação com o ambiente.


COMO USAR

Antes de tudo, clicar em 'setup' para configurar o cenário.
O botão '1 episode' executa um episódio de duração especificada no controle 'episode-duration'.
O botão 'go forever' executa os episódios ininterruptamente.

Os parâmetros configuráveis do programa são:

alpha: taxa de aprendizado
gamma: fator de desconto para recompensas futuras
epsilon: coeficiente de exploração
episode-duration: quantos passos um episódio irá durar (se o agente chegar em um estado terminal, o episódio acaba antes.

Através do seletor 'show-variable' é possível escolher qual variável será mostrada nos quadrados: a recompensa ou algum dos valores da tabela Q (acima, abaixo, esq. ou dir.)


COISAS A OBSERVAR

O modelo executa muito rapidamente, então, se as atualizações de posição do agente não estiverem sendo visíveis, diminuir a velocidade de execução pode ajudar a visualizar.


EXPERIMENTAÇÕES E OBSERVAÇÕES

É possível observar a ação dos parâmetros sobre o comportamento do agente, principalmente o coeficiente de exploração (epsilon). Depois de vários episódios, quando o agente consegue determinar o menor caminho, zerar este parâmetro faz com que ele sempre vá pelo caminho mais curto.


ESTENDENDO O MODELO

O modelo pode ser estendido através de outros algoritmos de aprendizagem, ou de outras políticas de exploração (epsilon-decreasing, softmax para escolha da ação exploratória, etc.)


CRÉDITOS

Autor: Anderson Rocha Tavares
Professor: Paulo Martins Engel


PROCEDURES

globals [
  timestep
  episode
  episode-reward
]

turtles-own [
   directions
   last-x
   last-y
   action
]

patches-own [
  QTable
  reward
]

to go 
  if show-variable = "reward"
  [ask patches [set plabel reward] ]
  
  if show-variable = "q-up"
  [ask patches [set plabel precision item 3 QTable 2] ]
  
  if show-variable = "q-down"
  [ask patches [set plabel precision item 2 QTable 2] ]
  
  if show-variable = "q-left"
  [ask patches [set plabel precision item 0 QTable 2] ]
  
  if show-variable = "q-right"
  [ask patches [set plabel precision item 1 QTable 2] ]
  
  if show-variable = "none"
  [ask patches [set plabel ""] ]
  
  clear-drawing
  ask turtles [pen-down]
  
  ;esq. dir. abaixo. acima.
  
  set timestep 0
  set episode-reward 0
  
  ;executa um episodio 
  while [timestep < episode-duration and not terminal-state?] [   
    step
    set timestep timestep + 1
  ]
  
  prepare-next-episode
  do-plots
  
  tick
end

;escolhe uma acao, executa-a e realiza o aprendizado
to step 
  choose-action
  walk
  learn
  ;prepare-next-step
end


to choose-action
  ;se caiu em exploracao, escolhe acao aleatoria...
  if random-float 1 < epsilon [
    ask turtles [
      set action random 4; of patch-here
      set heading item action directions
    ]
    stop
  ]

  ;...caso contrario, escolhe gulosamente a proxima acao
  
  ;inicializa o indice da acao de maior Q
  let max-q-dir-index -1
  
  ask turtles [
;    let direction 0
    ;let max-q-dir-index -1
    
    ;obtem o indice da acao de maior Q
    ask patch-here [
      ;let maxq max QTable
      set max-q-dir-index position max QTable QTable
    ]
    
    ;configura acao e se coloca na direcao apropriada
    set action max-q-dir-index
    set heading item action directions
    ;show heading
  ]

end

to walk
  ask turtles [
    set last-x xcor
    set last-y ycor
    fd 1
    ;show (word xcor "," ycor)
  ]
end

;efetua o aprendizado via Q-learning
to learn 
  
  ask turtles [
    ;show  (word last-x "," last-y)
    
    ;obtem o maior Q do 'proximo' estado (na verdade, ja se esta nele)
    ;e configura o reward obtido
    let maxNextQ 0
    let rwd 0
    ask patch-here [
      set maxNextQ max QTable
      set rwd reward
      set episode-reward episode-reward + rwd
    ]
    
    ;cria variavel temporaria para usa-la dentro do contexto de patch
    let action-taken action
       
    ask patch last-x last-y [
      ;show QTable
      
      let oldQ item action-taken QTable 
      let newQ (1 - alpha) * oldQ + alpha * (rwd + gamma * maxNextQ)
     ; show newQ
      set QTable replace-item action-taken QTable newQ
     ; show rwd
    ;  show QTable
      
    ]
  ]
      
end

;prepara o agente para o proximo episodio
to prepare-next-episode
 ask turtles [
   pen-up
   setxy 0 0
   set last-x 0
   set last-y 0
   pen-down
  ]
end

to-report terminal-state?
  let finished false
  ask turtles [
    ask patch-here [
      set finished (reward = 100 or reward = -100)
    ]
  ]
  
  report finished
end

;configura o mundo
to setup
  clear-all
  
  set-default-shape turtles "turtle"
  
  
  ;redimensiona para o tamanho 12 x 4
  resize-world 0 11 0 3
  set-patch-size 40
  
  ;cria o agente e o inicializa
  crt 1 [
    setxy 0 0
    set last-x 0
    set last-y 0
    set color 52
    set directions [270 90 180  0] ;esq. dir. abaixo. acima.
  ]
  
  ;configura o terreno
  ask patches [
    set pcolor 47
    set plabel-color black
    set QTable n-values 4 [0]
    set reward -1
  ]
  
  ;configura a area da morte
  ask patches with [pxcor > 0 and pxcor < 11 and pycor = 0] [
    set pcolor black
    set plabel-color white
    set reward -100
   ; set QTable n-values 4 [0]
  ]  
  
  ;configura o ponto de chegada
  ask patches with [pxcor = 11 and pycor = 0][
    set pcolor orange
    set plabel-color white
    set reward 100
  ]
  
end

to do-plots
 set-current-plot "steps-per-episode"
 plot timestep
 
 set-current-plot "avg-reward-per-episode"
 plot episode-reward / timestep
end