Integrando Lógica Fuzzy ao Desenvolvimento de Jogos

Propaganda
Integrando Lógica Fuzzy ao Desenvolvimento de Jogos
MARCOS ROMERO
[email protected]
Universidade Federal do Pará – Departamento de Informática
Projeto JEDI - Jogos Eletrônicos Distribuídos e Inteligentes
Resumo
A Inteligência Artificial possui muitas aplicações em jogos. Uma das técnicas usadas é
a da lógica Fuzzy, que é uma extensão da lógica booleana. Neste artigo apresentamos noções
básicas da lógica Fuzzy; uma biblioteca para integração da lógica Fuzzy em jogos; um formato
para modelos Fuzzy e um editor gráfico que facilita a criação dos modelos.
Palavras-chaves : Inteligência Artificial; Lógica Fuzzy; Programação de Jogos.
1. Introdução
A Inteligência Artificial (IA) pode ser descrita como uma tentativa de modelar aspectos
do pensamento humano no computador. A sua aplicação em jogos eletrônicos tem como
objetivo fazer com que os jogadores sintam como se estivessem jogando contra oponentes
reais e inteligentes. Este tem sido um grande desafio na programação de jogos, mas no futuro
os jogos serão principalmente avaliados pela qualidade de sua Inteligência Artificial.
Uma das tecnologias de IA que tem sido usada em jogos é a lógica Fuzzy. A lógica
Fuzzy é um conjunto maior da lógica convencional (booleana) que foi estendida para lidar com
o conceito de verdades parciais, ou seja, valores que estão entre “completamente verdadeiro” e
“completamente falso”.
Neste artigo iremos examinar diversas ferramentas que possibilitam a implementação
da lógica Fuzzy em jogos. A maior parte destas ferramentas foram desenvolvidas pela empresa
“Louder Than A Bomb! Software” (www.LouderThanABomb.com ).
2. Fundamentos da lógica Fuzzy
Na lógica tradicional, os conjuntos são precisos, ou você pertence 100% a um conjunto
ou não pertence. Um conjunto de pessoas jovens pode ser definido como todas as pessoas
que têm menos de 25 anos, qualquer um que tiver 25 anos ou mais será classificado como
Adulto (ou “não jovem”). A lógica Fuzzy permite que uma pessoa possa ter 100% de
participação no conjunto “jovem”, e ao mesmo tempo ter 20% de participação no conjunto
“Adulto”.
As duas operações mais comuns em conjuntos Fuzzy são o MIN e MAX. O operador
MIN retornar o menor valor entre dois ou mais valores, o que equivale ao operador lógico
“AND”. O operador MAX retornar o maior valor entre dois ou mais valores, o que equivale ao
operador lógico “OR”.
As variáveis lingüísticas Fuzzy são conceitos como “Energia”, “Temperatura” e
“Distância”. Elas são compostas por conjuntos que define o seu estado, por exemplo, na
variável “Temperatura” pode haver os conjuntos “Baixa”, “Média”, “Alta”. Cada conjunto é
representado por uma função de participação que define o seu formato. As formas mais
comuns de funções são a triangular e a trapezoidal.
Depois que as variáveis lingüísticas Fuzzy são definidas para um modelo, é preciso
produzir as regras que definirão o que deve ser feito nas diversas situações. As regras
consistem basicamente de instruções do tipo Se..Então. Como exemplo usaremos duas
variáveis para representar as energias de dois personagens de um jogo e será feito uma
análise para definir as diversas ações que um dos personagens deve executar.
Ex:
Se minha_energia está baixa E energia_oponente está alta Então a Ação é fugir
Se minha_energia está alta E energia_oponente está baixa Então a Ação é atacar
No final da análise o resultado passa por um processo de defuzzificação que tem como
objetivo a conversão de um valor Fuzzy em um valor discreto. Existem dois métodos principais
de defuzzificação : Center of Gravity e Mean of Maximum.
3. Biblioteca para lógica Fuzzy
Existe uma biblioteca para lógica Fuzzy chamada FFLL (Free Fuzzy Logic Library). Ela
tem o código-fonte aberto, foi escrita em C++ e é otimizada para aplicações que requerem alto
desempenho, como jogos eletrônicos. A FFLL foi originalmente lançada como parte do livro "AI
Game Programming Wisdom".
Apresentamos abaixo a hierarquia de classes do FFLL com uma breve descrição de
cada uma delas:
 FFLLBase (classe base para todas as outras classes)
♦
FuzzyModelBase
♦
FuzzyVariableBase (define as variáveis, cada variável possui uma lista de conjuntos)
•
♦
♦
♦
♦
FuzzyOutVariable (define as variáveis de saída)
FuzzySetBase (define os conjuntos)
•
♦
(contém as variáveis e as regras que definem um modelo)
FuzzyOutSet (esta classe é usada para os conjuntos das variáveis de saída)
MemberFuncBase (classe abstrata que define o tipo de curva que um conjunto possui)
•
MemberFuncSCurve (esta é a forma de Curva-S, consiste de 7 pontos)
•
MemberFuncSingle (consiste de apenas um ponto, usada para valores discretos)
•
MemberFuncTrap
(forma de trapézio)
•
MemberFuncTri
(forma triangular)
DefuzzVarObj
(classe abstrata para as variáveis de defuzzificação)
•
COGDefuzzVarObj (variáveis usadas na defuzzificação "Center of Gravity")
•
MOMDefuzzVarObj (variáveis usadas na defuzzificação "Mean of Maximum")
DefuzzSetObj
(classe abstrata para os conjuntos de defuzzificação)
•
COGDefuzzSetObj (conjuntos usados na defuzzificação "Center of Gravity")
•
MOMDefuzzSetObj (conjuntos usados na defuzzificação "Mean of Maximum")
RuleArray
(Esta classe mantém a lista de regras do modelo)
4. Formato para modelos Fuzzy
A biblioteca FFLL usa o FCL (Fuzzy Control Language) como formato para os modelos
Fuzzy. As especificações para a sintaxe do FCL estão descritas no documento 61131-7 da IEC
(International Electrotechnical Commission). A seguir está um exemplo de modelo devidamente
comentado para facilitar o entendimento.
(* Os parenteses com os asteristicos são usados para comentários *)
FUNCTION_BLOCK
(* variáveis de entrada *)
VAR_INPUT
Our_Heath
REAL;
Enemy_Health
REAL;
END_VAR
(*variável de saída *)
VAR_OUTPUT
Aggressiveness
END_VAR
REAL;
(* definição dos conjuntos que compõem as variáveis *)
FUZZIFY Our_Health
TERM Near_Death := (0,0) (0,1) (50,0) ;
TERM Good := (14,0) (50,1) (83,0) ;
TERM Excellent := (50,0) (100,1) (100,0) ;
END_FUZZIFY
FUZZIFY Enemy_Health
TERM Near_Death := (0,0) (0,1) (50,0) ;
TERM Good := (14,0) (50,1) (83,0) ;
TERM Excellent := (50,0) (100,1) (100,0) ;
END_FUZZIFY
FUZZIFY Aggressiveness
TERM Run_Away := 1;
TERM Fight_Defensively := 2;
TERM All_Out_Attack := 3;
END_FUZZIFY
(*especifica o método de defuzzificação: MOM - Mean of Maximum *)
DEFUZZIFY valve
METHOD: MoM;
END_DEFUZZIFY
(* bloco para especificação das regras do modelo *)
RULEBLOCK first
AND: MIN;
ACCU: MAX;
RULE 0: IF (Our_Health IS Near_Death) AND (Enemy_Health IS Near_Death)
THEN (Aggressiveness IS Fight_Defensively)
RULE 1: IF (Our_Health IS Near_Death) AND (Enemy_Health IS Good)
THEN (Aggressiveness IS Run_Away)
RULE 2: IF (Our_Health IS Near_Death) AND (Enemy_Health IS Excellent)
THEN (Aggressiveness IS Run_Away)
RULE 3: IF (Our_Health IS Good) AND (Enemy_Health IS Near_Death)
THEN (Aggressiveness IS All_Out_Attack)
RULE 4: IF (Our_Health IS Good) AND (Enemy_Health IS Good)
THEN (Aggressiveness IS Fight_Defensively)
RULE 5: IF (Our_Health IS Good) AND (Enemy_Health IS Excellent)
THEN (Aggressiveness IS Fight_Defensively)
RULE 6: IF (Our_Health IS Excellent) AND (Enemy_Health IS Near_Death)
THEN (Aggressiveness IS All_Out_Attack)
RULE 7: IF (Our_Health IS Excellent) AND (Enemy_Health IS Good)
THEN (Aggressiveness IS All_Out_Attack)
RULE 8: IF (Our_Health IS Excellent) AND (Enemy_Health IS Excellent)
THEN (Aggressiveness IS Fight_Defensively)
END_RULEBLOCK
END_FUNCTION_BLOCK
5. O editor Spark!
Spark! é um editor de lógica Fuzzy que facilita a criação e integração da lógica Fuzzy
em aplicações. O tempo necessário para a criação e ajuste de um sistema de lógica Fuzzy é
drasticamente reduzido em relação aos métodos tradicionais de escrita da lógica Fuzzy. O
programa estará disponível em três versões:
• Spark! Viewer - Esta é a versão gratuita do programa. Ele permite que os modelos
sejam visualizados, e possibilita a alteração de algumas
características nos modelos que são definidas durante a criação
deles.
• Spark! Developer - Versão para os desenvolvedores iniciantes. Permite a criação
dos modelos Fuzzy e as definições de elementos que poderão ser
alterados pelo usuário final usando o visualizador Spark!Viewer.
• Spark! Professional - Semelhante à versão "Developer" porém com mais recursos.
Atualmente, apenas a versão Spark!Viewer está disponível.
Spark! têm uma simples e intuitiva interface gráfica com o usuário permitindo que os
modelos Fuzzy sejam rapidamente criados e modificados. Usando o Spark!, você pode criar
modelos de lógica Fuzzy e permitir que o usuário final modifique-o usando a ferramenta gratuita
Spark!Viewer. Isto é útil para aplicações como jogos eletrônicos onde você espera que o
usuário final possa manipular a inteligência artificial do jogo sem que seja necessário que ele
aprenda uma linguagem de script ou que fique modificando uma série de números em arquivos
textos.
Figura 1 - Modelo Fuzzy no Spark!
A figura 1 mostra os elementos de um modelo Fuzzy carregado no ambiente do Spark.
As duas variáveis de entrada são "Our_Health" e "Enemy_Health". O modelo possui uma
variável de saída chamada "Aggressiveness". São mostrados também os conjuntos que
definem as funções de participação para cada variável. No exemplo temos os conjuntos
"Excellent", "Good" e "Near_Death" para a variável "Enemy_Health" e os conjuntos
"Run_Away", "Fight_Defensively" e "All_Out_Attack" para a variável "Aggressiveness".
Figura 2 - Composição de uma variável
A figura 2 ilustra o conteúdo da variável "Our_Health". Os conjuntos que compõem as
variáveis são representados graficamente permitindo uma fácil compreensão do modelo.
Podem-se alterar os pontos que definem a curva diretamente no gráfico. São suportados 4
tipos de curvas para as funções de participação : "singleton", "Curva-S", "triangular",
"trapezoidal".
Figura 3 - As regras do modelo
Enquanto que na maioria das ferramentas de lógica Fuzzy as regras são definidas em
um formato de planilha, no Spark! elas são definidas graficamente. Basta clicar nos conjuntos
das variáveis de entrada e associar a um resultado e a regra já está criada, como mostra a
figura 3. As linhas em negrito indicam a regra que está ativa no momento. Os botões, que
representam os conjuntos, podem ser movidos para facilitar a visualização.
6. Considerações finais
Uma boa implementação de Inteligência Artificial em um jogo torna a ação dos
personagens menos previsível, de forma que o jogador poderá esperar reações diferentes em
cada partida. Isto aumenta em muito a vida útil de um jogo. A IA também está possibilitando o
surgimento de novos estilos de jogos, como é o caso do jogo “The Sims”, onde o objetivo é
orientar as ações de uma família.
Com o avanço tecnológico, boas ferramentas têm surgido para auxiliar nesta difícil
tarefa de tornar os jogos mais inteligentes. Além disso, as configurações dos computadores dos
jogadores têm melhorado, permitindo que uma maior parte do processamento de um jogo seja
dedicado à IA.
A área de desenvolvimento de jogos tem se mostrado como um excelente campo de
pesquisa para a ciência da computação. Um jogo apresenta aspectos de diversas disciplinas
como Inteligência Artificial, Sistemas Distribuídos, Computação Gráfica, Engenharia de
Software, Estruturas de Dados e outras.
7. Referências bibliográficas
•
•
LaMothe, André. Tricks of the Windows Game Programming Gurus. USA: Sams, 1999.
Rabin, Steve (editor). AI Game Programming Wisdom. USA: Charles River Media, 2002.
•
•
www.gameai.com
www.LouderThanABomb.com
Download