67
UNIVERSIDADE DO ESTADO DO AMAZONAS - UEA ESCOLA SUPERIOR DE TECNOLOGIA ENGENHARIA DE COMPUTA¸ C ˜ AO BRUNO MENDES JOGADOR DE TRUCO INTELIGENTE Manaus 2011

UNIVERSIDADE DO ESTADO DO AMAZONAS - UEA - Tiago de …tiagodemelo.info/monografias/2011/tcc-bruno-mendes.pdf · continuidade ao desenvolvimento deste tra- ... 4.2 Diagrama de classes

  • Upload
    vannhan

  • View
    214

  • Download
    0

Embed Size (px)

Citation preview

UNIVERSIDADE DO ESTADO DO AMAZONAS - UEA

ESCOLA SUPERIOR DE TECNOLOGIA

ENGENHARIA DE COMPUTACAO

BRUNO MENDES

JOGADOR DE TRUCO INTELIGENTE

Manaus

2011

BRUNO MENDES

JOGADOR DE TRUCO INTELIGENTE

Trabalho de Conclusao de Curso apresentado

a banca avaliadora do Curso de Engenharia

de Computacao, da Escola Superior de

Tecnologia, da Universidade do Estado do

Amazonas, como pre-requisito para obtencao

do tıtulo de Engenheiro de Computacao.

Orientador: Prof. Msc. Jucimar Maia da Silva Junior

Co-Orientador: Prof. Msc. William Roberto Malvezzi

Manaus

2011

ii

Universidade do Estado do Amazonas - UEA

Escola Superior de Tecnologia - EST

Reitor:

Jose Aldemir de Oliveira

Vice-Reitor:

Marly Guimaraes Fernandes Coelho

Diretor da Escola Superior de Tecnologia:

Mario Augusto Bessa de Figueiredo

Coordenador do Curso de Engenharia de Computacao:

Danielle Gordiano Valente

Coordenador da Disciplina Projeto Final:

Raminundo Correa de Oliveira

Banca Avaliadora composta por: Data da Defesa: 16/12/2011.

Prof. M.Sc. Jucimar Maia da Silva Junior (Orientador)

Prof. M.Sc. William Roberto Malvezzi (Co-Orientador)

Prof. M.Sc. Salvador Ramos Bernardino da Silva

CIP - Catalogacao na Publicacao

M538j MENDES, Bruno

Jogador de Truco Inteligente / Bruno Mendes; [orientado por] Prof. MSc.

Jucimar Maia da Silva Junior; [co-orientado por] Prof. MSc. William Malvezzi

- Manaus: UEA, 2010.

240 p.: il.; 30cm

Inclui Bibliografia

Trabalho de Conclusao de Curso (Graduacao em Engenharia de Computa-

cao). Universidade do Estado do Amazonas, 2011.

CDU: 004

iii

BRUNO MENDES

JOGADOR DE TRUCO INTELIGENTE

Trabalho de Conclusao de Curso apresentado

a banca avaliadora do Curso de Engenharia

de Computacao, da Escola Superior de

Tecnologia, da Universidade do Estado do

Amazonas, como pre-requisito para obtencao

do tıtulo de Engenheiro de Computacao.

Aprovado em: 16/12/2011BANCA EXAMINADORA

Prof. Jucimar Maia da Silva Junior, Mestre

UNIVERSIDADE DO ESTADO DO AMAZONAS

Prof. William Roberto Malvezzi, Mestre

UNIVERSIDADE DO ESTADO DO AMAZONAS

Prof. Salvador Ramos Bernardino da Silva, Mestre

UNIVERSIDADE DO ESTADO DO AMAZONAS

iv

Agradecimentos

Apos finalizar este trabalho que durou um

ano e contou com a colaboracao de diversas

pessoas, agradeco: ao meu orientador e ao

meu co-orientador pela paciencia, sabedoria

e conhecimento para conseguir me guiar ao

longo desta caminhada; a minha famılia pelo

carinho, compreensao e incentivo para dar

continuidade ao desenvolvimento deste tra-

balho, em especial a minha irma por ter au-

xiliado com a revisao gramatical do trabalho;

ao especialista por ter cedido seu tempo para

me ensinar as diversas estrategias existentes

no jogo de Truco e ter sugerido melhorias; e

a todos os voluntarios que participaram dos

experimentos de avaliacao do produto desen-

volvido por este trabalho.

v

Resumo

Este trabalho descreve o desenvolvimento de um Agente Inteligente capaz de jogar

Truco, um jogo de cartas que apresenta caracterısticas interessantes para serem abordadas

em um trabalho de Inteligencia Artificial, tais como domınio nao determinıstico, infor-

macoes imperfeitas e informacoes incompletas. Para o processo de tomada de decisao do

agente foi empregada logica Fuzzy por meio da modelagem de controladores no Matlab

para cada situacao onde fosse necessario tomar decisoes. Com o intuito de integrar a mo-

delagem do Matlab com o jogo de Truco em Java, utilizou-se a ferramenta Builder JA

para exportar as funcoes do Matlab para Java de modo a utilizar seu poder computacional

durante a partida. Os experimentos com jogadores humanos demonstraram que o nıvel de

jogo do agente inteligente e superior ao de um jogador que se considera iniciante no jogo

de Truco.

Palavras Chave: Truco, Agente Inteligente, Java, Fuzzy, Matlab

vi

Abstract

This work describes the development of an Artificial Agent capable of playing Truco,

a card game which presents interesting characteristics to be explored on an Artificial In-

telligence work, such as non deterministic domain, incomplete information and imperfect

information. The decision proccess of the developed agent was modeled using Fuzzy logic

by the construction of Fuzzy controllers using Matlab for each situation where decision

making was necessary. To integrate the Matlab model with the Truco game in Java the

Builer JA tool was used to export the needed Matlab functions to Java and bring all its

computational power inside the Truco game. The experiments with human players de-

monstrated that the game level of the intelligent agent is superior of that of a begginer in

Truco.

Keywords: Truco, Intelligent Agent, Java, Fuzzy, Matlab

vii

Sumario

Lista de Tabelas ix

Lista de Figuras x

Lista de Codigos xii

1 Introducao 1

1.1 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

1.2 Justificativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

1.3 Metodologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.4 Organizacao da Monografia . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2 Inteligencia Artificial 5

2.1 Sistemas Especialistas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2.2 Agentes Inteligentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2.3 Teoria Fuzzy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

2.3.1 Variaveis de Entrada e Saıda e Funcoes de Pertinencia . . . . . . . 11

2.3.2 Operacoes com Conjuntos Fuzzy . . . . . . . . . . . . . . . . . . . . 13

2.3.3 Base de Regras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2.3.4 Processo de Inferencia Fuzzy . . . . . . . . . . . . . . . . . . . . . . 16

3 O jogo de Truco 18

3.1 Estrategia basica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3.2 Estrategia intermediaria . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

3.3 Estrategia avancada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

4 Jogador de Truco Inteligente 26

4.1 MiniTruco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

4.2 Agente Inteligente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

viii

4.2.1 Modelagem Fuzzy . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

4.2.2 Modulo de comunicacao com o Matlab . . . . . . . . . . . . . . . . 38

4.3 Cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

4.4 Experimentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

5 Conclusoes 49

Referencias Bibliograficas 52

A Integracao com o Matlab 54

B Estrategia Fuzzy 55

C Cliente Applet 56

ix

Lista de Tabelas

4.1 Alguns comandos suportados pelo servidor miniTruco . . . . . . . . . . . . 29

x

Lista de Figuras

2.1 Esquema basico de um agente . . . . . . . . . . . . . . . . . . . . . . . . . 8

2.2 Esquema de um agente inteligente . . . . . . . . . . . . . . . . . . . . . . . 9

2.3 Esquema de um Sistema de Inferencia Fuzzy . . . . . . . . . . . . . . . . . 10

2.4 Grafico da variavel servico. . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

2.5 Esquema de um Sistema de Inferencia Fuzzy completo . . . . . . . . . . . 16

3.1 Diagrama de atividades simplificado de Truco Paulista . . . . . . . . . . . 20

3.2 Fluxograma de acao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

3.3 Fluxograma de reacao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

3.4 Fluxograma de decisao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

3.5 Fluxograma de blefe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

4.1 Diagrama de componentes do sistema . . . . . . . . . . . . . . . . . . . . . 27

4.2 Diagrama de classes do miniTruco . . . . . . . . . . . . . . . . . . . . . . . 28

4.3 Diagrama de classes do miniTruco . . . . . . . . . . . . . . . . . . . . . . . 29

4.4 Diagrama de sequencia Cliente-Servidor do miniTruco - Parte 1 . . . . . . 31

4.5 Diagrama de sequencia Cliente-Servidor do miniTruco - Parte 2 . . . . . . 32

4.6 Controlador Fuzzy de Acao . . . . . . . . . . . . . . . . . . . . . . . . . . 34

4.7 Controlador Fuzzy de Reacao . . . . . . . . . . . . . . . . . . . . . . . . . 35

4.8 Controlador Fuzzy da Decisao da Mao de 11 . . . . . . . . . . . . . . . . . 35

4.9 Controlador Fuzzy de Blefe . . . . . . . . . . . . . . . . . . . . . . . . . . 36

4.10 Grafico da variavel vantagem. . . . . . . . . . . . . . . . . . . . . . . . . . 38

4.11 Diagrama IDF0 de Criacao da API de Comunicacao com o Matlab . . . . . 39

4.12 Diagrama de classes da API de Comunicacao com o Matlab (I) . . . . . . . 42

4.13 Diagrama de classes da API de Comunicacao com o Matlab (II) . . . . . . 43

4.14 Diagrama de classes da API de Comunicacao com o Matlab (III) . . . . . . 44

4.15 Diagrama de classes dos componentes do applet miniTruco . . . . . . . . . 45

4.16 Tela de inıcio de partida do applet miniTruco . . . . . . . . . . . . . . . . 46

xi

4.17 Diagrama de classes do applet miniTruco . . . . . . . . . . . . . . . . . . . 46

4.18 Resultados em porcentagem de vitorias e derrotas do agente inteligente con-

tra jogadores humanos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

xii

Lista de Codigos

4.2.1 Funcao de Criacao de FIS no Matlab . . . . . . . . . . . . . . . . . . . . . 41

4.2.2 Funcao de Avaliacao de FIS no Matlab . . . . . . . . . . . . . . . . . . . . 41

4.2.3 Representacao da classe gerada pelo Matlab Builder JA . . . . . . . . . . . 41

Capıtulo 1

Introducao

Uma tecnica de Inteligencia Artificial que auxiliou na solucao de diversos problemas foi

a poda alpha-beta (alpha-beta pruning). Esta tecnica refere-se a uma forma de eliminar

caminhos nao visitados em uma arvore de busca para jogos de dois jogadores, de modo a

nao ter que computar todas as possıveis jogadas para encontrar o melhor resultado possıvel

em um tempo computacional muito inferior do que se fosse necessario computar todas as

alternativas.

A Inteligencia Artificial (IA) obteve grande sucesso em jogos classicos como xadrez, da-

mas e othello, onde a pesquisa alpha-beta e suficiente para conseguir solucionar o problema

com eficiencia (DAVIDSON, 2002). Esses jogos apresentam um domınio determinıstico,

onde e possıvel criar um grafo que mapeie todos os movimentos possıveis e depois a poda

alpha-beta e empregada para eliminar os caminhos nao desejados e reduzir o tempo de

busca pelo caminho otimo.

Os jogos possuem regras bem definidas e apresentam desafios complexos de serem so-

lucionados. O foco inicial da IA em jogos de informacao perfeita e completa sofreu muitas

crıticas, uma vez que os problemas do mundo real apresentam natureza nao determinıstica

e imperfeicoes (DAVIDSON, 2002). Isto tem motivado bastante a pesquisa utilizando IA

em jogos de domınios nao determinısticos e imperfeitos.

A aleatoriedade do embaralhar das cartas, a imprevisibilidade de cada jogador ao tentar

esconder seu jogo e o fato do jogador ter conhecimento apenas de uma pequena parcela do

estado do jogo (sua proprias cartas) fazem com que metodos convencionais como a poda

Objetivos 2

alpha-beta nao sejam suficientes para solucionar jogos de cartas como o Truco. A exem-

plo, no Poquer ha tanto informacoes imperfeitas (estrategia do oponente desconhecida)

e incompletas (cartas do oponente desconhecidas) quanto um domınio nao-determinıstico

(cartas embaralhadas), exigindo que tecnicas de aprendizado de maquina avancadas sejam

empregadas (DAVIDSON, 2002).

1.1 Objetivos

O objetivo geral deste trabalho e empregar Teoria Fuzzy na construcao de um agente

inteligente capaz de jogar Truco Paulista com o nıvel de um jogador intermediario. De modo

a contemplar este objetivo, sera necessario desenvolver os seguintes objetivos especıficos:

• Elaborar um Sistema de Inferencia Fuzzy (SIF) contendo a base de regras que repre-

senta o conhecimento de um especialista na area;

• Desenvolver a programacao do agente inteligente capaz de jogar Truco Paulista, fa-

zendo uso da implementacao de codigo aberto para o jogo chamada miniTruco e do

SIF desenvolvido;

• Desenvolver um cliente com interface grafica que permita interagir com o servidor do

jogo e realizar partidas controladas contra o agente desenvolvido;

• Avaliar o nıvel de jogo do agente desenvolvido, bem como realizar melhorias com

base no resultado das avaliacoes.

1.2 Justificativa

O jogo de Truco apresenta caracterısticas semelhantes a outros jogos de cartas, como

informacoes imperfeitas (desconhecimento do resultado: o oponente correu com uma carta

menor ou maior que a sua?), informacoes incompletas (conhecimento apenas das proprias

cartas e da carta da mesa) e domınio nao determinıstico (embaralhar das cartas). Alem

destas, tambem apresenta aspectos de colaboracao entre os jogadores, quando jogado entre

equipes. Logo, e um problema desafiador para a IA e sua pesquisa pode levar a resultados

Metodologia 3

interessantes que podem ser utilizados para resolver outros problemas de caracterısticas

similares, como aplicacoes financeiras na bolsa de valores.

O Truco e um jogo caracterıstico de algumas regioes brasileiras, especialmente nas

regioes Sul e Sudeste do Brasil. Apesar disso, ha poucos estudos cientıficos que buscam

prover uma solucao para o jogo.

Para quem for iniciar a pesquisa no Truco, ha apenas a implementacao de um servidor e

um cliente de codigo aberto para dispositivos moveis. Ja para o Poquer ha a implementacao

de um arcabouco completo de codigo aberto para o desenvolvimento de novos agentes,

incluindo um servidor escrito em Java, um cliente com interface grafica, implementacoes

de agentes que servem de referencia para novos trabalhos, alem de um modulo para coleta

de estatısticas e outro que permite simular disputas entre agentes. Alem disto, existe uma

competicao internacional anual especıfica para agentes inteligentes de Poquer, que ocorre

durante a Conferencia sobre IA da Associacao Americana de Inteligencia Artificial (AAAI

Conference on Artificial Intelligence).

Com o intuito de facilitar a pesquisa e difundir o Truco e necessario que haja pelo menos

um cliente web e uma implementacao de referencia para um agente inteligente, ambos de

codigo aberto. A implementacao de referencia serve como ponto de partida para a analise

de trabalhos futuros. Alem disso, um cliente web facilita a realizacao de experimentos, uma

vez que o servidor necessita ter o compilador do Matlab instalado mas o cliente apenas de

uma conexao com a internet e um navegador.

1.3 Metodologia

A primeira etapa do trabalho consiste em investigar as estrategias empregadas por um

jogador experiente de Truco e como elas podem ser expressadas atraves de uma base de

regras. Esta etapa pode ser subdividida em:

• Realizacao de entrevistas para elicitacao das regras;

• Criacao do Sistema de Inferencia Fuzzy;

• Validacao da base de regras junto ao especialista.

Organização da Monogra�a 4

A segunda etapa consiste no projeto e desenvolvimento, por meio de uma metodologia

iterativa, de um agente inteligente capaz de reproduzir o conhecimento de um jogador

profissional de Truco seguindo padroes de projeto, utilizando Teoria Fuzzy. As subetapas

sao:

• Modelagem UML do agente e dos componentes necessarios;

• Desenvolvimento e documentacao do agente e dos componentes necessarios;

• Teste dos componentes desenvolvidos.

Por fim, medir o desempenho do agente desenvolvido em partidas contra adversarios

humanos e identificar os pontos que precisam ser melhorados de forma contınua, ou seja,

ciclos de teste e manutencao do SIF deverao ocorrer ate se obter pelo menos um nıvel

intermediario de habilidade no jogo de Truco. Para tanto, serao seguidos os seguintes

passos:

• Realizacao de experimento onde o agente enfrentara jogadores iniciantes, intermedia-

rios e avancados;

• Avaliacao do desempenho do agente;

• Melhoramento do agente atraves da avaliacao dos jogadores e de possıveis falhas

encontradas.

1.4 Organizacao da Monografia

No capıtulo 2 sera abordado o surgimento e os principais conceitos relativos a teoria

Fuzzy. No capıtulo seguinte sera tratado o problema alvo deste trabalho, o jogo de Truco

e seus principais aspectos. Ao longo do capıtulo 4 mostraremos as tecnologias empregadas

na implementacao do agente, os artefatos gerados para atingir os objetivos propostos nesta

secao e os resultados obtidos com a realizacao de experimentos. Por fim, o ultimo capıtulo

descrevera as conclusoes obtidas com o desenvolvimento deste trabalho e propostas para

trabalhos futuros.

Capıtulo 2

Inteligencia Artificial

Em 1952 Newell e Simon elaboraram o Solucionador de Problemas Gerais ou Generic

Problem Solver (GPS). Foi planejado desde sua concepcao para reproduzir os passos do

protocolo humano de resolucao de problemas, tornando-se o primeiro programa a “pensar

de forma humana”. Isto porque foi verificado que a ordem na qual o programa considerava

metas e acoes era semelhante a ordem que nos seguimos, mas apenas para o pequeno

conjunto de problemas com os quais o programa conseguia lidar.

O termo Inteligencia Artificial (IA) foi cunhado por McCarthy em 1956. Um ano

depois, Herbert Simon acreditava que, baseado nos resultados iniciais da IA, logo logo a

variedade de problemas com os quais a IA poderia lidar seria equivalente a variedade de

problemas com os quais a mente humana consegue lidar. Chegou ate a estipular um prazo

de 10 anos para que uma maquina se tornasse campea de xadrez. No fim das contas acabou

levando 40 anos para que isso acontecesse.

Apesar da explosao inicial na solucao de problemas simples de domınios limitados que

ficaram conhecidos como micromundos, estas solucoes falhavam com problemas mais ex-

tensos ou complexos. Ou seja, a generalizacao da solucao para abranger uma classe maior

de problemas nao era possıvel. Serao descritas a seguir as tres principais dificuldades

enfrentadas pelos pesquisadores de IA na epoca.

A primeira dificuldade era que os programas continham pouco ou nenhum conhecimento

sobre o domınio do problema ao qual estavam solucionando. Na tentativa de obter solucoes

para toda uma abrangente classe de problemas nao eram levadas em consideracao as espe-

Sistemas Especialistas 6

cificidades do problema sendo tratado. Apos o lancamento do Sputnik em 1957, um esforco

grande foi empregado na construcao de programas de traducao para acelerar a traducao

de documentos cientıficos russos. Imaginava-se que transformacoes sintaticas simples ba-

seadas nas gramaticas russas e inglesas, juntamente com a substituicao de palavras com

a utilizacao de um dicionario eletronico, seriam suficientes para preservar os significados.

Porem a falta de conhecimento do assunto impossibilitava a solucao de ambiguidades e

reduzia a qualidade do texto final.

A segunda dificuldade diz respeito a abordagem empregada na resolucao, pois resol-

viam os problemas utilizando forca bruta, ou seja, experimentando diferentes combinacoes

de passos ate encontrar a solucao. A abordagem funcionava bem para os micromundos,

que possuıam um numero muito pequeno de acoes e solucoes possıveis. Ate o desenvolvi-

mento da Teoria de Complexidade Computacional, era uma crenca geral que o aumento da

escala para problemas maiores era apenas uma questao de haver hardware mais rapido e

maior capacidade de memoria (RUSSEL; NORVIG, 2004). Ou seja, so porque o programa

conseguia encontrar a solucao nao significava que era porque tinha o conhecimento de como

resolver o problema, mas sim porque testava todas as solucoes possıveis. Segundo Russel

e Norvig (2004), a incapacidade de conviver com a “explosao combinatoria” foi uma das

principais crıticas a IA contidas no relatorio de Lighthill, que formou a base para a decisao

do governo britanico de encerrar o apoio a pesquisa da IA em quase todas as universidades

na epoca.

A ultima dificuldade trata justamente das limitacoes existentes quanto a representacao

e implementacao do comportamento inteligente. Como veremos nas secoes subsequentes,

foi uma longa jornada ate que as estruturas basicas permitissem a representacao e imple-

mentacao de sistemas com conhecimento especialista, para que pudessem ser produzidos e

comercializados.

2.1 Sistemas Especialistas

Durante a primeira decada de pesquisas da IA, foram desenvolvidos programas que em-

pregavam metodos gerais de busca da solucao partindo de passos elementares ate atingir

solucoes completas. Isto impossibilitava que o programa fosse utilizado para encontrar solu-

Sistemas Especialistas 7

coes de problemas de maior escala, portanto, eram denominados fracos. Usar conhecimento

especıfico de domınio foi a alternativa que permitiu resolver problemas mais complexos.

Conforme descrito por Russel e Norvig (2004, p. 22), “[...] para resolver um problema

difıcil, voce praticamente ja deve saber a resposta”.

O primeiro sistema bem sucedido a empregar conhecimento especialista foi o DEN-

DRAL desenvolvido na universidade de Stanford em 1969 (RUSSEL; NORVIG, 2004). Seu

objetivo era descobrir as estruturas moleculares constituintes a partir da formula elementar

de uma molecula e de seu espectro de massa. Em seus resultados, o DENDRAL mostrou-se

mais eficiente que os proprios especialistas na solucao de misturas complexas, uma vez que

os humanos tendem a falhar com o grande numero de possıveis combinacoes (BUCHANAN;

FEIGENBAUM, 1978).

Apos o sucesso do DENDRAL na quımica, esta abordagem de conhecimento especi-

alista foi empregada na medicina, mais especificamente na area de diagnostico medico.

Desenvolvido por Feigenbaum e Buchanan (1978), pesquisadores da equipe que criou o

DENDRAL, com o auxılio do Dr. Shortliffe, o MYCIN possuıa aproximadamente 450 re-

gras e era capaz de diagnosticar infeccoes sanguıneas com maior eficacia do que medicos

em inıcio de carreira (RUSSEL; NORVIG, 2004).

As primeiras tentativas de reconhecimento da linguagem natural ficaram presas a analise

da sintaxe e da gramatica da linguagem, falhando por nao conseguir distinguir ambigui-

dades e referencias pronomiais. O conhecimento especialista foi utilizado para superar a

ambiguidade e reconhecer referencias pronomiais, porem, a serie de trabalhos realizados

apos a metade da decada de 70 ate a metade da decada de 80, concluiu que a compreensao

da linguagem exigia conhecimentos gerais alem de conhecimentos de areas especıficas para

que fosse robusta (RUSSEL; NORVIG, 2004).

O sucesso dos sistemas especialistas na solucao de problemas reais gerou demanda por

linguagens para representacao do raciocınio. Linguagens logicas como Prolog, na Europa,

e PLANNER, nos Estados Unidos; e outras com uma abordagem mais estruturada se

popularizaram na decada de 80 (RUSSEL; NORVIG, 2004). Projetos como o Fifth Genera-

tion no Japao e consorcios como a Microeletronics and Computer Technology Corporation

nos Estados Unidos eram iniciativas ambiciosas que marcaram o inıcio da industria da IA

propriamente dita, porem nunca atenderam as expectativas.

Agentes Inteligentes 8

Figura 2.1: Esquema basico de um agente

Duas pessoas sao necessarias para a criacao de um sistema especialista: o especialista do

domınio, que possui conhecimento sobre o problema e sabe como resolve-lo; e o engenheiro

do conhecimento, capaz de capturar o conhecimento do especialista e desenvolver uma

solucao computacional para o problema. A captura do conhecimento e denominada de

fase de aquisicao do conhecimento e e a parte mais difıcil na construcao de um sistema

especialista (SILER, 2005).

2.2 Agentes Inteligentes

De acordo com a definicao proposta por Russel e Norvig (2004) para agente inteligente,

este deve ser racional, capaz de agir sobre e de perceber o ambiente a sua volta. Ou

seja, capaz de escolher que acao tomar e de executa-la com base nos dados obtidos com a

percepcao do ambiente.

O esquema basico de um agente pode ser visto na figura 2.1. No caso de um agente

robotico a percepcao do ambiente pode ser feita atraves de sensores e as acoes podem

ser executadas por meio de atuadores, ja no caso de um agente de software a percepcao

e proveniente da leitura de dados de um arquivo, um canal de comunicacao - socket -,

da memoria ou recebimento de mensagens e as acoes pela gravacao de dados ou envio de

mensagens.

Ja para um agente inteligente, alem dos componentes apresentados anteriormente, te-

mos a racionalizacao, ou seja, o processo de tomada de decisao, conforme ilustrado na

figura 2.2 (RUSSEL; NORVIG, 2004). Para um agente robotico inteligente esta logica pode

estar contida em um programa em seu microcontrolador ou, em se tratando de um agente

de software inteligente, deve haver um modulo responsavel pela tomada de decisao.

O proposito de um agente inteligente normalmente consiste de um conjunto de metas

Agentes Inteligentes 9

Figura 2.2: Esquema de um agente inteligente

a serem cumpridas de acordo com a prioridade de cada uma, este conjunto denomina-se

de funcao de agente. A implementacao do processo de tomada de decisao que permite

ao agente analisar os dados de entrada e executar acoes que o facam cumprir sua funcao,

da-se o nome de programa de agente. Russel e Norvig caracterizam um agente como sendo

racional caso este faca tudo certo, e para fazer tal analise de certo ou errado e necessario que

haja uma forma de medir seu desempenho e analisar se as acoes que ele esta executando

estao condizentes com as metas predefinidas. A esta medida de desempenho nao existe

um criterio universal, e para um mesmo agente podem ser criadas inumeras medidas de

desempenho, portanto, e algo especıfico ao problema escolhido a ser solucionado.

Segundo a teoria dos jogos, um agente inteligente deve agir de forma casual ou, pelo

menos, de uma forma que pareca casual para os adversarios (RUSSEL; NORVIG, 2004).Por-

tanto, o agente desenvolvido neste trabalho nao seguira estritamente o conceito de agente

racional, mas sim a ideia de inteligencia que o faca parecer um jogador humano.

Existem diversas abordagens para a implementacao do processo de racionalizacao do

agente, estando entre as principais: algoritmos geneticos, redes neurais e teoria fuzzy. Algo-

ritmos Geneticos trabalham com o conceito biologico de evolucao, onde mutacoes ocorrem

em indivıduos de uma determinada populacao ate que alguma nova caracterıstica necessa-

ria seja desenvolvida (COPPIN, 2004). As Redeus Neurais tentam imitar o funcionamento

do cerebro humano por meio do uso de redes de neuronios artificiais (COPPIN, 2004). Um

neuronio artificial recebe um conjunto finito de entradas. A estas entradas e aplicada uma

funcao de ativacao, resultando no nıvel de ativacao do neuronio. O nıvel de ativacao e a

saıda do neuronio e pode ser passada a multiplos neuronios ou compor a saıda da rede.

Deste modo, processamentos complexos sao realizados pela composicao de multiplas uni-

dades basicas de processamento - neuronios artificiais - em uma unica rede neural que

trabalha como uma unidade de controle.

Teoria Fuzzy 10

Ja os sistemas Fuzzy utilizam-se da emulacao do pensamento humano por uma maquina

com o intuito de lidar com incertezas, ambiguidades e contradicoes (SILER, 2005).

2.3 Teoria Fuzzy

A definicao de conjunto fuzzy foi criada por Zadeh em 1964. Tal conceito surgiu para

conseguir lidar com classes de objetos imprecisas, tais como as classificacoes empregadas no

pensamento humano e necessarias a areas como reconhecimento de padroes, comunicacao

e abstracao (ZADEH, 1965). Sua motivacao era que a logica booleana nao fornecia meios

para lidar com imprecisoes e situacoes ambıguas.

Desde entao a Teoria Fuzzy vem ganhando um conjunto de aplicacoes sobre conjuntos

fuzzy e suas operacoes como definido inicialmente por Zadeh. Em 1987, foi apresentado o

controle automatico de um metro utilizando fuzzy no Japao. A partir disso diversas outras

aplicacoes tem sido desenvolvidas e inumeros trabalhos publicados na area.

Segundo Zadeh (1965 apud MALVEZZI, 2010), a medida que a informacao se torna

mais precisa e complexa, menos relevante ela acaba se tornando. Ou seja, nao adianta

fornecer detalhes adicionais que nao irao agregar valor a informacao, isto apenas a tornaria

mais complexa, e nao mais relevante.

Dessa forma, os conjuntos fuzzy lidam com a imprecisao como meio de manter a rele-

vancia necessaria da informacao sem aumentar sua complexidade. A exemplo, imaginemos

uma situacao do cotidiano em que uma pessoa pergunta a outra como ela esta. Esta pode

simplesmente responder “bem”, “mais ou menos” ou “mal”; ou entao iniciar a descricao

detalhada de seu estado atual antes de concluir se esta “bem”, “mais ou menos” ou “mal”.

Ou seja, com uma simples classificacao imprecisa mas relevante de seu estado atual ha o

mesmo entendimento que uma explicacao detalhada da mesma informacao.

Teoria Fuzzy 11

Figura 2.3: Esquema de um Sistema de Inferencia Fuzzy

Um Sistema de Inferencia Fuzzy (SIF) trabalha com um conjunto de entradas e saıdas

regidas por uma base de regras. A base de regras e a representacao do conhecimento do

especialista na forma de fatos que ele utiliza durante sua tomada de decisao. Um fato e

uma afirmacao utilizada pelo especialista da forma: se A entao B. A figura 2.3 ilustra o

esquema basico de um SIF.

2.3.1 Variaveis de Entrada e Saıda e Funcoes de Pertinencia

As entradas e saıdas, denominadas variaveis do sistema, possuem intervalos finitos de

valores os quais podem assumir, denominados universos de discurso. Seja X o universo

de discurso de uma variavel como a qualidade da comida do cardapio de um determinado

restaurante e A o conjunto de comidas de boa qualidade do cardapio do restaurante, para

que uma comida x pertencente ao cardapio X seja considerada de boa qualidade ela deve

possuir uma nota entre 6 e 10, inclusive. Porem, sabemos que uma comida com nota

10 e melhor do que uma comida com nota 6, entao como representar esta informacao?

Zadeh propos o mapeamento, por meio de uma funcao de pertinencia, do valor crisp de

uma variavel para um numero entre 0 e 1, inclusive. Assumindo-se que 0 indica que a

comida nao pertence ao grupo de comidas de boa qualidade e que 1 indica que a comida

pertence totalmente ao grupo, entao qualquer valor entre ]0, 1[ indicara que uma comida

pertence parcialmente ao grupo de comidas de boa qualidade. Os valores mais proximos de

1 representam as comidas de maior qualidade e os valores mais proximos de 0 as comidas

de menor qualidade. Deste modo, nao ha apenas duas classificacoes possıveis como na

logica booleana que seriam pertence ou nao pertence, mas sim toda a gama de valores

compreendidos no intervalo [0, 1] que permitem distinguir entre nao pertence - 0 -, pertence

Teoria Fuzzy 12

parcialmente com determinado grau - ]0, 1[ ou pertence totalmente - 1 -. Dado que os

elementos do conjunto podem assumir qualquer valor real entre [0, 1], entao o conjunto e

dito como sendo um conjunto fuzzy. O ponto da funcao de pertinencia no qual seu valor

se iguala a meio, ou seja, µ(x) = 0, 5, e chamado de crossover point (DUBOIS; PRADE,

1980).

Para exemplificar o conceito, considere a modelagem de um sistema fuzzy para decidir

quantos porcento de gorjeta devem ser dados ao final da refeicao em um restaurante. As

variaveis de entrada do sistema podem ser a comida e o servico, ja a variavel de saıda

pode ser a gorjeta. Considerando que tanto a qualidade da comida quanto a qualidade do

servico recebem notas de 0 a 10 e que a gorjeta varia de 0 ate 25% do valor da refeicao,

podemos ter os seguintes conjuntos fuzzy para cada variavel: ruim ou boa para a comida;

ruim, bom ou excelente para o servico; e baixa, media ou alta para a gorjeta. Para cada

conjunto fuzzy, temos a respectiva funcao de pertinencia dentro do universo de discurso da

variavel. As equacoes 2.1, 2.2 e 2.3 representam as funcoes de pertinencia da variavel de

entrada servico.

∀ x ∈ X, µruim(x) =

1 , se 0 ≤ x < 4

3− x2

, se 4 ≤ x ≤ 6

0 , caso contrario

(2.1)

∀ x ∈ X, µbom(x) =

x2− 2 , se 4 ≤ x < 6

1 , se 6 ≤ x < 7

92− x

2, se 7 ≤ x ≤ 9

0 , caso contrario

(2.2)

∀ x ∈ X, µexcelente(x) =

fracx2− 7/2 , se 7 ≤ x < 9

1 , se 9 ≤ x ≤ 10

0 , caso contrario

(2.3)

Com base nas funcoes de pertinencia para cada conjunto fuzzy, e possıvel elaborar o

grafico da variavel para todo seu universo de discurso. Na figura 2.4 temos o grafico para

Teoria Fuzzy 13

a variavel servico. A linha azul representa o grafico da funcao de pertinencia para servicos

ruins com crossover point em 5, a vermelha para servicos bons com crossover points em 5 e

8 e a verde para servicos considerados excelentes com crossover point em 8. Como pode ser

visto, as funcoes utilizadas para representar os conjuntos fuzzy neste exemplo sao funcoes

trapezoidais, mas poderiam ter sido utilizadas quaisquer outras funcoes como triangulares,

sigmoides, dentre outras.

Figura 2.4: Grafico da variavel servico.

2.3.2 Operacoes com Conjuntos Fuzzy

Consideremos as funcoes max e min como sendo funcoes que retornam o maximo entre

dois valores e o mınimo entre dois valores, respectivamente, temos:

∀ x1 ∈ [0, 1], ∀ x2 ∈ [0, 1], max(x1, x2) =

x1 , se x1 ≥ x2

x2 , se x1 < x2

(2.4)

Teoria Fuzzy 14

∀ x1 ∈ [0, 1], ∀ x2 ∈ [0, 1], min(x1, x2) =

x2 , se x1 ≥ x2

x1 , se x1 < x2

(2.5)

Sao duas as principais operacoes existentes para conjuntos fuzzy: uniao (∪) e intersecao

(∩). Sejam X uma populacao qualquer, A um conjunto fuzzy para esta populacao e B

outro conjunto fuzzy, temos a seguinte definicao para os operadores de uniao, intersecao e

complemento segundo Zadeh (1965 apud DUBOIS, 1980):

∀ x ∈ X, µA∪B(x) = max(µA(x), µB(x)) (2.6)

∀ x ∈ X, µA∩B(x) = min(µA(x), µB(x)) (2.7)

∀ x ∈ [0, 1], µA(x) = 1− µA(x) (2.8)

onde µA∪B, µA∩B e µA representam as funcoes de pertinencia para a uniao de A com B,

para a intersecao de A com B e para o complemento de A, respectivamente.

Denomina-se conjunto fuzzy composto o resultado de alguma operacao sobre dois ou

mais conjuntos fuzzy elementares. Sejam f e g duas funcoes que representam operacoes

distintas, a justificativa para o uso das funcoes max e min foi dada por Bellman e Grietz

(1973 apud DUBOIS, 1980) para representar a operacao de intersecao como E logico e a de

uniao como OU logico por meio da prova matematica de que seriam as duas unicas funcoes

a permitir aos operadores de uniao e intersecao satisfazerem todas as seguintes condicoes:

(i) O grau de pertinencia de x em um conjunto fuzzy composto depende apenas dos

graus de pertinencia de x nos conjuntos fuzzy elementares que o formam;

(ii) f e g sao comutativas, associativas e mutuamente distributivas;

(iii) f e g sao contınuas e nao decrescentes com respeito aos seus argumentos, ou seja, o

grau de pertinencia de x em um conjunto fuzzy composto nao pode diminuir se o grau

de pertinencia de x em A ou B aumenta. De forma analoga, o grau de pertinencia

de x em um conjunto fuzzy composto nao pode aumentar se o grau de pertinencia

de x em A ou B diminui;

(iv) f(µ, µ) e g(µ, µ) sao estritamente crescentes. Se µA(x1) > µA(x2) e µB(x1) > µB(x2),

Teoria Fuzzy 15

entao o grau de pertinencia de x1 em A ∪ B ou A ∩ B e certamente maior do que

aquele de x2;

(v) f(µA(x), µB(x)) ≤ min(µA(x), µB(x)) e g(µA(x), µB(x)) ≥ max(µA(x), µB(x)). Isto

implica que a afirmacao de que x pertence a A∪B requer mais e a afirmacao de que

pertence a A ∩B requer menos do que a afirmacao de que x pertence a A ou de que

x pertence a B sozinhos;

(vi) Pertinencia total tanto em A quanto em B implica em pertinencia total em A ∪ B.

Pertinencia nula tanto em A quanto em B implica em pertinencia nula em A ∩ B.

Ou seja: f(1, 1) = 1; e g(0, 0) = 0.

2.3.3 Base de Regras

A logica fuzzy e composta de declaracoes condicionais compostas por fatos do tipo

se-entao. Em linguagem natural um fato assume a forma da equacao 2.9.

se x e A entao y e B (2.9)

Porem, o uso do e traz ambiguidade, uma vez que para o antecedente do fato - se

- ele representa uma condicao, mas para o consequente do fato - entao - ele representa

uma atribuicao. Portanto, uma melhor forma de representacao seria a da equacao 2.10

(MATHWORKS, 2011).

se x == A entao y = B (2.10)

A avaliacao de uma regra parte do grau de pertinencia do valor crisp da entrada no

conjunto fuzzy e termina com um conjunto fuzzy de saıda. Caso hajam varias entradas sao

realizadas as operacoes E e OU, ou seja, sao aplicadas as funcoes min e max, de modo a

obter um grau de pertinencia resultante. De forma analoga, caso hajam diversos conjuntos

fuzzy de saıda alguma operacao comutativa como max ou soma deve ser aplicada com o

intuito de obter um unico conjunto fuzzy resultante como saıda.

Teoria Fuzzy 16

Para ilustrar o conceito de uma base de regras, temos as equacoes 2.11, 2.12 e 2.13.

se servico == excelente entao gorjeta = alta (2.11)

se servico == bom E comida == boa entao gorjeta = media (2.12)

se servico == ruim OU comida == ruim entao gorjeta = baixa (2.13)

2.3.4 Processo de Inferencia Fuzzy

O processo de inferencia fuzzy como um todo pode ser visto na figura 2.5. Sao tres as

etapas que compoem o processo de inferencia fuzzy: a fuzzificacao dos valores crisp; a infe-

rencia propriamente dita a partir das regras contidas na base de regras; e a defuzzificacao

do resultado em valores crisp.

Figura 2.5: Esquema de um Sistema de Inferencia Fuzzy completo

Na primeira etapa e realizada a fuzzificacao dos valores crisp das variaveis de entrada

em conjuntos nebulosos. O resultado desta etapa e a classificacao de cada entrada em

termos linguısticos com determinado grau de pertinencia, obedecendo a regra de que o

somatorios de todos os graus de pertinencia deve ser igual a 1. Lembrando que o valor

crisp da entrada representa um ponto no grafico da variavel de entrada, grafico este que

possui multiplas funcoes de pertinencia, uma para cada termo linguıstico empregado pelo

especialista na tomada de decisao. Deste modo, a fuzzificacao nada mais e do que o calculo

do valor de cada funcao de pertinencia para o valor de entrada, que deve estar contido no

Teoria Fuzzy 17

universo de discurso da variavel, do contrario, nao havera garantia de que o somatorio dos

graus de pertinencia seja 1.

Na segunda etapa, inferencia na base de regras, sao ativados em paralelo todos os fatos

da base de regras e e feita a agregacao do resultado de cada fato para se obter o conjunto

fuzzy resultante. Isto significa que a decisao e tomada com base na combinacao da saıda

de cada fato existente na base de regras. O processo de agregacao e feito uma vez para

cada variavel de saıda do sistema por meio de uma funcao comutativa, como por exemplo

a funcao max e a funcao soma.

Na terceira etapa ocorre a defuzzificacao do conjunto fuzzy resultante da inferencia em

um valor crisp para cada variavel de saıda. Uma das formas de se calcular um valor crisp

a partir de um conjunto fuzzy e encontrar o centro geometrico da area debaixo da curva

resultante.

Capıtulo 3

O jogo de Truco

O Truco praticado no Brasil, jogado com 40 ou 44 cartas, tem suas origens no antigo Truc

praticado na Espanha. Este, por sua vez, ja e uma adaptacao do Truc frances que era

jogado com apenas 36 cartas. E difıcil estimar a quantidade de pessoas que jogam truco no

Brasil, pois nao ha um estudo que tenha feito tal levantamento previamente, mas sabe-se

que existem diversos portais on-line que possibilitam a jogatina de truco com pessoas de

todo o paıs a qualquer hora do dia.

No Brasil o jogo ganhou diversas modalidades, jogadas com o baralho espanhol ou fran-

ces. Dentre estas, podemos citar o Truco Cego, de Amostra e o Paulista, regulamentados

pelo Movimento Tradicionalista Gaucho (MTG), pela Federacao Tradicionalista do Pla-

nalto Central (FTG-PC), e pela Federacao Paulista de Truco (FPT), respectivamente. A

modalidade que mais se popularizou no ambiente eletronico foi o Truco Paulista por possuir

um conjunto enxuto de regras e ainda assim manter a dinamica de jogo caracterıstica do

Truco.

Pode-se destacar as seguintes caracterısticas na modalidade Paulista de Truco:

• Joga-se com baralho espanhol, excluindo-se as cartas 8, 9, 10 e coringas, totalizando

40 cartas;

• As cartas seguem a seguinte sequencia, da mais fraca para a mais forte: 4, 5, 6, 7,

Q, J, K, A, 2, 3;

• A cada mao, sao distribuıdas tres cartas a cada jogador e e definida o Vira ou Tombo;

19

• A carta apos o Vira seguindo a sequencia e a Manilha, sendo a carta de mais alto

valor da mao;

• Cada mao inicia valendo 1 tento. Qualquer jogador pode pedir Truco e a mao passara

a valer 3 tentos caso a equipe adversaria aceite, caso contrario a equipe que pediu

truco levara 1 tento. E permitido a equipe adversaria pedir Seis quando for sua vez

de jogar, aumentando o valor da mao para 6 tentos caso a outra equipe aceite, caso

contrario a equipe que pediu seis levara 3 tentos. A pontuacao da mao pode atingir

ate 12 tentos, respeitando a regra de que uma equipe nao podera apostar duas vezes

seguidas e a sequencia de pedidos seja seguida: Truco, Seis, Nove, Doze;

• As partidas sao encerradas quando se atinge 12 tentos ou mais;

• Para a sequencia padrao do jogo nao importa o naipe da carta, ja para a Manilha e

obedecida a seguinte ordem, da mais forte para a mais fraca:

– Manilha de paus, denominada Zap;

– Manilha de copas, denominada Copao;

– Manilha de espadas, denominada Escopeta;

– Manilha de ouros, denominada Pica-fumo.

A figura 3.1 representa o fluxo de uma partida de truco na forma de um diagrama de

atividades.

20

Figura 3.1: Diagrama de atividades simplificado de Truco Paulista

Estratégia básica 21

Conforme ilustrado na figura 3.1, apos o embaralhar das cartas, e feita a distribuicao

de 3 cartas a cada jogador e e mostrado o Vira. O Vira e a carta que determina a manilha

da mao, sendo esta a carta posterior ao Vira ou, caso este seja um tres, o quatro. Entao,

cada jogador, seguindo o sentido horario, deve jogar uma carta e a equipe que jogou a carta

mais alta ganha a rodada. Ao final de tres rodadas ou caso uma das equipes atinja uma

das condicoes de vitoria, e somada a quantidade de tentos da equipe o valor de tentos da

mao. Cada mao inicia valendo 1 tento, mas o jogador da vez pode apostar pedindo truco,

seis, nove ou ate mesmo doze, alterando o valor da mao para 3, 6, 9 ou 12, respectivamente.

Apos uma aposta, a equipe adversaria tem a opcao de cair ou correr. Caso corra, perde

automaticamente a mao e a outra equipe soma ao seu placar a quantidade de tentos que

a mao valia antes da aposta. Caso caia, o valor da mao e entao alterado para o valor da

aposta e o fluxo de jogo segue normalmente, retornando para a jogada de quem apostou.

A equipe que atingir 12 tentos ou mais primeiro vence a partida.

Em conjunto com o especialista em truco que participou da elaboracao deste trabalho,

dividiu-se a estrategia de jogo em tres partes. A primeira que modela o conhecimento de

um jogador iniciante e esta subdividida em tres partes: acao, reacao e decisao da mao de

11. A segunda que representa o jogo de um jogador intermediario e trata do blefe. Por fim,

a que modela a tatica de jogadores avancados que fazem uso da inducao.

3.1 Estrategia basica

No jogo de truco existem tres momentos em que o jogador precisa tomar uma decisao:

quando e a vez do jogador e ele precisa decidir se aposta ou simplesmente joga uma das

cartas disponıveis; quando o oponente apostou e o jogador escolhe se manda cair ou corre;

ou quando o jogador possui 11 tentos, neste caso ele deve escolher se continua com as cartas

da mao recebida - mao inicia trucada - ou se as rejeita e perde a mao - oponente ganha

apenas 1 tento.

O primeiro caso denomina as possıveis acoes que um jogador pode executar quando for

sua vez de jogar. Por meio de entrevistas com o especialista, elaborou-se o fluxograma da

figura 3.2 para modelar o processo de tomada de decisao da acao. As regras consideradas

para a montagem deste fluxograma nao englobam as tecnicas intermediarias nem avancadas

Estratégia básica 22

do truco, tais como blefe e inducao, tornando este o fluxograma de acao seguido por um

jogador de nıvel basico.

Figura 3.2: Fluxograma de acao

O segundo caso trata a reacao que o jogador devera ter para a situacao em que o

oponente pediu truco, seis, nove ou doze. Novamente nao foram incluıdas regras de blefe

nem de inducao. Desta forma, o processo de tomada de decisao ilustrado no fluxograma

da figura 3.3 e o de um jogador de nıvel basico.

Estratégia intermediária 23

Figura 3.3: Fluxograma de reacao

O ultimo caso e o mais simples dentre os demais processos, pois define o processo de

tomada de decisao para a mao de 11, denominado apenas como fluxograma de decisao. Este

fluxograma esta representado na figura 3.4 e lida com apenas tres parametros: a vantagem

em pontos do jogador em relacao ao seu oponente; e as duas cartas mais altas da mao do

jogador.

3.2 Estrategia intermediaria

Por ultimo temos o fluxograma da figura 3.5 que define em que condicoes o jogador

ira blefar. Para tanto, precisou-se definir um ındice que serve como modelo do oponente

e e a parte crıtica deste fluxograma, uma vez que, se o ındice estiver longe da realidade,

Estratégia avançada 24

Figura 3.4: Fluxograma de decisao

a tomada de decisao sera feita com base em dados erroneos. Portanto, o ındice que mede

a agressividade do oponente sofrera um ajuste fino apos a etapa de testes para que possa

representar com mais fidelidade o real valor, ou pelo menos um valor aproximado, dado

que o oponente dificilmente seguira uma mesma estrategia ao longo de todo o jogo. Ele

pode comecar agressivo e se tornar passivo com o desenrolar do jogo, ou vice-versa; ou

ainda manter um comportamento balanceado, onde nem arrisca nem corre demais.

3.3 Estrategia avancada

A tecnica de inducao consiste em fazer o oponente pensar que tem cartas melhores que

as suas para que ele aposte. Desta forma, o jogador aposta sobre a aposta do adversario

e obtem resultados ainda maiores. A grande dificuldade em induzir o oponente a tomar

determinada decisao e que o jogador nao tera a certeza de que vai dar certo. A inducao

pode nao dar certo e o oponente nao apostar, deste modo o jogador nem apostou nem

reapostou e terminou com um resultado menor do que o que poderia ter conseguido se

Estratégia avançada 25

Figura 3.5: Fluxograma de blefe

tivesse ao menos apostado. Ou pior ainda, o oponente pode ter cartas melhores que as

do jogador no fim da mao e o jogador perder muito mais tentos do que se nao tivesse

reapostado. Portanto, e uma tecnica arriscada e dificilmente sera empregada por jogadores

inexperientes, logo, nao faz parte do escopo deste trabalho.

Capıtulo 4

Jogador de Truco Inteligente

Um agente inteligente jogador de truco representa apenas um jogador. Para que seja

testado, e necessario que ele se comunique com um servidor de truco. Alem disso, para a

etapa de testes faz-se necessario que um jogador humano possa interagir com o servidor de

truco e realizar partidas contra a maquina, que no caso e o proprio agente inteligente.

Implementar um servidor de truco do zero implicaria em ter que lidar com as dificulda-

des encontradas em ambientes multi-threads, tais como: evitar situacoes de concorrencia;

e possuir robustez para suportar multiplos usuarios interagindo com o servidor simulta-

neamente. Portanto, optou-se por utilizar uma implementacao de codigo aberto de um

servidor de truco denominado MiniTruco.

O esquema geral do trabalho pode ser visto na figura 4.1. O servidor de mini truco e o

responsavel por gerir as conexoes entre os diversos jogadores e permitir que estes entrem

nas salas e iniciem partidas entre si ou contra a maquina. O cliente fornece uma interface

amigavel para que o usuario possa interagir com o servidor enviando e recebendo comandos.

Ja o agente inteligente e o componente responsavel pela tomada de decisoes automaticas e

que prove um modo de jogo onde um jogador pode enfrentar uma maquina.

MiniTruco 27

Figura 4.1: Diagrama de componentes do sistema

4.1 MiniTruco

O mini truco e um servidor e cliente de truco implementado em J2ME (Java 2 Micro

Edition) e ja conta com uma versao para Android tambem. O interessante e que seu codigo

fonte e publicado sob a licenca GPL v3.0, ou seja, quem quiser pode realizar correcoes ou

modificacoes no codigo fonte do projeto desde que estas tambem sejam publicadas sob a

mesma licenca.

A porcao do codigo reaproveitada ao longo deste trabalho refere-se unica e exclusiva-

mente ao que diz respeito a implementacao do servidor. Dada a compatibilidade do J2ME

com o Java 1.2, apenas foi necessario realizar modificacoes no codigo fonte original para

que trabalhasse com recursos do Java 1.6, abandonasse certos aspectos da versao antiga e

se tornasse independente das bibliotecas para J2ME. Uma das modificacoes realizadas diz

respeito a utilizacao do estereotipo enum para denominar um objeto como um enumera-

dor, sendo esta uma boa pratica de programacao por restringir o tipo e valores permitidos

a variaveis chamada de tipagem forte.

Uma versao simplificada do diagrama de classes que representa o servidor do mini truco

MiniTruco 28

pode ser visto na figura 4.2. O servidor MiniTrucoServer recebe conexoes de clientes

atraves de um socket e cria uma nova thread que passara a se comunicar com o cliente

a partir de entao. A classe que representa o jogador, JogadorConectado, possui um

socket para a comunicacao com o servidor que e feita atraves de uma interface denominada

Comando. Esta interface encapsula os dados da jogada ou de eventos que ocorreram e

pode representar qualquer um dos comandos suportados pelo protocolo do miniTruco. Os

principais comandos suportados pelo servidor estao listados na tabela 4.1.

Figura 4.2: Diagrama de classes do miniTruco

Para representar os dados do jogo existem as classes Sala, Mesa, Baralho e Jogador,

bem como uma classe de controle denominada MiniTruco conforme ilustrado na figura

4.3. O jogador representa tanto um jogador humano quanto uma maquina. O primeiro e

encapsulado em JogadorHumano e so e utilizado quando o cliente do proprio miniTruco

estiver em execucao. Neste trabalho esta classe nao sera utilizada uma vez que sera de-

senvolvido um cliente proprio descrito na secao 4.3. O segundo tipo de jogador e tratado

atraves da especializacao JogadorCPU e possui uma composicao com Estrategia. A

Estrategia e notificada toda vez que ocorre algum evento no jogo. A classe MiniTruco

encapsula as regras do jogo e centraliza o processamento dos eventos. As demais classes

apenas representam os dados do modelo.

MiniTruco 29

Comando Acao

Gerais

N <nome> Altera o nome para <nome>L Lista as salasE <sala> Entra na sala de numero <sala>Q Sinaliza que esta pronto para jogar

Partida

J <1, 2 ou 3> Joga a carta na posicao selecionadaT Aumenta a aposta com truco, seis, nove ou dozeD Aceita um pedido de apostaC Corre de um pedido de apostaH <T ou F> Decide se continua com ou rejeita a mao de 11

Eventos

P <posicao> Informa sua posicao no inıcio da partidaM <mao> <vira> Informa sua mao e o vira no inıcio da maoV <posicao> Informa de quem e a vez de jogarJ <posicao> <carta> Informa que o jogador da posicao jogou a cartaT <posicao> <valor> Informa um pedido de aumento de aposta e seu valorD <posicao> <valor> Informa que o jogador aceitou o aumento para valorC <posicao> Informa que o jogador correu de um pedido de trucoH <posicao> <T> Informa que o jogador continuou ou rejeitou a mao de 11R <equipe> Informa a equipe que venceu a rodadaO <pts1> <pts2> Informa a pontuacao apos o fim da mao

Tabela 4.1: Alguns comandos suportados pelo servidor miniTruco

Figura 4.3: Diagrama de classes do miniTruco

MiniTruco 30

Apos o despacho do cliente para uma thread especıfica, a sequencia de mensagens tro-

cadas entre cliente e servidor pode ser acompanhada pelos diagramas de sequencia das

figuras 4.4 e 4.5.

No diagrama da figura 4.4, o cliente inicia solicitando uma conexao com o servidor,

validada ao receber uma mensagem de boas vindas. Em seguida o cliente fornece um nome

de usuario pelo comando <N nome> e, caso este esteja disponıvel, recebe como resposta o

mesmo nome. Os passos seguintes sao listar e entrar em uma das salas disponıveis atraves

dos comandos <L> e <E sala>, respectivamente. Para dar inıcio a partida e necessario

que todos os jogadores informem o servidor que quer jogar pelo comando <Q>.

Figura 4.4: Diagrama de sequencia Cliente-Servidor do miniTruco - Parte 1

Ao receber o comando <Q> de todos os jogadores humanos da sala o servidor da inıcio

MiniTruco 31

a partida. A partir deste ponto o diagrama da figura 4.5 representa o fluxo de jogo para

uma partida. O servidor despacha uma mensagem <P posicao> para informar a cada

jogador o numero de sua posicao na mesa. Entao e iniciada a mao com a notificacao <M

mao vira> e indica o turno do primeiro jogador com o comando <V posicao>. Por fim

o jogador informa que carta jogar pelo comando <J carta> e o servidor se encarrega de

notificar os demais clientes e passar o turno para o proximo jogador.

Figura 4.5: Diagrama de sequencia Cliente-Servidor do miniTruco - Parte 2

A partir deste momento o fluxo de jogo e repetido para cada turno conforme ilustrado no

diagrama da figura 3.1 ate que a partida termine, fato que ocorre quando uma das equipes

atinge 12 tentos. O jogador da vez envia sua acao e, dependendo da acao escolhida, o

servidor espera uma reacao da equipe adversaria. Entao o turno e passado para o proximo

Agente Inteligente 32

jogador e o resultado da rodada e computado pelo servidor e uma mensagem e retornada

a todos os jogadores conectados na mesma sala.

Inicialmente, a implementacao estava pronta apenas para partidas entre 4 jogadores

(disputa entre duplas), mas a necessidade de permitir partidas entre apenas dois jogadores

(disputa mano a mano) causou uma mudanca importante no servidor que teve grande

impacto em seu funcionamento. Um destes impactos foi que o cliente existente nao estava

pronto para trabalhar com partidas entre dois jogadores, tornando-o limitado a partidas

entre quatro jogadores quando o cliente mobile fosse utilizado.

4.2 Agente Inteligente

Apenas com o servidor e com o cliente ja e possıvel executar partidas entre jogadores

humanos, mas o foco deste trabalho e gerar um agente inteligente capaz de fornecer um

desafio semelhante ao de um jogador humano a outro jogador.

Diversas questoes devem ser consideradas para realizar a implementacao de tal agente,

sendo a mais importante delas a estrategia de IA a ser empregada no processo de tomada de

decisao. Uma vez que a meta deste trabalho e desenvolver um agente que aparente ser um

jogador casual de truco e, como fora dito no capıtulo 1, sistemas especialistas mostraram-se

como uma alternativa para atingir este objetivo de maneira simples e com bons resultados,

optou-se por utilizar logica fuzzy na construcao do agente.

4.2.1 Modelagem Fuzzy

Neste cenario, podemos identificar 4 controladores, um para cada fluxograma. A forma

de extrair quais as variaveis necessarias e as regras baseia-se na pura inspecao do fluxo-

grama.

E possıvel distinguir dois grandes conjuntos distintos de regras com base no fluxograma

da figura 3.2, que representa a tomada de decisao para executar uma acao em seu turno.

Um conjunto para quando o jogador e o primeiro a jogar e outro conjunto quando e o

segundo a jogar, portanto, a posicao do jogador deve ser uma das variaveis de entrada

do controlador. No primeiro caso, e considerado o resultado parcial do jogo e a carta

Agente Inteligente 33

Figura 4.6: Controlador Fuzzy de Acao

mais alta que o jogador possui. No segundo, alem da carta mais alta que o jogador possui

e o resultado parcial do jogo, tambem e necessario conhecer qual a forca da carta do

adversario. Em ambos os casos, as possıveis acoes sao trucar, jogar a menor carta, uma

carta igual ou a maior carta. As possıveis acoes foram representadas por duas variaveis de

saıda, acao e objetivo, sendo a primeira para indicar se deve trucar ou nao e a segunda

se deve jogar a menor carta, uma carta igual ou a maior. A figura 4.6 representa a visao

geral do controlador de acao.

O fluxograma de reacao da figura 3.3 captura o que fazer quando o adversario pediu

truco, seis, nove ou doze. Ha dois caminhos distintos quanto a posicao do jogador. Caso

seja o primeiro a jogar, as condicoes que ditam a escolha da reacao sao o resultado parcial

da partida e a presenca ou nao de manilha na mao do jogador. Caso seja o segundo jogador,

devem ser considerados tambem o resultado parcial, a carta mais alta, a carta media e

a carta mais baixa do jogador. Alem destas, identificou-se a necessidade de considerar

nas regras a pontuacao ou valor atual da mao. As duas reacoes possıveis no fluxograma

sao correr ou aceitar o pedido de truco, sendo representadas em uma unica variavel de saıda

denominada reacao. A figura 4.7 ilustra as variaveis de entrada e saıda do controlador de

reacao.

O fluxograma mais simples e o de tomada de decisao para a mao de 11, mostrado

na figura 3.4, onde as possibilidades sao de continuar com ou rejeitar a mao recebida.

Sao consideradas a vantagem em pontos e as duas maiores cartas da mao do jogador no

processo de tomada de decisao. As duas maiores cartas do jogador sao representadas pela

carta mais alta e pela carta media. As acoes de saıda estao representadas na variavel

Agente Inteligente 34

Figura 4.7: Controlador Fuzzy de Reacao

Figura 4.8: Controlador Fuzzy da Decisao da Mao de 11

decisao, conforme indicado na figura 4.8.

Por fim, resta o fluxograma do blefe. Este e o mais complexo de todos, por levar em

consideracao todos os parametros disponıveis do jogo, alem de um ındice calculado com

base nas acoes e reacoes feitas pelo jogador adversario. Foram vistos e analisados nos

controladores anteriores as cartas do jogador, a carta jogada pelo oponente, o resultado

parcial e a posicao do jogador. Resta apenas analisar o ındice que caracteriza o tipo

de adversario entre passivo, moderado ou agressivo. O ındice e zerado a cada final de

partida para simplificacao do calculo e seu universo de discurso vai de -12 a 12. Para

o incremento ou decremento baseado nas acoes e reacoes do oponente, sao seguidas as

seguintes premissas:

• Trucar incrementa o ındice em 1 (ındice + 1);

Agente Inteligente 35

• Jogar sem trucar decrementa o ındice em 0,2 (ındice - 0,2);

• Retrucar (pedir seis, nove ou doze) incrementa o ındice em 2 (ındice + 2);

• Cair no truco incrementa o ındice em 0,5 (ındice + 0,5);

• Cair no retruco (pedido de seis, nove ou doze) incrementa o ındice em 1 (ındice + 1);

• Correr do truco decrementa o ındice em 0,5 (ındice - 0,5);

• Correr do retruco (pedido de seis, nove ou doze) decrementa o ındice em 1 (ındice -

1).

Duas dessas premissas nao podem ser aplicadas juntas, portanto, sera considerada a ultima

premissa a ser ativada em caso de duas ou mais serem satisfeitas. Por exemplo, suponha

que em uma partida o oponente tenha jogado uma carta qualquer e em seguida corrido

do pedido de truco do jogador. Neste caso tanto a premissa de jogar sem trucar (ındice

- 0,2) quanto a de correr do truco (ındice - 0,5) sao satisfeitas, mas apenas a ultima sera

aplicada, entao o ındice sera decrementado em 0,5.

Alem disso, os valores de incremento e decremento do ındice foram estipulados de modo

a dar maior peso as acoes agressivas do jogador adversario, uma vez que no jogo de truco

a frequencia com que o jogador normalmente truca e bem inferior a frequencia com a qual

ele joga cartas sem trucar, mesmo que este esteja adotando uma postura agressiva de jogo.

Para exemplificar, considere a variavel de entrada do controlador de decisao para a

mao de 11 denominada vantagem em pontos. A pontuacao de cada equipe pode assumir

valores entre 0 e 12, inclusive, porem, durante a tomada de decisao, ou seja, antes da

partida terminar, os valores possıveis estao compreendidos no intervalo [0, 11]. Portanto,

a vantagem de uma equipe em relacao a outra possui o mesmo universo de discurso que a

propria pontuacao, [0, 11], uma vez que a menor diferenca de pontos ocorre quando ambas

as equipes possuem a mesma pontuacao, ou seja, a vantagem e zero; e a maior diferenca de

pontos ocorre quando uma equipe possui 11 e a outra 0 pontos, totalizando uma vantagem

de onze. Conforme passado pelo especialista, existem tres classificacoes ou conjuntos fuzzy

para a vantagem, sao elas: pequena; media; e grande. Para cada termo linguıstico temos

Agente Inteligente 36

Figura 4.9: Controlador Fuzzy de Blefe

o respectivo conjunto fuzzy representado pela funcao de pertinencia dentro do universo de

discurso da variavel:

∀ x ∈ X, µpequena(x) =

1 , se 0 ≤ x < 3

−x+ 4 , se 3 ≤ x ≤ 4

0 , caso contrario

(4.1)

∀ x ∈ X, µmedia(x) =

x− 3 , se 3 ≤ x < 4

1 , se 4 ≤ x < 6

−x+ 7 , se 6 ≤ x ≤ 7

0 , caso contrario

(4.2)

∀ x ∈ X, µgrande(x) =

x− 7 , se 7 ≤ x < 8

1 , se 8 ≤ x ≤ 11

0 , caso contrario

(4.3)

onde µpequena, µmedia e µgrande representam as funcoes de pertinencia para vantagem pe-

quena, media e grande, respectivamente.

Agente Inteligente 37

De acordo com as funcoes de pertinencia para cada conjunto fuzzy supracitadas, e

possıvel elaborar o grafico da variavel vantagem para todo o universo de discurso, conforme

ilustrado na figura 4.10. A linha azul representa o grafico da funcao de pertinencia para

vantagens pequenas com crossover point em 2, 5, a vermelha para vantagens medias com

crossover points em 2, 5 e 5, 5 e a verde para vantagens consideradas grandes com crossover

point em 5, 5. Como pode ser visto, as funcoes utilizadas para representar os conjuntos

fuzzy neste exemplo sao funcoes trapezoidais, mas poderiam ter sido utilizadas quaisquer

outras funcoes como triangulares, sigmoides, dentre outras.

Figura 4.10: Grafico da variavel vantagem.

A base de regras do controlador de decisao para a mao de 11 possui um total de 9

regras. Destas, apenas tres possuem condicoes de desistencia, sao elas:

se carta-media == baixa entao decisao = desistir (4.4)

se carta-media == media entao decisao = desistir (4.5)

se vantagem == pequena e carta-alta ! = manilha entao decisao = desistir (4.6)

A modelagem Fuzzy completa das demais variaveis, bem como das demais bases de

regras estao disponıveis no apendice A.

Agente Inteligente 38

4.2.2 Modulo de comunicacao com o Matlab

De posse da modelagem Fuzzy desenvolvida na subsecao anterior ainda nao e possıvel

utilizar os controladores Fuzzy dentro de um programa Java. Para esta finalidade ha duas

opcoes: utilizar a biblioteca de codigo aberto JFuzzyLogic; ou exportar o codigo do Matlab

necessario para realizar as computacoes Fuzzy para Java.

A primeira opcao e aparentemente a mais simples, uma vez que a API ja foi projetada

para Java e apresenta metodos bem intuitivos para manipular a modelagem fuzzy e avaliar

as entradas. O problema desta abordagem e que a biblioteca so da suporte a linguagem

padronizada IEC 61131-7, sendo incompatıvel com a linguagem utilizada pela Matlab Fuzzy

Toolbox.

Ja a segunda opcao apesar de mais complexa, possibilita que o mesmo arquivo .fis

gerado atraves da Matlab Fuzzy Toolbox seja utilizado para instanciar e utilizar os con-

troladores fuzzy. Alem disso, a Fuzzy Toolbox do Matlab possui atualizacoes contınuas e

permite a utilizacao de funcoes mais complexas e recursos superiores nao disponıveis na

linguagem padronizada.

A abordagem escolhida para o desenvolvimento deste trabalho foi a segunda, uma vez

que a ferramenta Matlab ja estava sendo utilizada para a modelagem e o aprendizado da

biblioteca, bem como o processo de traducao do .fis para a linguagem padronizada IEC

61131-7, poderia gerar atrasos e problemas que impedissem a continuacao do trabalho.

Uma visao geral do que e necessario para a criacao da API de Comunicacao com o Matlab

pode ser vista na figura 4.11.

Conforme ilustrado, a partir das variaveis de entrada/saıda e de funcoes do Matlab que

permitam criar e utilizar um FIS; e fazendo uso da ferramenta Matlab Builder JA para o

processo de exportacao e da IDE Eclipse para a codificacao de extensoes a API, temos a

criacao da API de Comunicacao com o Matlab que servira como nucleo de processamento

durante a tomada de decisao do Agente Inteligente, conforme sera visto mais adiante.

O Matlab Builder JA e uma ferramenta do Matlab que realiza a transformacao de

programas na linguagem do Matlab para classes Java. A ferramenta realiza a encriptacao

das funcoes do Matlab e as encapsula em uma classe Java que chama estas funcoes e se

comporta como qualquer classe Java. Para permitir a execucao destas funcoes e necessario

que a maquina onde o programa Java esteja sendo executado possua o Matlab Compiler

Agente Inteligente 39

Figura 4.11: Diagrama IDF0 de Criacao da API de Comunicacao com o Matlab

instalado. Assim como um programa Java e desenvolvido em uma maquina que possua

o JDK e pode rodar em qualquer maquina que possua apenas a JRE instalada apos o

processo de compilacao, um programa desenvolvido em uma maquina com o Matlab pode

ser rodado em qualquer maquina com o Matlab Compiler instalado apos o processo de

exportacao, que neste caso e realizado pelo Matlab Builder JA.

Durante o processo de exportacao do codigo Matlab para Java, o Builder gera um grafo

de dependencia das funcoes sendo exportadas para identificar que porcoes do codigo do

Matlab precisam ser exportadas junto, ou seja, se o codigo sendo exportado faz referencia

apenas ao Toolbox Fuzzy, entao o que se refere as demais Toolboxes nao sera exportado.

Portanto, foi necessario criar funcoes que utilizassem os recursos necessarios para a criacao e

avaliacao de sistemas Fuzzy, de modo que o Builder as exportasse e pudessem ser utilizadas

a partir do codigo Java. Estao descritas nas listagens 4.2.1 e 4.2.2 as funcoes exportadas

para Java necessarias para criacao e utilizacao de um FIS. A partir da criacao de um FIS e

possıvel utiliza-lo para para computar os valores das variaveis de saıda a partir dos valores

das variaveis de entrada.

A funcao createFis recebe como parametro o caminho para o arquivo .fis contendo a

modelagem Fuzzy do controlador. Esta por sua vez delega a criacao do FIS para a funcao

readfis que faz parte das funcoes do Matlab e retorna um objeto que representa um FIS.

A funcao evalFis recebe como parametro um vetor contendo os valores das variaveis

de entrada e um objeto contendo a representacao do FIS a ser utilizado. Esta por sua vez

Agente Inteligente 40

1 %%This function receives the path to the .fis file2 %% returns a fis object3 function [fis] = createFis(fisPath)4 if nargin < 15 disp(’Need one argument!’);6 return7 end8

9 fis = readfis(fisPath);10 end

Codigo 4.2.1: Funcao de Criacao de FIS no Matlab

1 %%This function receives an array with the input values and a fis object2 %% returns the array with the output values after the evaluation of the input in the fis3 function [output] = evalFis(input, fis)4 if nargin < 25 disp(’Need two arguments!’);6 return7 end8

9 output = evalfis(input, fis);10 end

Codigo 4.2.2: Funcao de Avaliacao de FIS no Matlab

delega o processamento para a funcao evalfis do Matlab que apos computar retorna um

vetor contendo os valores das variaveis de saıda.

Apos a realizacao da configuracao no Matlab Builder JA para a criacao de uma classe

denominada MatlabFISInterface contendo as duas funcoes do Matlab como metodos, obte-

mos um .jar contendo dentre outras classes a MatlabFISInterface que pode ser representada,

para fins didaticos apenas, pela interface da listagem 4.2.3.

1 public interface MatlabFISInterface {2

3 public Object[] createFis(Integer paramNumber, String fisPath);4

5 public Object[] evalFis(Integer paramNumber, Object[] inputs);6

7 }

Codigo 4.2.3: Representacao da classe gerada pelo Matlab Builder JA

O codigo gerado e complexo de ser utilizado por nao possuir documentacao de seus

metodos e trabalhar com Objects genericos na assinatura de seus metodos, ou seja, um

programador utilizando esta API ficaria perdido sem saber o que deveria ser passado para

o metodo e o que o metodo retornaria, uma vez que o compilador aceitaria a passagem

de qualquer vetor de objetos, podendo conter String, Integer, Double, ou qualquer outra

Agente Inteligente 41

classe Java.

Portanto, criou-se um conjunto de classes com o intuito de facilitar o uso dessa API ge-

rada automaticamente. O diagrama das classes da API criada para realizar a Comunicacao

com o Matlab de forma simples pode ser visto nas figuras 4.12, 4.13 e 4.14.

Figura 4.12: Diagrama de classes da API de Comunicacao com o Matlab (I)

A classe abstrata MatlabFISDecorator auxilia na utilizacao da API gerada pelo

Matlab fornecendo um construtor que aceita como parametro o caminho para o arquivo da

modelagem fuzzy .fis e um metodo para avaliacao de entradas que trabalha com vetores do

tipo double. Alem disso, este decorator se encarrega do tratamento de excecoes geradas

pela API do Matlab, removendo a dependencia das classes do Matlab no codigo que fizer

uso deste decorator.

As interfaces FISInput e FISOutput fornecem os metodos toArray() e fromArray(),

respectivamente. O primeiro transforma os dados de entrada em um vetor de double,

pronto para ser passado ao respectivo controlador fuzzy. O segundo faz o processo inverso,

transforma o vetor de double retornado pelo controlador fuzzy em um objeto contendo os

dados de saıda. Ambas permitem o acesso aos dados atraves dos metodos acessores tipo

get.

Estas tres classes e suas subclasses encapsulam o codigo gerado automaticamente pelo

Matlab, abstraindo a complexidade e facilitando a leitura e o uso dos recursos de logica

fuzzy. O codigo alvo se torna mais legıvel com acaoOutput.getCartaMaisAlta() do que com

Agente Inteligente 42

trechos da forma Double.parseDouble(outputs[0].toString().split(”+”)[1]).

Figura 4.13: Diagrama de classes da API de Comunicacao com o Matlab (II)

Figura 4.14: Diagrama de classes da API de Comunicacao com o Matlab (III)

Cliente 43

4.3 Cliente

De modo a permitir que jogadores humanos realizem partidas atraves de um browser um

cliente web foi implementado utilizando as tecnologias Java Applet para a comunicacao com

o servidor e componentes Java Swing para o desenvolvimento da camada de visualizacao.

O uso da biblioteca Swing implica em um desenvolvimento orientado a componentes que

propicia o reuso de um mesmo componente em diversas telas do sistema, bem como a uti-

lizacao dos padroes de desenvolvimento sugeridos pela propria documentacao da biblioteca

na criacao dos componentes.

Para explicar a construcao dos componentes visuais do cliente foi criado o diagrama de

classes dos paineis do cliente applet, conforme ilustrado na figura 4.15. Pode-se identificar

que o componente basico do applet e o CardPanel, responsavel por renderizar uma unica

carta na tela. A partir deste componente foram gerados o HandPanel e o TablePanel,

com o primeiro representando um conjunto de ate tres cartas e o segundo o baralho restante,

a manilha e as cartas jogadas na mesa. Um PlayerPanel e composto por uma mao e um

nome de jogador. Alem destes ha o ScorePanel, responsavel por representar ou o placar

de tentos da partida ou a pontuacao parcial da mao, o HistoryPanel que mostra as

ultimas notificacoes enviadas pelo servidor ou mensagens enviadas por outros jogadores,

o ChatPanel que fornece uma caixa de texto para o jogador poder enviar mensagens

aos demais jogadores e o ActionPanel que fornece as acoes que o jogador pode escolher

executar durante seu turno. Varios jogadores, um placar da partida, um placar da mao, a

mesa de jogo, o historico de eventos e mensagens, o bate-papo e a barra de acoes compoem

o painel do jogo como um todo, indicado no diagrama pelo GamePanel.

A figura 4.16 ilustra a tela exibida no inıcio de uma partida contra a maquina denomi-

nada FuzzyBot. Nela e possıvel identificar todos os componentes descritos anteriormente.

O diagrama de classes criado para o cliente applet pode ser visualizado na figura 4.17.

Conforme ilustrado ha a classe principal MiniTrucoAppletClient responsavel por or-

questrar o fluxo de dados com o servidor e manipular a tela que e uma instancia de Ga-

mePanel para renderizacao dos eventos e feedback das interacoes do usuario. A classe

MiniTrucoReceiver encapsula o recebimento de eventos provenientes do servidor pelo

socket e o tratamento destes antes de empregar as devidas alteracoes na tela. Para o envio

Cliente 44

Figura 4.15: Diagrama de classes dos componentes do applet miniTruco

Figura 4.16: Tela de inıcio de partida do applet miniTruco

de comandos ao servidor existe a classe MiniTrucoSender que fica responsavel por en-

capsular os dados necessarios para gerar o comando representativo da acao escolhida pelo

Experimentos 45

Figura 4.17: Diagrama de classes do applet miniTruco

usuario e envia-lo para o servidor atraves do socket.

4.4 Experimentos

A realizacao dos experimentos para avaliacao do nıvel do agente inteligente desenvolvido

seguiu o seguinte procedimento:

• O voluntario informa seu nıvel de jogo, devendo escolher entre iniciante, interme-

diario ou avancado;

• O voluntario escolhe um nome e uma sala para jogar contra a maquina;

• E iniciada a partida contra a maquina pelo applet.

Idealmente, cada voluntario deveria realizar dez partidas contra a maquina, para ser

possıvel analisar se o comportamento do agente inteligente ficou muito previsıvel ou nao. A

execucao de diversas partidas tambem ajuda a reduzir o fator de erro devido a aleatoriedade

Experimentos 46

Figura 4.18: Resultados em porcentagem de vitorias e derrotas do agente inteligente contrajogadores humanos

intrınseca do jogo, pois, se um determinado jogador ganhou 10 partidas de 10 realizadas,

a chance de ter vencido todas por sorte e praticamente zero. Porem, apos a realizacao de

uma a tres partidas os voluntarios perdiam a vontade de continuar jogando e o experimento

precisava ser abortado.

Ao todo foram realizados 58 experimentos, sendo 11 destes contra jogadores iniciantes,

35 destes contra jogadores intermediarios e 12 destes contra jogadores avancados. O grafico

4.18 ilustra os resultados preliminares do trabalho atraves da porcentagem de vitorias e

derrotas do agente contra cada um dos tres nıveis de jogadores humanos. O agente ganhou

100% das partidas contra iniciantes, 40% contra intermediarios e 41,7% contra avancados.

Capıtulo 5

Conclusoes

A proposta do trabalho deste trabalho era de desenvolver um jogador de truco inteligente.

Os seguintes produtos foram criados de modo a atingir cada um dos objetivos especıficos do

trabalho: a modelagem no Matlab do SIF; a programacao em Java do agente inteligente;

e a programacao em Java de um Applet que permitisse a execucao de partidas entre o

jogador humano e o agente inteligente desenvolvido. Alem da realizacao de experimentos

de modo a classificar o nıvel de jogo do agente implementado.

Para a criacao da modelagem do SIF foi necessaria a participacao de um especialista

em Truco que serviu de fonte de conhecimento para o agente desenvolvido. Esta foi a etapa

mais crıtica de todo o trabalho, uma vez que se a base de regras nao fosse elaborada de

forma correta o comportamento final do agente seria indesejavel.

A programacao do agente foi realizada em Java, integrando-se a modelagem do SIF

elaborada no Matlab por meio da exportacao das funcoes necessarias pela ferramenta Ma-

tlab Builder JA. Esta ferramenta gera automaticamente uma classe Java e um conjunto

de classes utilitarias que permitem o uso de funcoes do Matlab no Java. Para tanto, foi

necessario integrar o servidor de miniTruco com a implementacao do agente inteligente e,

por sua vez, o agente com as classes do Matlab para concluir o processo de tomada de

decisao.

A implementacao do cliente web tambem foi realizada em Java, mais especificamente

com o uso da biblioteca de componentes Swing. Ao final foi gerado um applet que pudesse

ser rodado em qualquer navegador compatıvel com a versao 1.5 do Java.

Por fim, a realizacao de experimentos demonstrou que o nıvel de jogo do agente desen-

volvido e superior ao de um jogador iniciante, atendendo ao objetivo deste trabalho que

era o de produzir um jogador de truco inteligente que tivesse um nıvel intermediario de

48

jogo.

Dentre as principais licoes aprendidas com o desenvolvimento deste trabalho, pode-se

destacar:

• Dificuldade na generalizacao da solucao Fuzzy - uma solucao fuzzy para um problema

reflete o conhecimento do especialista sobre o dado problema, porem, o especialista e

capaz de generalizar a solucao e aplica-la a problemas semelhantes atraves do apren-

dizado ja a solucao fuzzy precisaria ser refeita para cada novo problema;

• Dificuldade em escalar a solucao Fuzzy para instancias maiores do problema - a so-

lucao fuzzy para problemas pequenos e relativamente simples de ser elaborada, mas

quando ha um aumento significativo na complexidade do problema ha um aumento

nao linear muito maior na complexidade da modelagem do controlador e na constru-

cao da base de regras para esse controlador, sendo a principal causa deste problema

a representacao de ate tres dimensoes, tornando difıcil a analise de modelos que

contenham mais do que tres variaveis;

• A integracao entre Java e Matlab facilita a construcao de aplicacoes que utilizem

Fuzzy - por meio da exportacao das funcoes do Matlab necessarias a um SIF para

classes Java temos todo o poder computacional do Matlab disponıvel juntamente com

todo o arsenal de bibliotecas fornecidas para Java, facilitando o desenvolvimento das

aplicacoes.

Apesar de todo o esforco desprendido no desenvolvimento deste trabalho, alguns itens

foram descartados da implementacao para que o prazo nao fosse comprometido. Entao

ficam como trabalhos futuros a construcao dos seguintes componentes de software:

• Interface grafica em Android para o modo 1x1 do miniTruco - apesar de ter sido de-

senvolvido um applet que roda num navegador, para poder incorporar as modificacoes

no projeto original e necessario ter uma interface em Android;

• Expansao da modelagem Fuzzy desenvolvida para permitir a tomada de decisao no

modo 2x2 - isto permitiria que jogadores humanos jogassem em dupla e tornaria o

jogo mais interessante, solucionando o problema encontrado durante a realizacao de

experimentos;

49

• Traducao da modelagem Fuzzy desenvolvida no Matlab para a linguagem Fuzzy Con-

trol Language (FCL) padronizada pela IEC 61131-7 - removeria a dependencia exis-

tente hoje do projeto com o compilador do Matlab.

Referencias Bibliograficas

BUCHANAN, B. G.; FEIGENBAUM, E. A. DENDRAL and Meta-DENDRAL: their

Applications Dimension. [S.l.], fevereiro 1978.

COPPIN, B. Artificial Intelligence Illuminated. 1a. ed. Sudbury, Massachusetts: Jones

and Burtlett, 2004.

DAVIDSON, A. Opponent Modeling in Poker: Learning and Acting in a Hostile and

Uncertain Environment. Dissertacao (Mestrado) — University of Alberta, Edmonton,

Alberta, 2002.

DUBOIS, D.; PRADE, H. Fuzzy Sets and Systems: Theory and Applications.

Massachussets, Estados Unidos: Academic Press, Inc, 1980. Vol. 144, Mathematics in

Science and Engineering.

KLEIJ, A. A. J. van der. Monte Carlo Tree Search and Opponent Modeling through Player

Clustering in no-limit Texas Hold’em Poker. Dissertacao (Mestrado) — University of

Groningen, The Netherlands, 2010.

MALVEZZI, W. R. Uma Ferramenta Baseada em Teoria Fuzzy para o Acompanhamento

de Alunos Aplicado ao Modelo de Educacao Presencial Mediado por Tecnologia.

Dissertacao (Mestrado) — Universidade de Sao Paulo, Sao Paulo, 2010.

MATHWORKS. MATLAB Fuzzy Logic Toolbox - User’s Guide. [S.l.], 2011.

RUSSEL, S.; NORVIG, P. Inteligencia Artificial. 2a. ed. Rio de Janeiro: Elsevier, 2004.

Traducao de PubliCare Consultoria.

SILER, W. Fuzzy Expert Systems and Fuzzy Reasoning. Nova Jersey, Estados Unidos:

John Wiley & Sons, Inc, 2005.

REFERÊNCIAS BIBLIOGRÁFICAS 51

ZADEH, L. A. Fuzzy sets. Information and Control, v. 8, n. 3, p. 338 – 353, 1965.

Apendice A

Integracao com o Matlab

Codigos-fonte para importacao como projeto no Eclipse ou executavel disponıveis no dire-

torio MatlabIntegration do CD que acompanha este trabalho.

Apendice B

Estrategia Fuzzy

Codigos-fonte para importacao como projeto no Eclipse ou executavel disponıveis no dire-

torio miniTruco e miniTrucoServer do CD que acompanha este trabalho.

Apendice C

Cliente Applet

Codigos-fonte para importacao como projeto no Eclipse ou executavel disponıveis no dire-

torio MiniTrucoAppletClient do CD que acompanha este trabalho.