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.
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.