• Nenhum resultado encontrado

Um player para General Game Playing baseado em busca em árvores de Monte Carlo

N/A
N/A
Protected

Academic year: 2021

Share "Um player para General Game Playing baseado em busca em árvores de Monte Carlo"

Copied!
66
0
0

Texto

(1)

Instituto de Computa¸

ao

Departamento de Ciˆ

encia da Computa¸

ao

CARLOS BRUNO PIUCCI GARCIA S ´

A

UM PLAYER PARA GENERAL GAME PLAYING

BASEADO EM BUSCA EM ARVORES DE MONTE

CARLO

Niter´

oi-RJ

2017

(2)

ii CARLOS BRUNO PIUCCI GARCIA S ´A

UM PLAYER PARA GENERAL GAME PLAYING BASEADO EM BUSCA EM ARVORES DE MONTE CARLO

Trabalho submetido ao Curso de Bacharelado em Ciˆencia da Computa¸c˜ao da Universidade Federal Fluminense como requisito parcial para a obten¸c˜ao do t´ıtulo de Bacharel em Ciˆencia da Computa¸c˜aoo.

Orientadora: Aline Marins Paes Carvalho

Niter´oi-RJ 2017

(3)
(4)

Ficha Catalográfica elaborada pela Biblioteca da Escola de Engenharia e Instituto de Computação da UFF

S111 Sá, Carlos Bruno Piucci Garcia

Um player para General Game Playing baseado em busca em árvores de Monte Carlo / Carlos Bruno Piucci Garcia Sá. – Niterói, RJ : [s.n.], 2017.

65 f.

Projeto Final (Bacharelado em Ciência da Computação) – Universidade Federal Fluminense, 2017.

Orientadora: Aline Marins Paes Carvalho.

1. Inteligência artificial. 2. Jogo em computador. I. Título. CDD 006.3

(5)
(6)

vi

Agradecimentos

Aos meus pais, pelo financiamento, incentivo e apoio incondicional que tornaram poss´ıvel a conclus˜ao desta jornada. A minha orientadora Aline Paes, pelo empenho de-dicado `a elabora¸c˜ao deste trabalho. `A Universidade Federal Fluminense pelo ambiente criativo e amig´avel que proporciona. A todos que direta ou indiretamente fizeram parte da minha forma¸c˜ao, o meu muito obrigado.

(7)

Resumo

Neste trabalho ser´a abordado o t´opico de General Game Playing (GGP) que ´e uma sub´area da Inteligˆencia Artificial, e consiste em desenvolver formas de modelar e resolver jogos de modo gen´erico. O objetivo principal deste trabalho ´e desenvolver um agente jogador de General Game Playing, capaz de jogar jogos arbitr´arios modelados na linguagem de Game Description Language (GDL), os quais nunca tenha se deparado an-teriormente, mas ainda assim escolhendo movimentos v´alidos e apresentando um n´ıvel de jogo convincente, ou seja, que n˜ao fa¸ca escolhas aleat´orias de movimentos. O agente desenvolvido neste trabalho, implementado em uma camada acima de um conhecido arca-bou¸co de GGP ´e capaz de jogar com um ser humano e com outros agentes de GGP. Para verificar se de fato o agente desenvolvido possui as habilidades requeridas em GGP, foram executados testes, consistindo de partidas entre os agentes, de diversos jogos. Diferentes m´etodos de escolha de movimentos e variadas configura¸c˜oes das constantes envolvidas na implementa¸c˜ao foram experimentadas, a fim de investigar a consequˆencia da varia¸c˜ao destes componentes. O agente jogador de GGP desenvolvido neste trabalho apresentou um comportamento satisfat´orio, pois foi capaz de jogar os diversos jogos que lhe foram apresentados cometendo somente 0,27% de movimentos ilegais dentre todos os movimen-tos que executou. Assim, neste trabalho foi poss´ıvel obter um agente jogador capaz de jogar corretamente jogos que nunca havia presenciado antes.

(8)

viii

Abstract

In this work the subject is the General Game Playing topic which is a subarea of Artificial Inteligence, that consist of developing ways to modelate and solve any game. The main goal of this work is developing an agent of General Game Playing, which can play arbitrary games modeled in Game Description Language, games that the agent has never seen before, still choosing valid moves. The developed agent in this work, implemented over a layer above a GGP base code is capable of playing against a human or other GGP agents. To check if in fact the agent has the required skills for GGP, tests were runned, which was matches between the agents, of several games. Several move picking methods and several constant configurations were experimented to investigate de consequence of varying these components. The GGP agent developed in this work reached a good behavior, because it was capable of playing several games with only 0,27% of ilegal move rate. Therefore, in this work it was possible to obtain an agent capable of playing correctly games that it has never played before.

(9)

Sum´

ario

Resumo vii

Abstract viii

Lista de Figuras xi

Lista de Tabelas xii

1 Introdu¸c˜ao 1

1.1 Objetivos . . . 2

1.2 Solu¸c˜ao Proposta . . . 2

1.3 Organiza¸c˜ao do Texto . . . 3

2 Fundamenta¸c˜ao Te´orica 4 2.1 General Game Playing . . . 4

2.2 Game Description Language (GDL) . . . 8

2.3 Monte Carlo Search . . . 11

2.4 Monte Carlo Tree Search . . . 17

3 Um player de General Game Playing 19 4 Estudo de Caso 38 4.1 Jogos variados . . . 39

4.2 Calibra¸c˜ao da constante do algoritmo MCTS . . . 41

4.3 Impacto do pr´e-processamento da ´arvore . . . 47

(10)

x

5 Conclus˜oes 50

(11)

Lista de Figuras

2.1 Grafo de um jogo single-player . . . 6

2.2 Grafo de um jogo multi-player . . . 7

2.3 Arvore expandida na MCS . . . .´ 13

2.4 Etapa de explora¸c˜ao da MCS . . . 14

2.5 C´alculo do valor-objetivo dos estados-folha . . . 15

3.1 M´odulos do arcabou¸co de GGP . . . 20

3.2 Vis˜ao geral da implementa¸c˜ao do agente de GGP . . . 20

3.3 Diagrama de classe da interface com o interpretador de GDL . . . 23

3.4 Comunica¸c˜ao do agente com a base de GGP . . . 24

3.5 Fluxograma de uma partida . . . 30

3.6 Diagrama de classe da implementa¸c˜ao do agente de GGP . . . 30

3.7 Composi¸c˜ao da ´arvore de estat´ısticas . . . 31

4.1 Evolu¸c˜ao das instˆancias de espa¸co de estados pequeno . . . 43

4.2 Evolu¸c˜ao das instˆancias de espa¸co de estados m´edio . . . 45

4.3 Evolu¸c˜ao das instˆancias de espa¸co de estados grande . . . 46

(12)

xii

Lista de Tabelas

4.1 Erros do agente jogador de GGP . . . 39

4.2 Estat´ısticas dos erros do agente jogador . . . 40

4.3 Resultados das partidas de Pawn Whopping . . . 42

4.4 Resultados em ordem cronol´ogica de Pawn Whopping . . . 44

4.5 Resultados das partidas de Connect Four . . . 44

4.6 Resultados em ordem cronol´ogica de Connect Four . . . 45

4.7 Resultados das partidas de Breakthrough . . . 46

4.8 Resultados em ordem cronol´ogica de Breakthrough . . . 47

(13)

Cap´ıtulo 1

Introdu¸

ao

A Inteligˆencia Artificial ´e o campo da Ciˆencia da Computa¸c˜ao que busca for-mas de desenvolver sistefor-mas capazes de resolver problefor-mas. N˜ao h´a consenso sobre a defini¸c˜ao da Inteligˆencia Artificial. Algumas abordagens tˆem como objetivo simu-lar o comportamento ou pensamento humano. Outras abordagens tˆem o foco no de-sempenho da inteligˆencia artificial, isto ´e, se ela executa corretamente o que foi pro-jetada para executar [Russel e Norvig 2004]. Muitas ´areas da Inteligˆencia Artificial se focam em resolver problemas espec´ıficos, por´em a ´area de General Artificial Inteligence (GAI) mant´em o foco em descobrir formas de representar e resolver problemas gen´ eri-cos [Goertzel e Pennachin 2007]. Um t´opico recente dentro da GAI ´e o General Problem Solving, que consiste em estudar a natureza dos problemas, os mecanismos de solu¸c˜ao de problemas e estruturas que todos os problemas tˆem em comum, para que seja poss´ıvel explorar maneiras de se elaborar algoritmos capazes de solucionar qualquer problema com que se deparem, sem ter conhecimento pr´evio sobre eles. Um subconjunto deste t´opico ´e o General Game Playing (GGP), que consiste em projetar agentes que sejam capazes de jogar qualquer jogo, sem ter conhecimento pr´evio dele, analogamente a resolver qual-quer problema. Jogos s˜ao bastante similares a problemas no ˆambito da abstra¸c˜ao de seu universo atrav´es de estruturas matem´aticas.

Uma solu¸c˜ao de General Game Playing tem pontos favor´aveis e pontos desvanta-josos. Por um lado, um agente de GGP n˜ao transcende um agente inteligente elaborado para um jogo espec´ıfico, pois o agente de GGP n˜ao tem informa¸c˜oes sobre o jogo, en-quanto o agente espec´ıfico tem embutido em sua implementa¸c˜ao estrat´egias e heur´ıstica que o conduzem a um n´ıvel de jogo muito superior ao de um agente de GGP no jogo para

(14)

2 o qual ´e especialista. Por outro lado, o agente de GGP tem a vantagem de ser capaz de jogar qualquer jogo que possa ser modelado atrav´es de uma linguagem de modelagem de jogos. Dessa forma, o agente de GGP n˜ao tem como principal objetivo alcan¸car o maior n´ıvel de jogo poss´ıvel, mas sim de eliminar a necessidade de se projetar e implementar um agente espec´ıfico para cada jogo que existe. Em um ambiente de GGP, ´e suficiente descrever o jogo e ent˜ao se tem um agente-coringa que jogar´a quantos jogos o fornecerem. Al´em disto, o campo de General Game Playing, que j´a ´e fascinante por si s´o, motiva a cria¸c˜ao de t´ecnicas melhores e mais consistentes de aprendizado de m´aquina, detec¸c˜ao de padr˜ao, e racioc´ınio.

1.1

Objetivos

Neste trabalho ser´a abordado o problema de General Game Playing seguindo uma modelagem de agente inteligente. Assim, o foco ser´a em desenvolver um agente capaz de jogar qualquer jogo de tabuleiro com espa¸co de estados discreto, sem obter nenhum conhecimento sobre o jogo al´em das regras que o regem; nem mesmo o nome do jogo ´e fornecido ao agente.

O objetivo principal deste trabalho ´e apresentar uma solu¸c˜ao para o problema de GGP e executar experimentos para analisar e compreender o comportamento de um agente de GGP e o qu˜ao bem ele pode jogar um jogo sobre o qual n˜ao tem nenhuma informa¸c˜ao. Como objetivo secund´ario, ser˜ao realizados, experimentos para calibrar parˆametros do algoritmo adotado como base para a constru¸c˜ao do agente de GGP deste trabalho. Para tanto, ser´a estudado um arcabou¸co de c´odigo para o desenvolvimento de agentes de GGP e apresentar os seus m´odulos essenciais para a implementa¸c˜ao de um agente.

1.2

Solu¸

ao Proposta

Neste trabalho ser´a apresentado um agente de General Game Playing constru´ıdo com base no algoritmo Monte Carlo Tree Search [Chaslot et al. 2008] adaptado para o contexto de GGP. O agente ser´a capaz de executar uma fase de pr´e-processamento para construir uma ´arvore de jogo inicial que ser´a utilizada para extrair informa¸c˜oes j´a no in´ıcio da partida, o que dever´a fortalecer o n´ıvel de jogo do agente de GGP deste trabalho. O algoritmo Monte Carlo Tree Search foi escolhido por ser adequado ao contexto de GGP

(15)

pois trata-se de um algoritmo que toma decis˜oes com base em informa¸c˜oes estat´ısticas, ou seja, n˜ao ´e necess´ario que se tenha qualquer conhecimento sobre estrat´egias e heur´ısticas inerentes ao jogo em quest˜ao. Na solu¸c˜ao apresentada neste trabalho, ser˜ao tratadas estruturas comuns a qualquer jogo de tabuleiro, ou seja, seu espa¸co de estado. Ser´a utilizada uma linguagem espec´ıfica para a modelagem de jogos deste gˆenero, a Game Description Language [Love et al. 2008]. O algoritmo da solu¸c˜ao proposta ent˜ao percorre o espa¸co de estados atrav´es do modelo em GDL do jogo, obtendo somente as informa¸c˜oes mais elementares acerca de cada estado poss´ıvel do jogo, se ´e terminal ou n˜ao e, caso seja terminal, se ´e uma vit´oria ou n˜ao. Toda a implementa¸c˜ao da solu¸c˜ao proposta ´e feita em cima do arcabou¸co de c´odigo utilizado neste trabalho, oferecido na cadeira de General Game Playing pela Universidade de Stanford, dispon´ıvel no github 1. Toda a

interpreta¸c˜ao da linguagem GDL ´e feita atrav´es do interpretador que vem embutido como um dos m´odulos deste arcabou¸co de c´odigo, portanto a solu¸c˜ao proposta n˜ao engloba construir um interpretador de GDL, mas sim utiliz´a-lo.

1.3

Organiza¸

ao do Texto

O restante texto deste trabalho est´a organizado em quatro cap´ıtulos. No segundo cap´ıtulo ´e fornecido o embasamento te´orico do trabalho, onde ser˜ao detalhados cada um dos t´opicos relevantes para este trabalho. No terceiro cap´ıtulo ´e fornecido um detalha-mento sobre a implementa¸c˜ao do trabalho, onde ´e explicado como o trabalho foi desen-volvido e ´e apresentada a sua arquitetura. No cap´ıtulo quatro s˜ao apresentados os ex-perimentos executados, a compila¸c˜ao dos dados obtidos e a interpreta¸c˜ao dos resultados. No quinto cap´ıtulo est˜ao as conclus˜oes acerca do trabalho desenvolvido e temas poss´ıveis para trabalhos futuros.

(16)

Cap´ıtulo 2

Fundamenta¸

ao Te´

orica

Neste cap´ıtulo s˜ao apresentados os conceitos necess´arios para compreender como funciona um agente de General Game Playing. ´E mostrada a estrutura que pode ser uti-lizada para abstrair qualquer jogo de tabuleiro com espa¸co de estados finito, e tamb´em de que maneira esta estrutura ´e capaz de fazˆe-lo. ´E abordada a Game Description Language (GDL), que ´e uma linguagem com o prop´osito de modelar as regras de jogos que possuam espa¸co de estados finito. S˜ao apresentados os algoritmos Monte Carlo Search e Monte Carlo Tree Search, e como podem ser aplicados a um contexto de general game playing.

2.1

General Game Playing

General Game Playing ´e um t´opico da ´area de Inteligˆencia Artificial que trata do problema de desenvolver agentes capazes de jogar qualquer jogo. Por´em, esse ainda ´e um problema em aberto, de forma que n˜ao h´a um agente realmente capaz de jogar qualquer jogo, mas sim agentes que consigam jogar uma classe de jogos que tenham uma estrutura em comum, por exemplo, um agente de GGP capaz de jogar jogos de tabuleiro.

Um agente de GGP pleno deve ser capaz de aprender de maneira autˆonoma como jogar, ou seja, compreender a mecˆanica do jogo e as regras, e tamb´em deve ser capaz de desenvolver suas estrat´egias para alcan¸car a vit´oria sem a interven¸c˜ao de qualquer agente externo, humano ou n˜ao humano. Um agente de GGP pode compreender a mecˆanica do jogo e suas regras atrav´es da observa¸c˜ao do mesmo sendo jogado por outros agentes, por´em ainda ´e mais usual desenvolver agentes de GGP parciais que n˜ao s˜ao capazes de aprender como jogar, portanto necessitam da descri¸c˜ao das regras e da mecˆanica do jogo

(17)

em alguma linguagem. A linguagem comumente utilizada para modelar os jogos chama-se Game Description Language (GDL), portanto a maioria dos agentes de GGP devem ser capazes de interpretar a GDL.

Agentes de GGP se deparam com jogos arbitr´arios nunca jogados por eles ante-riormente, jogos single-player, jogos multi-player, jogos simples (como o Cubo M´agico), jogos complexos (por exemplo o xadrez), jogos determin´ısticos ou estoc´asticos, jogos com informa¸c˜oes parciais ou completas, etc. Por este motivo, um agente de GGP n˜ao pode de-pender de algoritmos espec´ıficos para cada jogo que exista. Detectar qual ´e o jogo que foi passado ao agente descrito em GDL n˜ao ´e uma tarefa trivial. Al´em disso, seria um esfor¸co muito grande para o programador desenvolver algoritmos para todos os jogos conhecidos e incorpor´a-los no agente de GGP. H´a tamb´em o problema de que novos jogos podem surgir. Geralmente em competi¸c˜oes de GGP s˜ao fornecido aos agentes uma varia¸c˜ao nunca vista de algum jogo conhecido, e n˜ao seria poss´ıvel para o desenvolvedor alterar o seu agente no momento da competi¸c˜ao, e este agente n˜ao seria essencialmente um agente de GGP por n˜ao ser capaz de jogar aquele jogo com o qual acabou de se deparar. Portanto, um agente de GGP deve possuir algoritmos baseados em sua pr´opria capacidade de desenvolver es-trat´egias de jogo, ao inv´es de algoritmos que incorporem a inteligˆencia do programador atrav´es de conhecimento pr´evio sobre o jogo. Capacidades desej´aveis de agentes de GGP s˜ao representa¸c˜ao de conhecimento, racioc´ınio e tomada de decis˜oes racionais.

Apesar de um agente de GGP ser capaz de jogar uma quantidade n˜ao determinada de jogos, estes jogos devem compartilhar uma estrutura abstrata para que seja poss´ıvel um agente de GGP jogar qualquer jogo que seja uma instˆancia desta estrutura. Os jogos que um agente de GGP ´e capaz de jogar devem assumir uma quantidade finita de estados. Dentre todos os estados que o jogo pode assumir, alguns s˜ao distintos, deve haver exatamente um estado chamado inicial, que ´e a configura¸c˜ao em que o jogo se encontra antes que qualquer a¸c˜ao seja feita no jogo por qualquer agente que o esteja jogando, e h´a um ou mais estados designados estados finais, que s˜ao estados para os quais n˜ao h´a mais nenhuma a¸c˜ao a ser tomada e denotam o fim da partida. Cada jogo tem uma quantidade fixa de jogadores que n˜ao pode mudar durante a partida. Cada jogador tem uma quantidade finita de a¸c˜oes poss´ıveis para um dado estado, e a cada estado ´e associado um valor-objetivo para cada um dos jogadores.

(18)

6 turno da partida, e o estado do jogo ´e atualizado em detrimento de todas as a¸c˜oes tomadas no turno em andamento. H´a uma a¸c˜ao especial, designada noop, para o caso em que algum agente decida n˜ao tomar qualquer outra a¸c˜ao dispon´ıvel ou n˜ao possua a¸c˜oes dispon´ıveis. Dada esta estrutura abstrata compartilhada entre os jogos poss´ıveis de serem jo-gados por um agente de GGP, podemos modelar qualquer jogo como um grafo em que os v´ertices s˜ao os estados do jogo e as arestas s˜ao as a¸c˜oes que podem ser tomadas, cada v´ertice tem um valor associado que ´e o valor-objetivo. Como dito anteriormente, existem v´ertices especiais, que s˜ao o v´ertice que representa o estado inicial e os v´ertices que re-presentam os estados finais. Este grafo pode ser visto portanto como uma m´aquina de estados.

Na Figura 2.1 temos o exemplo de um grafo para um jogo de um ´unico jogador. Neste exemplo temos um jogo com oito estados poss´ıveis, sendo o estado s1 inicial e os

estados s4 e s8 finais. Cada estado do jogo tem um valor associado que ´e o valor-objeto do

estado. A fun¸c˜ao de transi¸c˜ao do jogo ´e exprimida pelas arestas do grafo. Por exemplo, se o jogo estiver no estado s2 e o agente de GGP tomar a a¸c˜ao b, o jogo transita do estado

s2 para o estado s3. Se o agente tivesse escolhido a a¸c˜ao a, o jogo teria mudado para o

estado s6.

Figura 2.1: Grafo de um jogo single-player

Na Figura 2.2 temos o exemplo de um grafo para um jogo de v´arios jogadores. Neste caso, h´a uma aresta para cada combina¸c˜ao de movimentos dos jogadores, simulta-neamente. Em cada v´ertice do grafo h´a agora os valores-objetivo para cada jogador. Se

(19)

o jogo estiver no estado s6 e ambos os jogadores tomarem a a¸c˜ao a, o jogo transita de

estado pela aresta marcada com a combina¸c˜ao de a¸c˜oes tomadas pelos jogadores, ou seja, a/a, e o jogo muda o estado para s7. Se os jogadores tivessem tomado as a¸c˜oes a e b, o

jogo teria transitado para o estado s2.

Figura 2.2: Grafo de um jogo multi-player

Embora abstrair os jogos tratados em GGP como uma estrutura em grafo seja conveniente pela simplicidade e facilidade de modelagem, na pr´atica n˜ao ´e conveniente representar os jogos dessa forma por causa da grande quantidade de estados distintos que podem possuir. O xadrez, por exemplo, possui uma quantidade de estados distintos em torno de 1030. Construir um grafo para o caso do xadrez seria impratic´avel, tanto

pelo tempo de constru¸c˜ao do grafo quanto pela quantidade de mem´oria que a simples representa¸c˜ao do jogo em um grafo consumiria.

Na grande maioria dos jogos os estados podem ser fragmentados em entidades fundamentais. No xadrez, por exemplo, os estados podem ser fragmentados em pe¸cas, casas, linhas, colunas diagonais etc. Esta propriedade nos permite definir as a¸c˜oes legais do jogo em termos dessas entidades mais fundamentais, ou seja, ao inv´es de precisar definir para cada poss´ıvel estado as poss´ıveis transi¸c˜oes, poder´ıamos definir em fun¸c˜ao dessas entidades fundamentais regras que determinam quais s˜ao as a¸c˜oes legais, e essas defini¸c˜oes aplicar-se-iam a quaisquer estados v´alidos do jogo. Essa forma compacta de representar jogos ´e exatamente a forma usada em GDL, de maneira que os estados s˜ao gerados conforme a necessidade. [Genesereth e Thielscher 2014]

(20)

8

2.2

Game Description Language (GDL)

A GDL ´e uma linguagem baseada em l´ogica, que permite modelar as regras de qualquer jogo que tenha espa¸co de estados discreto e finito. Esta linguagem permite que sejam feitas consultas sobre o jogo, como por exemplo o estado inicial, o estado atual, quem ´e o jogador da vez, se algu´em venceu etc. Atrav´es de proposi¸c˜oes l´ogicas, a GDL permite que o estado do jogo seja transitado para um pr´oximo estado poss´ıvel. A finalidade desta linguagem ´e oferecer uma maneira de modelar jogos de modo a permitir a constru¸c˜ao de agentes de General Game Playing.

GDL ´e uma linguagem declarativa, como Datalog e Prolog, por´em h´a algumas diferen¸cas, a semˆantica da GDL ´e puramente declarativa, garante decidibilidade para qualquer pergunta de implica¸c˜ao l´ogica para qualquer descri¸c˜ao na linguagem e possui palavras reservadas espec´ıficas para defini¸c˜ao de jogos.

A GDL possui dois componentes essenciais, entidades e relacionamentos. As enti-dades representam os objetos que se presume que existam no jogo. O conjunto de todas as entidades que podem ser utilizadas no jogo ´e chamado de dom´ınio do jogo. O nome das entidades s˜ao strings com qualquer combina¸c˜ao de caracteres alfanum´ericos e alguns poucos caracteres n˜ao alfanum´ericos (e.g. ’ ’). O nome de uma entidade n˜ao pode come-¸car com uma letra mai´uscula. Para exemplificar, considere o jogo da velha. Neste jogo as entidades seriam os papeis no jogo, ou seja, cada um dos jogadores, por exemplo player1 e player2, os ´ındices das linhas e colunas 1, 2 e 3, e os valores que podem aparecer em cada c´elula do tabuleiro, x, o e b (b significa branco no caso deste exemplo).

Os relacionamentos representam propriedades dos objetos ou rela¸c˜oes entre eles. O conjunto de todos os relacionamentos definidos no jogo ´e chamado de assinatura do jogo. A aridade de um relacionamento ´e o n´umero de objetos envolvidos no relacionamento, a aridade de um relacionamento ´e uma propriedade inerente a ele e nunca muda. Considere o exemplo do jogo da velha dado para exemplificar as entidades, poder´ıamos inserir na assinatura do jogo o relacionamento c´elula de aridade trˆes, e este relacionamento junto com as entidades de jogadores da vez, linhas, colunas e valores poss´ıveis nas c´elulas, obtemos a proposi¸c˜ao de que uma c´elula numa dada linha e coluna possui o valor especificado. Por exemplo, c´elula(1, 2, x) define que a c´elula na linha 1 e coluna 2 possui o valor x. Podemos adicionar na assinatura tamb´em o relacionamento controle que indica de qual jogador ´e a vez. Por exemplo, controle(player1) determina que ´e a vez do jogador player1.

(21)

Um game schema possui um conjunto de entidades, um conjunto de relacionamen-tos e uma associa¸c˜ao de aridades para cada um dos relacionamentos contidos na assinatura do jogo [Genesereth e Thielscher 2014].

Uma proposi¸c˜ao ´e uma estrutura que consiste em um relacionamento da assinatura do jogo com aridade n, representando n entidades no dom´ınio do jogo. As proposi¸c˜oes s˜ao escritas em GDL utilizando a nota¸c˜ao matem´atica tradicional. Por exemplo, se R ´e um relacionamento contido na assinatura do jogo e a e b s˜ao entidades do dom´ınio do jogo, ent˜ao R(a, b) ´e uma proposi¸c˜ao. Em GDL as proposi¸c˜oes s˜ao particionadas em 3 classes disjuntas, as proposi¸c˜oes base que comp˜oem os estados do jogo, as a¸c˜oes que determinam os movimentos legais para cada estado do jogo, ou seja, as transi¸c˜oes de estado, e as proposi¸c˜oes sensoriais (percep¸c˜oes) que s˜ao parte da vers˜ao GDL-II. Este tipo de proposi¸c˜ao ´e ´util para adicionar a no¸c˜ao de jogo incompleto, ou seja, jogos em que os agentes de GGP n˜ao conhecem completamente os estados do jogo. H´a o caso especial de um relacionamento de aridade zero, noop, que determina que nenhuma a¸c˜ao ser´a tomada. Para completar o exemplo do jogo da velha, poder´ıamos adicionar a¸c˜oes marcar de aridade 2, que indicariam a a¸c˜ao de marcar a c´elula na linha e coluna especificadas na a¸c˜ao marcar [Love et al. 2008].

A base proposicional de um jogo ´e o conjunto que cont´em todas as proposi¸c˜oes que podem ser formadas utilizando relacionamentos e entidades contidos no game schema. Para exemplificar, considere que temos um jogo cujo assinatura possui os relacionamentos J e K, sendo que J tem aridade 1 e K aridade 3, e o dom´ınio possui as entidades a e b. A base proposicional deste jogo ´e o conjunto J(a), J(b), K(a, a, a), K(a, a, b), K(a, b, a), K(a, b, b), K(b, a, a), K(b, a, b), K(b, b, a), K(b, b, b). Cada proposi¸c˜ao da base proposicional deve assumir o valor verdadeiro ou falso. [Genesereth e Thielscher 2014]

Um estado num jogo ´e determinado por um subconjunto da base proposicional, ou seja, um jogo estar num determinado estado significa que de todas as proposi¸c˜oes da base proposicional, algumas s˜ao verdadeiras e as demais s˜ao falsas. O jogo transita de um estado atual para o pr´oximo estado atrav´es das a¸c˜oes de todos os jogadores participantes da partida, ou seja, depois que todos os jogadores j´a fizeram a escolha de um movimento legal dentro do conjunto de a¸c˜oes dispon´ıveis. Mesmo que n˜ao seja a vez de um deter-minado jogador, ele precisa escolher algum movimento, que nesse caso o ´unico dispon´ıvel seria noop. Quando as a¸c˜oes s˜ao tomadas e um movimento ´e efetuado, as proposi¸c˜oes base

(22)

10 mudam o valor, algumas se tornam verdadeiras e outras falsas, esta mudan¸ca de valores das proposi¸c˜oes base ´e o que caracteriza a transi¸c˜ao de um estado para outro e, conse-quentemente, h´a um novo conjunto de poss´ıveis a¸c˜oes. Para qualquer estado poss´ıvel, um movimento tomado leva a outro estado ´unico, n˜ao pode haver ambiguidade na transi¸c˜ao de estados.

A GDL tem algumas limita¸c˜oes adicionais que restringem o escopo da linguagem a fim de evitar que se possa modelar jogos com defini¸c˜oes problem´aticas. Estas limita¸c˜oes est˜ao listadas a seguir:

• Termination: Um jogo descrito em GDL termina se para qualquer a¸c˜ao legal par-tindo do estado inicial do jogo algum estado final ´e alcan¸c´avel.

• Jogabilidade: Um jogo descrito em GDL ´e jog´avel se, e somente se, todos os jogadores tˆem pelo menos um movimento legal em qualquer estado n˜ao-terminal que seja alcan¸c´avel a partir do estado inicial do jogo.

• Winnability: Um jogo descrito em GDL ´e strongly winnable se, e somente se, para algum jogador existe uma sequˆencia de a¸c˜oes individuais que conduzem o jogo a um estado terminal em que o valor-objetivo ´e maximal para esse dado jogador. Um jogo descrito em GDL ´e weakly winnable se, e somente se, para todos os jogadores h´a uma sequˆencia de a¸c˜oes conjuntas dos jogadores que conduzem a um estado terminal em que o valor-objetivo ´e maximal para o dado jogador.

• Bem-formado: Um jogo descrito em GDL ´e bem-formado se termina, ´e jog´avel e ´e weakly winnable.

Em GDL existem objetos constantes que s˜ao os n´umeros de 0 a 100, ´uteis para definir o valor-objetivo dos estados. Existem tamb´em relacionamentos fixos da linguagem que s˜ao os mesmos para quaisquer jogos e tˆem uma semˆantica especificada pela linguagem. Esses relacionamentos e os objetos constantes s˜ao o vocabul´ario independente de jogo. A seguir h´a uma lista dos dez relacionamentos fixos da linguagem e suas semˆanticas:

• role(a) Este relacionamento determina os jogadores, sendo a o jogador.

• base(p) Este relacionamento determina as proposi¸c˜oes base do jogo, sendo p uma proposi¸c˜ao que ser´a considerada base.

(23)

• input(r, a) Este relacionamento bin´ario determina que a ´e uma a¸c˜ao v´alida para o jogador r.

• init(p) Este relacionamento determina que a proposi¸c˜ao p ´e verdadeira para o estado inicial do jogo.

• true(p) Este relacionamento determina que a proposi¸c˜ao p ´e verdadeira no estado atual.

• does(r, a) Este relacionamento indica que o jogador r executa a a¸c˜ao a no estado atual.

• next(p) Este relacionamento indica que a proposi¸c˜ao p ´e verdadeira no pr´oximo estado.

• legal(r, a) Este relacionamento indica que a a¸c˜ao a ´e legal no estado atual para o jogador r.

• goal(r, n) Este relacionamento determina o valor-objeto n do estado atual para o jogador r.

• terminal Este relacionamento determina que o estado atual ´e terminal [Love et al. 2008]. Um jogo descrito em GDL deve satisfazer as seguintes condi¸c˜oes: (1) Um jogo em GDL deve fornecer defini¸c˜oes completas dos relacionamentos independentes de jogo role, base, input e init. (2) Deve definir relacionamentos goal, legal e terminal em termos de relacionamentos true. (3) Deve definir relacionamentos next em termos de relacionamentos true e does [Genesereth e Thielscher 2014].

2.3

Monte Carlo Search

Para um agente de GGP tomar decis˜oes ´e necess´ario que ele fa¸ca considera¸c˜oes com base no estado atual do jogo, e ent˜ao projetar futuros cen´arios atrav´es da simula¸c˜ao de poss´ıveis sequˆencias de movimentos seus e de seus advers´arios ou aliados no jogo.

Uma possibilidade seria percorrer toda a ´arvore de estados do jogo e fazer considera-¸c˜oes sobre os seus estados terminais e construir as decis˜oes do agente com o conhecimento de quais a¸c˜oes levam `a derrota, vit´oria ou empate. Por´em, essa abordagem apresenta

(24)

12 uma forte limita¸c˜ao computacional, pois a maioria dos jogos apresenta uma quantidade exacerbada de estados distintos, e seria invi´avel visitar cada poss´ıvel estado a partir do estado atual em decorrˆencia do tempo necess´ario para fazer esta computa¸c˜ao.

H´a uma alternativa para a busca na ´arvore de estados completa do jogo, que consiste em visitar parcialmente a ´arvore e em determinado ponto da busca parar de aprofundar na ´arvore e fazer alguma considera¸c˜ao heur´ıstica em cima do estado que se alcan¸cou at´e aquele ponto da busca. Estas considera¸c˜oes heur´ısticas - tamb´em chamadas de utilidade do estado - quando bem elaboradas podem estimar com precis˜ao satisfat´oria o qu˜ao interessante ou indesej´avel ´e o estado que est´a sendo considerado. Com isso o agente de GGP pode tomar decis˜oes coerentes e apresentar um n´ıvel de jogo consistente e desafiador. O problema desta abordagem para o caso do GGP reside na necessidade de se elaborar heur´ısticas que dependem de conhecimento espec´ıfico sobre o jogo e portanto n˜ao s˜ao interessantes para um player gen´erico. H´a ent˜ao a necessidade de se encontrar uma abordagem que n˜ao dependa do jogo, mas que apresente tomadas de decis˜oes que sejam consistentes e relevantes, independente do jogo que esteja sendo jogado.

A busca probabil´ıstica ´e uma abordagem interessante para o caso de general game playing, pois n˜ao necessita estimar nenhuma utilidade para estados que n˜ao sejam ter-minais, ou seja, a busca probabil´ıstica considera para seu c´alculo de utilidade somente estados terminais, e baseia-se somente em vit´oria, derrota ou empate. Desta maneira pode-se abstrair quaisquer caracter´ısticas espec´ıficas de cada jogo, e a busca torna-se ge-n´erica o suficiente para ser implementada num agente de GGP. Para este trabalho ser´a utilizada uma abordagem baseada em Monte Carlo.

A Monte Carlo Search (MCS) ´e uma busca probabil´ıstica baseada na abordagem Monte Carlo de simula¸c˜ao do jogo. A busca consiste em, a partir de um dado estado, tomar a¸c˜oes aleat´orias at´e alcan¸car um estado terminal do jogo, e ent˜ao repete-se esse processo uma determinada quantidade de vezes e verifica-se a quantidade de vezes em que o processo chegou a um estado terminal em que o agente que est´a desempenhando a simula¸c˜ao Monte Carlo obt´em ˆexito e vence o jogo, e adota-se como valor do estado atual a propor¸c˜ao entre os sucessos e a quantidade de vezes que o processo foi executado.

A MCS incorpora uma das etapas da busca heur´ıstica, e ent˜ao substitui a etapa da aplica¸c˜ao da heur´ıstica de avalia¸c˜ao de um estado pela etapa da avalia¸c˜ao do estado atrav´es da sucessiva aplica¸c˜ao de movimentos aleat´orios at´e o estado terminal. Portanto

(25)

a MCS ´e um m´etodo que consiste de duas etapas:

• Expans˜ao: Nesta etapa utiliza-se o mesmo m´etodo utilizado na busca heur´ıstica, ou seja, a busca come¸ca num dado estado s0, e para cada estado v´alido subsequente

a partir do estado s0 a busca o expande, mantendo-o em mem´oria e armazenando

os resultados da explora¸c˜ao de cada estado expandido a partir dele. A busca ent˜ao constr´oi a ´arvore de estados do jogo nesta etapa, at´e uma dada profundidade. Na Figura 2.3 est´a ilustrada a etapa de expans˜ao, em que a ´arvore ´e constru´ıda at´e uma determinada profundidade.

Figura 2.3: ´Arvore expandida na MCS

• Explora¸c˜ao: Nesta etapa n˜ao h´a mais expans˜ao da ´arvore de estados do jogo. A partir da ´arvore constru´ıda na etapa de expans˜ao, para cada folha da ´arvore ser´a executada a explora¸c˜ao. Determina-se a quantidade de vezes que a etapa de explora¸c˜ao ser´a executada para cada uma das folhas da ´arvore. O processo consiste em escolher a¸c˜oes aleat´orias partindo de um estado-folha at´e encontrar um estado terminal do jogo, e ent˜ao se verifica se este estado ´e uma vit´oria para o agente que est´a executando a MCS, se ´e uma derrota ou empate. Na sequˆencia de movimentos aleat´orios at´e um estado terminal, para cada passo escolhe-se somente uma a¸c˜ao para cada player. O resultado ´e ent˜ao retornado e armazenado, at´e que todas as itera¸c˜oes para um dado estado-folha da ´arvore sejam executadas. A Figura 2.4 ilustra como esta etapa acontece, na imagem ´e ocultado o caminho aleat´orio que cada itera¸c˜ao faz, e ´e exibido somente cada estado terminal alcan¸cado e seu valor-objetivo, que ´e dado por zero em caso de derrota ou 100 em caso de vit´oria.

(26)

14

Figura 2.4: Etapa de explora¸c˜ao da MCS

Ap´os conclu´ıda a explora¸c˜ao para os estados-folha da ´arvore ´e calculado o valor-objetivo de cada um deles. Este c´alculo ´e simples, basta somar os resultados de cada itera¸c˜ao da explora¸c˜ao e dividir pela quantidade de itera¸c˜oes executadas. A Figura 2.5 ilustra o c´alculo do valor-objetivo de cada um destes estados-folha.

A etapa de explora¸c˜ao pode ser interpretada como uma maneira de se determinar um valor heur´ıstico, com o diferencial de n˜ao demandar conhecimento algum acerca do jogo em quest˜ao, portanto a exclusividade da MCS ´e a forma de determinar a utilidade de um estado, que consiste num m´etodo probabil´ıstico, mantendo a mecˆanica da etapa de expans˜ao, ou seja, a gera¸c˜ao da ´arvore parcial (a ´arvore de estados do jogo que cont´em somente uma parte dos estados e para em determinada profundidade). Por´em na MCS esta ´

arvore tem menos estados que numa abordagem de busca heur´ıstica com conhecimento espec´ıfico sobre o jogo, pois na MCS haver´a ainda a etapa de explora¸c˜ao, que embora seja considerada leve, ainda demanda algum tempo adicional de computa¸c˜ao.

O MCS ´e um m´etodo otimista, ou seja, considera que o seu oponente tem um n´ıvel baixo de jogo, pois assume que o oponente toma decis˜oes aleatoriamente, e isto ´e intr´ınseco ao m´etodo, quando na realidade o seu oponente pode ser um jogador experiente que consegue enxergar excelentes estrat´egias a partir de um dado estado. Por exemplo,

(27)

Figura 2.5: C´alculo do valor-objetivo dos estados-folha

para um determinado estado a partir do qual ser´a feita uma explora¸c˜ao, todas as itera¸c˜oes podem conduzir a um estado terminal favor´avel ao agente de GGP, e pode haver um ´

unico estado terminal que ´e um caso em que o agente em quest˜ao perde, o oponente pode enxergar isso e se aproveitar dessa fragilidade do m´etodo. Por´em, mesmo com essas desvantagens, o m´etodo Monte Carlo ´e poderoso e bastante satisfat´orio para o caso de general game playing [Chaslot et al. 2008] [Browne et al. 2012].

O Algoritmo 1 apresenta uma implementa¸c˜ao da MCS que utiliza 4 itera¸c˜oes para a explora¸c˜ao de estados-folha.

(28)

16 function maxscore (role,state,level) if findterminalp(state,game) then

return findreward(role,state,game); end

if level>levels then

return montecarlo(role,state,4); end

var actions = findlegals(role,state,game); var score = 0;

for var i=0; i<actions.length; i++ do

var result = minscore(role,actions[i],state,level); if result==100 then return 100; end if result>score then score = result; end end return score;

function montecarlo (role,state,count) var total = 0; for var i=0; i<count; i++ do

total = total + depthcharge(role,state); end

return total/count;

function depthcharge (role,state) if findterminalp(state,game) then return findreward(role,state,game);

end

var move = seq(); for var i=0; i<roles.length; i++ do var options = findlegals(roles[i],state,game);

move[i] = randomelement(options); end

var newstate = simulate(move,state); return depthcharge(role,newstate);

(29)

2.4

Monte Carlo Tree Search

A Monte Carlo Tree Search ´e uma ´arvore utilizada para facilitar a MCS. Em ambos os m´etodos a ´arvore de estados do jogo ´e gerada de maneira incremental, a diferen¸ca entre os dois m´etodos reside na forma como esta ´arvore ´e gerada.

Enquanto na busca Monte Carlo Search cada etapa ´e executada uma ´unica vez, a Monte Carlo Tree Search ´e executada em ciclos, com cada ciclo possuindo quatro etapas, a cada ciclo uma etapa de cada vez. A ´arvore parcial de estados no caso da MCTS ´e chamada de ´Arvore de Estat´ısticas, ela armazena - para cada n´o - a quantidade de visitas que o n´o recebeu e as informa¸c˜oes estat´ısticas que o n´o possui sobre poss´ıveis resultados do jogo decorrentes da sua escolha.

Neste trabalho ser´a utilizado o algoritmo MCTS com fun¸c˜ao de avalia¸c˜ao Upper Confidence Bound for Trees (UCT), em que ´e utilizado o limite estat´ıstico Upper Confi-dence Bound na etapa de sele¸c˜ao. Abaixo est˜ao listadas e abordadas as quatro etapas da MCTS [Love et al. 2008].

• Sele¸c˜ao: Nesta etapa da busca a ´arvore de estados do jogo ´e percorrida com base em informa¸c˜oes estat´ısticas previamente coletadas e armazenadas em cada n´o. A busca come¸ca na raiz e vai aprofundando n´ıvel a n´ıvel, em cada n´ıvel escolhendo um dos filhos. Cada escolha pode ser interpretada como um Multi-Armed Bandit Problem [Katehakis e Jr 1987]. O algoritmo utilizado para a escolha do filho pelo qual a busca seguir´a ´e o Upper Confidence Bound. Esta escolha ´e feita de maneira a favorecer n´os pouco visitados adicionando `a utilidade estimada do n´o um valor que ´e maior conforme a quantidade de vezes que o n´o foi visitado ´e menor. Esta etapa ´e conclu´ıda quando a busca alcan¸ca um n´o cujo nem todos os filhos possuem informa¸c˜oes estat´ısticas, ent˜ao a MCTS passa para a sua segunda etapa.

• Expans˜ao: Nesta etapa a busca encontra-se em um n´o cujo nem todos os filhos possuem informa¸c˜oes estat´ısticas associadas, portanto ´e escolhido aleatoriamente um desses filhos e ele ´e adicionado `a ´Arvore de Estat´ısticas.

• Simula¸c˜ao: Nesta etapa ´e executada a mesma simula¸c˜ao da MCS, por´em ´e tomado como raiz o n´o que foi adicionado na etapa de expans˜ao imediatamente anterior `a simula¸c˜ao.

(30)

18 • Back-propagation: Esta ´e a ´ultima etapa de cada ciclo, em que o resultado da etapa anterior ´e considerado para que se fa¸ca a atualiza¸c˜ao da ´Arvore de Estat´ısticas.

´

E percorrido o caminho de volta at´e a raiz, neste processo ´e incrementado o contador de visita de cada n´o neste caminho, inclusive a raiz. Nesta etapa atualiza-se tamb´em o valor de utilidade de cada n´o somando o resultado da simula¸c˜ao ao valor de

utili-dade que j´a se encontra armazenado no n´o [Bradberry 2015 (accessed September 19, 2016)]. Ao t´ermino de cada execu¸c˜ao da MCTS a ´arvore gerada pode ser preservada para

a pr´oxima execu¸c˜ao do algoritmo, desta forma a cada vez que a MCTS for executada a estimativa de utilidade de cada n´o se tornar´a mais confi´avel. Essa estrat´egia ´e especial-mente importante para contextos em que o tempo de execu¸c˜ao ´e bastante limitado, como por exemplo uma competi¸c˜ao de GGP.

A varia¸c˜ao da MCTS, chamada UCT, tem a vantagem de oferecer um bom balan-ceamento entre a expans˜ao e a explora¸c˜ao da ´Arvore de Estat´ısticas do jogo, evitando que em muitos ciclos repetidos se execute somente expans˜ao de n´os n˜ao visitados ou explora¸c˜ao de n´os j´a visitados.

A MCTS torna-se mais consistente conforme tem mais tempo para executar a busca. Quando o tempo dispon´ıvel para sua execu¸c˜ao aproxima-se do infinito, as decis˜oes tomadas pela MCTS tendem a ser perfeitas. Conforme o tempo dispon´ıvel para a execu¸c˜ao do algoritmo aumenta, a ´Arvore de Estat´ısticas torna-se cada vez maior, portanto h´a a possibilidade de que n˜ao haja mem´oria o suficiente para comportar novos n´os gerados na ´

arvore, neste caso uma maneira de contornar este problema seria trocar para a execu¸c˜ao de uma varia¸c˜ao da MCTS que n˜ao gera novos n´os e trabalha somente na explora¸c˜ao de n´os j´a visitados para melhorar a confiabilidade de suas estimativas de utilidade.

(31)

Cap´ıtulo 3

Um player de General Game Playing

Para a implementa¸c˜ao deste trabalho foi utilizada arcabou¸co de implementa¸c˜ao do curso de General Game Playing da Universidade de Stanford, que est´a dispon´ıvel no github1. Este arcabou¸co oferece alguns componentes ´uteis para o desenvolvimento, teste

e experimenta¸c˜ao de um agente de GGP. Esta base de c´odigo do interpretador de GGP e aparatos ´uteis s˜ao escritos na linguagem Java, a mesma que foi utilizada para o desenvol-vimento do agente de GGP deste trabalho. A IDE escolhida para o desenvoldesenvol-vimento do agente de GGP neste trabalho foi o Eclipse, por ter tutorial sobre a configura¸c˜ao da base de c´odigo com o Eclipse e tamb´em por ser gratuita.

A implementa¸c˜ao do agente jogador de GGP deste trabalho, constru´ıda em cima do arcabou¸co de GGP, ´e muito dependente dos m´odulos deste arcabou¸co, pois o agente jogador deste trabalho ´e uma extens˜ao das interfaces do arcabou¸co e funciona acoplado ao mesmo, para que possa ser integrado adequadamente aos m´odulos fornecidos no ar-cabou¸co. Portanto, este cap´ıtulo ter´a uma profundidade t´ecnica grande, pois ´e essencial compreender detalhes do arcabou¸co utilizado para que se compreenda plenamente a im-plementa¸c˜ao do agente deste trabalho.

Neste trabalho foram utilizados cinco componentes dentre os componentes dispo-n´ıveis na base de GGP. Na Figura 3.1 s˜ao apresentados de forma gen´erica os componentes da base de GGP. S˜ao eles: (1) o player, que se conecta ao (2) servidor para participar de uma partida e roda um dos agentes de GGP dispon´ıveis, (3) o Kiosk que permite partidas de um humano contra o agente de GGP, (4) o interpretador de GDL, que ´e o cerne do GGP, (5) e uma interface de classes para facilitar a utiliza¸c˜ao do interpretador de GDL,

1https://github.com/hardiecate/ggp-base

(32)

20

Figura 3.1: M´odulos do arcabou¸co de GGP

para que n˜ao seja necess´ario dispender tempo e esfor¸co trabalhando diretamente com a complexidade da linguagem crua. O m´odulo da GDL ´e utilizado para encapsular o jogo, ou seja, atrav´es deste m´odulo o agente poder´a compreender as regras do jogo. A interface encapsula a implementa¸c˜ao do agente, e atrav´es dela o agente consegue interagir com os outros m´odulos da base de c´odigo. Na Figura 3.2 ´e apresentada uma vis˜ao geral sobre a arquitetura do agente de GPP atrav´es de um diagrama simplificado. A seguir s˜ao listados os m´odulos da base de GGP com uma breve descri¸c˜ao de cada um:

• Kiosk : Este componente ´e ´util para testes r´apidos e manuais, pois permite uma partida entre um humano e o agente de GGP que est´a sendo desenvolvido. Com esta ferramenta, ´e poss´ıvel rodar o agente de GGP na sua fase de desenvolvimento

(33)

para verificar se o agente faz escolhas coerentes, para aferir o n´ıvel e consistˆencia de jogo do agente e tamb´em para verificar se o agente de GGP escolhe movimentos v´alidos. Tamb´em ´e ´util para procurar erros na implementa¸c˜ao. Esta ferramenta permite a configura¸c˜ao do agente de GGP, ou seja, pode-se definir o tempo que o agente ter´a para se preparar para a partida e tamb´em o tempo que o agente ter´a para tomar a decis˜ao de qual movimento efetuar´a. O jogador humano sempre pode tomar o tempo que desejar para movimentar, o Kiosk n˜ao oferece a configura¸c˜ao de limitar o tempo do jogador humano. Por exemplo, uma partida pode ser configurada para o jogo de xadrez, fornecendo ao agente jogador 20 segundos de prepara¸c˜ao para a partida e 10 segundos para a escolha do movimento, por´em o jogador humano ter´a tempo indeterminado para estas tarefas.

• Server : Este componente hospeda uma partida entre players. A sua fun¸c˜ao ´e receber dos players participantes de uma partida os movimentos que escolheram, verificar se o movimento ´e permitido, atualizar o estado do jogo no hospedeiro, informar aos participantes qual ´e o novo estado do jogo e solicitar ao pr´oximo participante da vez que fa¸ca seu movimento. O hospedeiro ent˜ao ´e respons´avel por gerenciar as parti-das, verificar se os movimentos s˜ao v´alidos, decidir quem ´e o pr´oximo participante a fazer um movimento e informar quem ´e o vencedor e quem s˜ao os perdedores. Existem jogos em que os participantes fazem movimentos simultaneamente, ou seja, v´arios jogadores escolhem um movimento num mesmo turno, e o servidor ´e capaz de gerenciar estes casos tamb´em, embora o escopo deste trabalho n˜ao aborde esse tipo de jogo.

• Player : O player ´e o cliente. A sua fun¸c˜ao ´e rodar remotamente um dos agentes de GGP desenvolvidos na base de GGP, conectar com o servidor, iniciar a partida, fazer a comunica¸c˜ao com o servidor e repassar as solicita¸c˜oes do servidor ao agente de GPP. Portanto o player ´e uma interface entre o agente de GGP desenvolvido e o hospedeiro da partida, atuando como um facilitador desta comunica¸c˜ao, descartando a necessidade de se investir tempo estudando os protocolos de rede utilizados e estabelecendo uma conex˜ao est´avel e segura.

• Interpretador de GDL: Este componente ´e o cerne deste trabalho. Toda a base para a interpreta¸c˜ao da GDL ´e oferecida neste m´odulo da base de GGP. O player

(34)

22 recebe do servidor a descri¸c˜ao do jogo em GDL e ent˜ao utiliza o interpretador para instanciar a configura¸c˜ao inicial do jogo, que ´e composta pelas proposi¸c˜oes base, e depois para rodar as transi¸c˜oes de estado do jogo conforme o agente desempenha suas decis˜oes. Este m´odulo fornece tamb´em todo o suporte ao agente de GGP para que ele possa simular movimentos e construir sua ´arvore de estat´ıstica, atrav´es de proposi¸c˜oes de transi¸c˜ao de estados e dos relacionamentos para verificar informa¸c˜oes como o jogador da vez, se um estado ´e terminal ou n˜ao etc.

• Interface com o Interpretador : Este componente ´e um facilitador para a implemen-ta¸c˜ao do agente de GPP. Para o agente de GGP conseguir simular ramos da ´arvore de estados do jogo, precisaria rodar proposi¸c˜oes utilizando o interpretador e tam-b´em fazer consultas de relacionamentos, o que adicionaria bastante dificuldade a sua implementa¸c˜ao por ter que lidar diretamente com a GDL crua. Por exemplo, considerando o caso do jogo da velha, para verificar o estado atual o agente teria que verificar para cada c´elula se ela est´a vazia, preenchida com cruz ou preenchida com bola, para isto deveria para cada c´elula verificar qual das trˆes proposi¸c˜oes pos-s´ıveis tem o valor true, ou seja, cell(linha, coluna, vazio), cell(linha, coluna, cruz) e cell(linha, coluna, bola). Este componente oferece uma interface entre o interpre-tador e o agente de GGP, com classes e interfaces prontas que possuem m´etodos que j´a executam os comandos de GDL necess´arios para se obter uma informa¸c˜ao que necessita, ou para fazer determinados tipos de transi¸c˜ao de estados, pulando a complexidade da linguagem GDL e fornecendo a informa¸c˜ao solicitada j´a processada e simplificada. Este m´odulo tamb´em oferece uma m´aquina de estados pronta que dever´a ser utilizada para que o agente de GGP percorra o espa¸co de estados do jogo, removendo a necessidade de se dedicar esfor¸co e tempo para a implementa¸c˜ao desta estrutura essencial para o desenvolvimento do agente.

Para a etapa de testes de n´ıvel de jogo do agente de GGP e calibra¸c˜ao de constantes foram utilizados dois componentes em conjunto, o player e o servidor, al´em do interpre-tador de GDL que ´e sempre utilizado por qualquer outro componente por ser essencial para que haja GGP. Como o servidor permite programar uma fila de partidas para serem executadas uma ap´os a outra, bastou-se deixar os players conectados ao servidor e deixar as partidas acontecerem e seus hist´oricos serem armazenados.

(35)

Figura 3.3: Diagrama de classe da interface com o interpretador de GDL

A Figura 3.4 exibe um modelo de alto n´ıvel da intera¸c˜ao do agente de GGP de-senvolvido neste trabalho com o arcabou¸co de GGP utilizado. O arcabou¸co encapsula a GDL, ou seja, o agente n˜ao faz requisi¸c˜oes diretamente em linguagem l´ogica, mas sim atrav´es de m´etodos dispon´ıveis no arcabou¸co que compilam as requisi¸c˜oes necess´arias em GDL para a consulta que representam. O arcabou¸co ´e capaz de solicitar ao agente de GGP que fa¸ca um movimento, e o informa o tempo limite para tomar uma decis˜ao. O agente de GGP consulta no arcabou¸co as informa¸c˜oes que preicsa para tomar sua decis˜ao, como por exemplo o estado atual do jogo, quais movimentos s˜ao v´alidos, se um dado estado ´e terminal etc. Assim que o agente est´a pronto para escolher o movimento, ele pode comunicar `a base de GGP o movimento escolhido.

Antes de entrar em detalhes sobre a implementa¸c˜ao do agente de GGP e sobre classes e m´etodos importantes da base de c´odigo, ´e importante apresentar uma classe que funciona como esqueleto para o agente de GGP, a classe StateM achineGamer. A ideia desta classe ´e representar um agente de GGP e padronizar a sua interface para que outros m´odulos da base de c´odigo possam se comunicar adequadamente com o mesmo. Existe um m´etodo que permite que seja solicitado ao agente jogador de GGP que um movimento seja feito, dado um tempo limite para a escolha do movimento. Existe um m´etodo para solicitar que o agente se prepare para come¸car a partida, dado um tempo

(36)

24

Figura 3.4: Comunica¸c˜ao do agente com a base de GGP

limite de prepara¸c˜ao. ´E poss´ıvel atualizar o estado da m´aquina de estados alocada para um agente jogador de GGP. Quando um player esta interagindo com o servidor da partida, ou seja, atuando como um intermediador da comunica¸c˜ao do agente jogador de GGP com o servidor, ent˜ao o player precisa acessar a m´aquina de estados do agente jogador para atualiz´a-la quando receber do servidor a notifica¸c˜ao de que o estado do jogo mudou, ou seja, outro agente jogador participante da partida fez algum movimento.

Na Figura 3.3 est˜ao apresentados o diagrama da classe StateM achineGamer e os relacionamentos entre as classes da interface sobre o interpretador de GDL. A seguir h´a uma lista dos m´etodos mais importantes da classe com a explica¸c˜ao de sua fun¸c˜ao e utilidade na implementa¸c˜ao do agente de GGP. Os m´etodos que tˆem utilidade interna `

a classe, e n˜ao s˜ao utilizados pelo agente de GGP direta ou indiretamente, n˜ao ser˜ao abordados.

• public abstract StateMachine getInitialStateMachine(): Este m´etodo retorna a m´ a-quina de estados que ser´a utilizada pelo agente de GGP, j´a configurada com o estado inicial, ou seja, o conjunto de proposi¸c˜oes-base. A base de c´odigo permite que se crie uma m´aquina de estados personalizada, ´e poss´ıvel fazer otimiza¸c˜oes no desempenho da m´aquina de estados ou adapta¸c˜oes para se adequar melhor `as necessidades do agente de GPP. No caso deste trabalho, como o objetivo n˜ao ´e criar o agente mais otimizado poss´ıvel, foi utilizada uma m´aquina de estados padr˜ao que ´e disponibili-zada na pr´opria base de c´odigo. Esta m´aquina de estados padr˜ao fornece todas as funcionalidades essenciais para a implementa¸c˜ao do agente de GGP deste trabalho.

(37)

• public abstract void stateMachineMetaGame(long timeout): Este m´etodo ´e chamado para solicitar ao agente de GGP que inicie a fase de prepara¸c˜ao para a partida, ´e fornecido o tempo limite para esta prepara¸c˜ao.

• public abstract Move stateMachineSelectMove(long timeout): Este m´etodo solicita ao agente de GGP que comece o processamento do movimento que escolher´a. Espera-se um movimento v´alido escolhido pelo agente. ´E fornecido o tempo limite que o agente tem para tomar a decis˜ao de qual movimento efetuar. No momento em que este m´etodo ´e chamado, a m´aquina de estados do agente j´a deve ter sido atualizada para o estado atual da partida, sen˜ao o movimento escolhido ser´a inconsistente ou incorreto, por´em quem cuida dessa atualiza¸c˜ao ´e o intermediador da partida, seja o Player ou o Kiosk.

• public abstract void stateMachineStop(): Quando o intermediador do agente de GGP entende que a partida deve ser terminada, este m´etodo ´e chamado. Nesta fase o agente de GGP far´a o processamento final e armazenamento de aprendizado caso tenha alguma abordagem desta natureza implementada. Pode tamb´em armazenar a ´arvore de estat´ısticas.

• public abstract void stateMachineAbort(): Quando o intermediador da partida pre-cisa abortar a partida por qualquer raz˜ao, o agente de GGP ´e informado atrav´es deste m´etodo. Alguns dos motivos que podem causar a chamada deste m´etodo s˜ao runtime error, queda de conex˜ao, fechamento inesperado do servidor etc. Este m´ e-todo ´e ´util para que o agente de GGP preserve qualquer dado que possa aproveitar da partida parcial que estava participando.

• public final MachineState getCurrentState(): Retorna o estado atual em que se encontra a m´aquina de estados do agente de GGP.

• public final Role getRole(): Retorna com qual papel o agente de GGP est´a jogando. Por exemplo, no jogo da velha h´a dois pap´eis, X e O.

• public final StateMachine getStateMachine(): Retorna a m´aquina de estados do agente de GGP. Este m´etodo ´e utilizado tanto pelo intermediador quando precisa atualizar o estado da m´aquina de estados do agente, quanto pelo pr´oprio agente

(38)

26 para fazer simula¸c˜oes de sucess˜oes de movimentos e possibilitar a constru¸c˜ao de sua ´

arvore de estat´ısticas.

Na base de c´odigo existem classes que funcionam como uma interface entre o inter-pretador de GDL e a implementa¸c˜ao do agente jogador de GGP. Estas classes encapsulam a complexidade de ter que lidar diretamente com proposi¸c˜oes em linguagem l´ogica. Por-tanto, neste trabalho a implementa¸c˜ao do agente foi feita sobre esse m´odulo, que integra a solu¸c˜ao proposta ao motor da linguagem GDL, tornando os detalhes da interpreta¸c˜ao da linguagem GDL transparente ao desenvolvedor.

A classe StateMachine representa o espa¸co de estados do jogo. Atrav´es desta classe ´e poss´ıvel obter informa¸c˜oes sobre o estado atual do jogo, quem ´e o jogador da vez, verificar se um dado estado ´e terminal, verificar se algu´em venceu dado um estado arbitr´ario que perten¸ca ao espa¸co de estados do jogo. Esta classe permite tamb´em verificar quais s˜ao os movimentos permitidos, dado o estado atual ou dado um estado arbitr´ario v´alido, ou seja, que perten¸ca ao espa¸co de estados do jogo. Com a utiliza¸c˜ao da classe StateMachine ´e poss´ıvel percorrer o espa¸co de estados do jogo atrav´es das transi¸c˜oes de estados. A seguir h´a uma lista dos m´etodos da classe StateMachine que s˜ao essenciais `a implementa¸c˜ao do agente de GGP. Os m´etodos que tˆem funcionalidade interna `a classe e n˜ao s˜ao utilizados diretamente na implementa¸c˜ao do agente n˜ao ser˜ao abordados.

• public abstract void initialize(List<Gdl> description): Este m´etodo n˜ao ´e utilizado diretamente pelo agente de GGP, por´em ´e utilizado para inicializar a m´aquina de estados com as proposi¸c˜oes-base e as regras do jogo descrito, em outras palavras, ele recebe uma lista de comandos em GDL para gerar o modelo de transi¸c˜ao e o estado inicial. Este m´etodo ´e utilizado pelo Player ou Kiosk.

• public abstract int getGoal(MachineState state, Role role): Este m´etodo retorna um valor contido no intervalo [0, 100], que representa a utilidade do estado fornecido para o papel fornecido. Este valor depende da descri¸c˜ao do jogo em GDL, geralmente os valores s˜ao 0, caso o estado fornecido seja terminal e o papel fornecido tenha perdido, 100, caso o estado seja terminal e o papel fornecido tenha vencido, e 50, caso o estado seja terminal e tenha acontecido um empate ou caso o estado n˜ao seja terminal.

(39)

• public abstract boolean isTerminal(MachineState state): Dado um estado arbitr´ario pertencente ao espa¸co de estados do jogo, ou seja, um estado v´alido, este m´etodo retorna true caso o estado seja terminal e false caso contr´ario.

• public abstract List<Role> getRoles(): Este m´etodo retorna a lista de todos os pap´eis dispon´ıveis no jogo. Por exemplo no jogo da velha retornaria uma lista com dois elementos, X e O.

• public abstract MachineState getInitialState(): Este m´etodo retorna o estado inicial do jogo, ou seja, o estado constru´ıdo com as proposi¸c˜oes-base definidas na descri¸c˜ao do jogo em GDL.

• public abstract List<Move> getLegalMoves(MachineState state, Role role): Este m´etodo recebe um estado dentre os poss´ıveis estados do espa¸co de estados do jogo e um papel e processa uma lista de movimentos v´alidos a partir do dado estado e o dado papel.

• public abstract MachineState getNextState(MachineState state, List<Move> mo-ves): Este m´etodo faz a transi¸c˜ao de um dado estado arbitr´ario para um outro estado, seguindo os movimentos passados como uma lista de movimentos, desde que todos os movimentos sejam v´alidos. A lista de movimentos cont´em um movimento para cada papel do jogo, a ordem dos movimentos na lista deve seguir a ordem da lista de pap´eis adquirida chamando o m´etodo getRoles(). Mesmo que seja um jogo em que somente um jogador executa um movimento por turno, para os pap´eis que n˜ao podem executar nenhum movimento deve ser passado NOOP.

• public MachineState getNextStateDestructively(MachineState state, List<Move> mo-ves): Faz o mesmo que o m´etodo getNextState, por´em n˜ao preserva o estado passado para o fim de economizar mem´oria. Portanto depois que este m´etodo for chamado, o estado passado n˜ao ser´a mais v´alido.

• public List<List<Move> > getLegalJointMoves(MachineState state): Este m´etodo recebe um dado estado que perten¸ca ao espa¸co de estados do jogo e retorna um produto cartesiano de todas as possibilidades de movimentos a partir deste estado. O produto cartesiano ´e retornado em forma de uma lista de listas de movimentos. Cada lista de movimentos tem um movimento para papel do jogo, a ordem dos

(40)

28 movimentos ´e a mesma ordem retornada pelo m´etodo getRoles(). Para jogos em que somente um jogador desempenha um movimento por turno, a cardinalidade da lista de listas de movimentos ser´a a mesma da lista de movimentos v´alidos do jogador da vez.

• List<List<Move> > getLegalJointMoves(MachineState state, Role role, Move move): Este m´etodo retorna um subconjunto do produto cartesiano retornado pelo m´etodo anterior, com a restri¸c˜ao de que filtrar´a somente as tuplas em que o dado papel efe-tua o dado movimento passados para os parˆametros do m´etodo. Este m´etodo s´o faz sentido para jogos em que mais de um papel pode efetuar um movimento por turno, sua utiliza¸c˜ao seria verificar todos os poss´ıveis movimentos de outros participantes da partida caso um dos participantes j´a tenha escolhido seu movimento.

• List<MachineState> getNextStates(MachineState state): Este m´etodo expande um estado fornecido, desde que o estado seja v´alido. A lista de estados retornada pode conter estados repetidos, caso seja um jogo em que mais de um participante pode efetuar um movimento por turno, desde que seja poss´ıvel dentro do modelo de transi-¸c˜ao do jogo duas ou mais combina¸c˜oes de movimentos dos participantes transitarem de um estado para um outro mesmo estado.

• public Map<Move, List<MachineState> > getNextStates(MachineState state, Role role): Dado um estado v´alido e um papel dispon´ıvel na descri¸c˜ao do jogo, este m´ e-todo retorna um mapeamento entre cada movimento v´alido para o papel fornecido a partir do estado fornecido, e uma lista de pr´oximos estados para o qual aquele movimento a partir do estado fornecido pode transitar. Caso seja um jogo em que somente um jogador efetua um movimento por turno, a lista ter´a sempre cardina-lidade um, caso contr´ario a lista pode conter mais de um pr´oximo estado poss´ıvel decorrente das m´ultiplas possibilidades de movimento simultˆaneo dos outros parti-cipantes da partida.

• public Map<Role, Integer> getRoleIndices(): Este m´etodo retorna um mapeamento entre os pap´eis no jogo e seus ´ındices.

• public List<Integer> getGoals(MachineState state): Dado um estado, retorna um valor de utilidade deste estado para cada papel dispon´ıvel no jogo, a ordem da lista

(41)

´

e a mesma ordem retornada pelo m´etodo getRoles().

• public MachineState getRandomNextState(MachineState state): A partir do estado fornecido, retorna um outro estado do espa¸co de estados do jogo escolhido aleato-riamente, desde que haja uma transi¸c˜ao direta do estado fornecido para o estado obtido pelo m´etodo. Este m´etodo ´e ´util para fazer a simula¸c˜ao aleat´oria do algoritmo MCTS.

• public MachineState performDepthCharge(MachineState state, final int[] theDepth): Este m´etodo ´e um atalho para a etapa do algoritmo MCTS de simula¸c˜ao, onde su-cessivos movimentos s˜ao feitos aleatoriamente at´e que se alcance um estado terminal do jogo. Ao concluir a simula¸c˜ao, este m´etodo retorna o estado terminal encontrado. A classe MachineState representa um estado do espa¸co de estados do jogo. Esta classe armazena um conjunto de proposi¸c˜oes em GDL que configuram o estado que o objeto desta classe est´a representando. A seguir est˜ao listados os m´etodos da classe MachineState importantes para a implementa¸c˜ao deste trabalho:

• public boolean equals(Object o): Este m´etodo retorna true caso o objeto passado como argumento ´e um objeto da classe MachineState e representa o mesmo estado do espa¸co de estados do jogo que est´a sendo representado pelo objeto do qual o m´etodo foi chamado.

• public String toString(): Este m´etodo converte o estado representado para um string com proposi¸c˜oes em GDL. A utilidade deste m´etodo na implementa¸c˜ao deste traba-lho foi auxiliar na depura¸c˜ao do c´odigo quando era necess´ario verificar o conte´udo de um conjunto de estados.

A classe Role representa um papel numa partida do jogo. A finalidade desta classe ´e encapsular consultas em GDL sobre os pap´eis do jogo para tornar toda a parte da GDL transparente ao desenvolvedor. Os principais m´etodos desta classe para este trabalho s˜ao os mesmos que os da classe MachineState, equals(Object o) e toString(). O m´etodo toString() retorna o nome do papel em uma string, por exemplo num jogo de xadrez poderia retornar ”black” ou ”white”.

A classe Move representa um potencial movimento, ou seja, uma transi¸c˜ao de um estado do espa¸co de estados do jogo para outro, que seja v´alida. Na pr´atica esta

(42)

30

Figura 3.5: Fluxograma de uma partida

classe armazena um termo da linguagem GDL, um objeto do tipo GdlTerm. A classe StateMachine utiliza o conte´udo da classe Move para efetuar uma transi¸c˜ao de estado.

Na Figura 3.5 est´a apresentado um fluxograma do funcionamento de todo o pro-cesso de uma partida, desde as solicita¸c˜oes do servidor at´e as respostas ao servidor. O

(43)

servidor solicita o pr´e-processamento ou a escolha de um movimento, a comunica¸c˜ao ´e feita com o player. O player aciona o agente jogador de GGP. O agente jogador executa o algoritmo MCTS, ao passo que atualiza a ´arvore de estat´ısticas. O agente responde ao player, e ent˜ao o player responde ao servidor.

O agente de GGP deste trabalho consiste de trˆes classes. Duas delas, a classe StateTree e a classe Node s˜ao componentes da estrutura de dados necess´aria para a im-plementa¸c˜ao do agente jogador de GGP. A classe MonteCarloTreeSearchGamer cont´em a implementa¸c˜ao do algoritmo Monte Carlos Tree Search e utiliza as outras duas classes da implementa¸c˜ao. Na Figura 3.6 s˜ao apresentados a arquitetura da implementa¸c˜ao do agente e os relacionamentos entre as suas classes e as classes da interface com o interpretador de GDL.

A ´arvore de estat´ısticas do algoritmo MCTS consiste das classes StateTree e Node. Na Figura 3.7 ´e exibida a composi¸c˜ao da ´arvore. A ´arvore consiste de instˆancias da classe Node, que s˜ao os n´os. A classe StateTree gerencia a estrutura da ´arvore e d´a a vis˜ao de um objeto singular. Esta ´arvore armazena estados j´a visitados e estat´ısticas sobre os estados visitados, como a quantidade de vezes que o estado foi visitado e a quantidade

(44)

32 de vit´orias que o agente jogador obteve na etapa de simula¸c˜ao, ao visitar o ramo do estado em quest˜ao. Os estados contidos na ´arvore de estat´ısticas, bem como os seus dados estat´ısticos associados, s˜ao armazenados na classe Node. Al´em destas informa¸c˜oes, a classe Node calcula o U CT do n´o. A seguir h´a uma lista dos principais atributos da classe Node e suas descri¸c˜oes:

• state: Este atributo armazena o estado do espa¸co de estados do jogo que este n´o representa

• transitionMove: Este atributo armazena o movimento que foi feito a partir do estado armazenado em seu n´o-pai, para que fosse alcan¸cado o seu estado armazenado. Caso o n´o seja a raiz, este atributo armazena o valor null.

• parent : Este atributo armazena o n´o-pai deste n´o. Caso o n´o seja a raiz, este atributo recebe o valor null.

• children: Este atributo ´e um conjunto de n´os-filhos. Como este trabalho trata de um contexto em que o espa¸co de estados ´e desconhecido, por ser uma abordagem de general game playing, a cardinalidade dos n´os ´e arbitr´aria, al´em disso a ordem dos filhos n˜ao ´e relevante, portanto ´e utilizada a estrutura de dados de conjunto. • visitCount : Este atributo armazena a quantidade de vezes que a busca da etapa de

sele¸c˜ao passou por este n´o.

• winCount : Este atributo contabiliza quantas vezes a etapa de simula¸c˜ao obteve um resultado de vit´oria, dentre toda as vezes que a busca na etapa de sele¸c˜ao passou por este n´o.

• explored : Indica se este n´o j´a foi visitado pelo menos uma vez, pois ele pode ter sido criado e adicionado `a ´arvore na fase de expans˜ao e n˜ao ter sido visitado nenhuma vez ainda. Esta informa¸c˜ao ´e importante, pois na fase de sele¸c˜ao, quando a busca est´a num n´o que nem todos os filhos foram explorados ainda, escolhe-se arbitrariamente um n´o-filho que ainda n˜ao tenha sido explorado.

• isTerminal : Este atributo indica se o n´o em quest˜ao ´e um n´o terminal.

Os m´etodos da classe Node tˆem a finalidade de oferecer as funcionalidades neces-s´arias `as classes StateTree e MonteCarloTreeSearchGamer. Alguns dos m´etodos da classe

(45)

Node executam fun¸c˜oes essenciais para algumas das etapas do algoritmo MCTS, princi-palmente nas etapas de sele¸c˜ao, expans˜ao e back-propagation. A seguir, h´a uma lista com os m´etodos da classe Node utilizados na implementa¸c˜ao do algoritmo MCTS:

• public boolean areChildrenCreated(): Verifica se os n´os-filho j´a foram criados. Os n´os filhos quando s˜ao criados na fase de expans˜ao, j´a s˜ao criados todos de uma ´unica vez, por´em incialmente est˜ao como n˜ao explorados.

• public boolean areAllChildrenExplored(): Verifica se todos os n´os-filhos foram explo-rados. Na fase de sele¸c˜ao ´e escolhido sempre um n´o n˜ao explorado, a n˜ao ser que todos os n´os-filhos j´a tenham sido explorados, neste caso ´e escolhido um n´o-filho segundo o crit´erio de UCB do algoritmo.

• public boolean createChildren(): Este m´etodo faz a etapa de expans˜ao. Ao ser chamado, todos os n´os-filhos do n´o em quest˜ao s˜ao criados de uma vez, todos s˜ao configurados como n˜ao explorados. Caso o n´o j´a tenha os n´os-filhos criados, ou seja, um n´o terminal da ´arvore de estados do jogo, nenhuma a¸c˜ao ´e executada.

• public Node selectBestChild(): Retorna o melhor filho segundo o crit´erio de UCB do algoritmo. Caso nem todos os filhos tenham sido ainda visitados, retorna o valor null.

• public Node selectBestScoreChild(): Retorna o melhor filho utilizando como crit´erio somente a propor¸c˜ao de quantidade de vit´orias para a quantidade de visitas. Se os n´os-filhos ainda n˜ao foram criados, retorna o valor null.

• public Node getRandomUnexploredChild(): Este m´etodo seleciona aleatoriamente um dos n´os-filhos que n˜ao tenham sido ainda explorados. Sua fun¸c˜ao ´e selecionar um n´o-filho na etapa de expans˜ao do algoritmo. Caso os n´os-filhos ainda n˜ao tenham sido criados, retorna o valor null. Caso todos os n´os filhos j´a tenham sido criados, ´

e lan¸cada uma exce¸c˜ao.

• public void updateChildrenUCBVal(): Atualiza o valor do coeficiente UCB de todos os n´os-filhos que j´a foram visitados pelo menos uma vez.

• public int simulate(int probes): Este m´etodo executa a etapa de simula¸c˜ao do algo-ritmo MCTS, ou seja, a partir do estado que o n´o carrega, s˜ao feitas transi¸c˜oes de

Referências

Documentos relacionados

The strict partition problem is relaxed into a bi-objective set covering problem with k-cliques which allows over-covered and uncovered nodes.. The information extracted

Capa do livro Anayde Beiriz, Paixão e Morte na Revolução de 30 Anayde Beiriz diplomada professora Pôster do filme Parahyba, Mulher Macho Divulgação de relançamento do livro

Local de realização da avaliação: Centro de Aperfeiçoamento dos Profissionais da Educação - EAPE , endereço : SGAS 907 - Brasília/DF. Estamos à disposição

Nessa situação temos claramente a relação de tecnovívio apresentado por Dubatti (2012) operando, visto que nessa experiência ambos os atores tra- çam um diálogo que não se dá

Em estudos mais aprofundados, tem-se a análise dinâmica não linear geométrica de estruturas laminadas modeladas com elementos tridimensionais de barra considerando o efeito

Os sais hidratados podem ser considerados ligas de um sal inorgânico e água, formando um sólido crsitalino de fórmula geral

Contudo, sendo um campo de pesquisa e de atuação muito específico e novo no Brasil, ainda existe uma série de dificuldades para a eleição de parâmetros de conservação

Hoje o gasto com a saúde equivale a aproximada- mente 8% do Produto Interno Bruto (PIB), sendo que, dessa porcentagem, o setor privado gasta mais que o setor público (Portal