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
Esta é a implementação do algoritmo Q-Learning para o trabalho de Aprendizagem de Máquina
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.
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.)
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.
É 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.
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.)
Autor: Anderson Rocha Tavares
Professor: Paulo Martins Engel
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