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