1 introdução - revista eletrônica da faculdade metodista granbery

Transcrição

1 introdução - revista eletrônica da faculdade metodista granbery
Revista Eletrônica da Faculdade Metodista Granbery
http://re.granbery.edu.br - ISSN 1981 0377
Curso de Sistemas de Informação - N. 8, JAN/JUN 2010
Algoritmos Genéticos Aplicados a Jogos Eletrônicos
Gilberto Timótheo Júnior1, Sérgio Muinhos Barroso Lima1
1
Faculdade Metodista Granbery
CEP: 36010-532 – Juiz de Fora – MG – Brazil
[email protected], [email protected]
Resumo
A inteligência artificial vem sendo utilizada no desenvolvimento de jogos
eletrônicos como ferramenta essencial para trazer maior grau de realismo aos
jogos. Este artigo estuda a aplicação dos algoritmos genéticos no
desenvolvimento de jogos, explorando sua aplicabilidade, vantagens e
desvantagens.
Palavras-chave: jogos eletrônicos, desenvolvimento de jogos, ferramentas
para jogos, máquinas de jogos.
Abstract.
The artificial intelligence has been used in the development of video games as
an essential tool to bring greater realism to games. This paper studies the
application of genetic algorithms in game development, exploring their
applicability, advantages and disadvantages.
Key-words: eletronic games, game development, game tools, genetic
algorithms.
1 INTRODUÇÃO
A Inteligência Artificial (IA) desde os seus primórdios está diretamente
ligada ao processo cognitivo humano, evoluindo desde as bases alicerçadas
nos estudos de Aristóteles, e caminhando sem respostas definitivas, através do
tempo, permeando-se por várias teorias relacionadas à inteligência humana
(NILSSON, 1998).
O desenvolvimento da Inteligência Artificial assume um caráter
permanente, contando com a adesão, mesmo que lenta, de cientistas capazes
de promover sua divulgação. Nesse contexto, John Holland inicia um processo
de desenvolvimento dos estudos sobre os Algoritmos Genéticos, influenciando
outros pesquisadores a tomarem o mesmo caminho. Com o passar dos anos, e
com sua consolidação, eles começaram a ser utilizados em inúmeras áreas de
pesquisa, sendo uma dessas áreas os jogos eletrônicos (RUSSELL e NORVIG,
2004).
Como uma das muitas aplicações dos Algoritmos Genéticos, os jogos
eletrônicos despertam especial atenção, pois envolvem um número grande e
entusiasmado de usuários e um mercado em rápido crescimento, tão próspero
quanto a indústria do cinema (BATISTA et al, 2009).
Este trabalho trata, então, da confluência entre essas duas áreas, a
Inteligência Artificial e os jogos eletrônicos, especificamente na aplicação de
Algoritmos Genéticos no comportamento de personagens de jogos eletrônicos.
2 HISTÓRICO DA INTELIGÊNCIA ARTIFICIAL EM JOGOS ELETRÔNICOS
A Inteligência Artificial foi definida por muitos, como cita Luger (2004), "...
a ciência da computação que se ocupa da automação do comportamento
inteligente.". Com esta frase ele reafirma a posição de que a IA é um fragmento
da Ciência da Computação que deve, por sua vez, ser baseada em profundos
estudos e princípios teóricos concretos. Neste processo, pode-se incluir como
base toda a estrutura computacional como algoritmo e linguagem apropriados.
Neste processo de entendimento da IA, o próprio Luger (2004) expõe uma
fragilidade nesta definição quando diz:
Entretanto, esta definição padece do fato de que a inteligência
em si não é muito bem definida ou entendida. Embora muitos
de nós estejam certos de que reconhecemos o que é
comportamento inteligente, quando o vemos, é muito
improvável que alguém seja capaz de definir inteligência de
uma maneira que seja específica o suficiente para auxiliar na
avaliação de um programa de computador supostamente
inteligente[...]. (LUGER, 2004, p. 23).
A inteligência, segundo Luger (2004), é uma faculdade única, ou apenas
um nome dado a uma coleção de habilidades humanas distintas e não
2
correlacionadas.
A
inteligência
pode
ser
visualizada
através
de
um
comportamento observável ou inegável evidência de um dispositivo interno
individual.
O primeiro de muitos estudos relacionados à Inteligência Artificial pode
ser atribuído a Aristóteles (NILSSON, 1998), em seu esforço para explicar e
codificar a inteligência humana. Porém, o termo Inteligência Artificial foi
utilizado pela primeira vez por John McCarthy, como nome da conferência em
Dartmouth, em 1956.
Isto se deu devido a grande parte dos estudos realizados anteriormente
tratarem apenas do âmbito matemático dos autômatos, que pode ser
considerado como um modelo matemático de uma máquina de estados finita, a
qual modela o comportamento através de estados e das transições de um
estado para o outro.
No período anterior aos anos 70, os processos classificados como
inteligentes se encontravam distantes dos que são conhecidos hoje. Viviam
ainda um estágio inicial, básico, com uma divulgação restrita, não havendo
portanto nenhum interesse real que justificasse um foco de mercado, isto é,
que recursos financeiros e tecnológicos pudessem ser alocados em um projeto
significativo de pesquisa com o propósito de desenvolvimento. Estas pesquisas
estavam cercadas por grandes expectativas, pois vários testes realizados
obtiveram
resultados
positivos.
Porém,
este
otimismo
excessivo
era
acompanhado de controvérsias, já que os testes realizados eram muito
restritos, não verificando problemas mais amplos e complexos (RUSSELL e
NORVIG, 2004).
Devido à inexistência de um mercado para jogos na época, estes não
passavam de testes em laboratórios, como Tênis para Dois, de 1958, que era
um jogo simples, jogado através de um osciloscópio (BATISTA et al., 2007), ou
demonstrações de capacidade de hardware, como no jogo Spacewar!, de 1961,
no qual o jogador controlava uma nave espacial enfrentando naves inimigas e
utilizava algoritmos complexos para cálculos físicos.
Em ambos os casos, os jogos permitiam apenas jogabilidade Versus
Mode, a ação de um jogador contra outro apenas, não havendo necessidade
da aplicação de nenhuma técnica de Inteligência Artificial, conforme menciona
3
(NERF US PLEASE, 2008): “Até as décadas de 60 e início de 70, os jogos
eletrônicos possuíam apenas VERSUS MODE, não havendo a necessidade da
utilização da IA.”
Na década de 70, apesar de seu início conturbado, as pesquisas na área
de Inteligência Artificial começam a gerar resultados mais sólidos. Foi o início
da utilização de métodos para solução de problemas relativamente pequenos,
pois estes não suportavam problemas de maior porte. Exemplos de utilização
desses métodos são: o programa DENDRAL, da Universidade de Stanford,
para inferir a estrutura molecular a partir de dados de um espectrômetro de
massa, e o MYCIN, também da Universidade de Stanford, que tinha como
objetivo diagnosticar infecções sanguíneas.
Na área de entretenimento, os primeiros consoles começaram a ser
lançados
no
mercado,
abrindo
uma
janela
de
oportunidades
para
desenvolvimento de jogos, sendo o primeiro deles, o Odyssey 100. Foi nesse
período que os primeiros jogos que utilizavam conceitos de Inteligência Artificial
surgiram. As primeiras entidades inteligentes apareceram nos jogos Pursuit e
Qwak, de 1974, onde o jogador deveria atirar em alvos móveis (NERF US
PLEASE, 2008), os quais utilizavam padrões de movimento. O mesmo
processo foi utilizado no jogo Gun Fight, de 1975, e também no jogo Space
Invaders, de 1978.
Já na década de 80, a Inteligência Artificial começa a ser tratada, ao
mesmo tempo, como produto industrial das grandes empresas e como tópico
para estudos científicos. Investimentos pesados na área levaram as grandes
empresas a terem seu próprio grupo de pesquisa em IA e a utilizar sistemas
baseados nela. Também ocorreu uma retomada das pesquisas em relação às
redes neurais1, que haviam sido deixadas de lado até então. Esta retomada,
que aperfeiçoou os processos de reconhecimento de padrões e aprendizado,
levou à mineração de dados, amplamente utilizada atualmente. Em todos os
aspectos da IA, a pesquisa passou a ser tratada rigorosamente como pesquisa
científica, sujeita a todos os métodos de verificação de processos para
assegurar os resultados apresentados (RUSSELL e NORVIG, 2004).
1
Redes neurais são sistemas computacionais estruturados numa aproximação à computação
baseada em ligações. Nós simples são interligados para formar uma rede de nós.
4
Nesse mesmo período, o grande avanço relacionado à IA nos jogos foi a
utilização de uma FSM (Finite State Machine, ou Máquina de Estados Finitos).
Ela descreve uma série de ações passíveis de serem realizadas pelo
personagem e em quais circunstâncias. O jogo Pac-Man, de 1980, ao se
utilizar de uma máquina de estados para cada inimigo, permitiu sua ação
autônoma baseada na atual situação do jogador e dos outros inimigos (NERF
US PLEASE, 2008). No Pac-Man, os estados possíveis da máquina de estados
dos fantasmas são: procurando o jogador, perseguindo o jogador e fugindo do
jogador.
Outro jogo que influenciou seus predecessores foi Sim City, de 1989,
que introduziu um novo sistema de jogo, simulando sistemas complexos e
utilizando técnicas de IA para gerar respostas em tempo real às ações do
jogador (CHAMPANDARD, 2007).
Na década de 1990, surgiu o conceito de Agentes Inteligentes, que se
utilizavam de várias técnicas de IA para resolução de problemas, percepção
constante de determinado ambiente, entre outras aplicações (Russell e Norvig,
2004). Foi nesse período que foi lançado o primeiro jogo do estilo RTS (Real
Time Strategy, ou Estratégia em Tempo Real), Herzog Zwei, de 1990, que já
apresenta algoritmos de path-finding2, porém de baixa qualidade (NERF US
PLEASE, 2008).
Também foi lançado o primeiro jogo do estilo FPS (First Person Shooter,
ou Tiro em Primeira Pessoa), Doom, de 1993, que utilizava, de uma forma mais
complexa, as máquinas de estados para o comportamento dos inimigos.
Em 1996 é lançado o jogo Battlecruiser: 3000AD, cujos desenvolvedores
alegaram serem os primeiros a utilizar redes neurais em um jogo, apesar de
este fato ter causado muitas controvérsias, pois muitos não acreditavam nessa
possibilidade, ou que o processo que se utilizava da técnica seria muito simples
e com pouco impacto nos jogos (NERF US PLEASE, 2008).
A Inteligência Artificial em jogos de tiro em primeira pessoa tomou um
novo rumo após o lançamento do jogo Half-Life, de 1998, que aperfeiçoou
muito os processos das máquinas de estados, o que tornou o jogo mais realista
2
São algoritmos específicos que buscam um caminho entre dois pontos de um cenário.
5
que os seus concorrentes, fazendo com ele fosse aclamado pela crítica como
melhor jogo do ano e também melhor Game AI (jogo com técnicas robustas de
IA) até então (NERF US PLEASE, 2008).
O Remote Agent da NASA foi o primeiro programa de planejamento
autônomo a ser responsável pelo controle das operações de uma nave
espacial, realizando a detecção de problemas, diagnósticos e recuperação
desses problemas na medida em que ocorriam (RUSSELL e NORVIG, 2004).
No campo dos jogos, em 1997, o Deep Blue da IBM se tornou o primeiro
sistema computacional a derrotar o campeão mundial de xadrez, o enxadrista
Garry Kasparov, numa partida de exibição (RUSSELL e NORVIG, 2004).
Em 2000, foi lançado o jogo Total War, que, apesar de não apresentar
avanços em relação a técnicas de IA, introduziu uma nova forma de utilização,
controlando o comportamento e as respostas de centenas de unidades ao
mesmo tempo (CHAMPANDARD, 2007), o que não havia acontecido até então.
Também neste ano, foi lançado The Sims, um jogo de simulação da vida
cotidiana, que deu um grande passo, desenvolvendo a IA nos personagens,
que apresentavam comportamentos mais realistas, desejos e escolhas no
decorrer do jogo (CHAMPANDARD, 2007).
O jogo Black and White, de 2001, deu mais um passo no avanço da
Inteligência Artificial nos jogos. Além de usar máquinas de estados e processos
puramente matemáticos para controle das vilas no jogo, a parte com maior
impacto foi a criatura, que o jogador pode, através de suas ações, moldar sua
personalidade, tornando-a uma criatura pacífica ou num monstro maléfico,
destruindo tudo a sua frente. Este processo é o conjunto de várias técnicas,
como, por exemplo, um sistema de valores simbólicos atribuídos a cada objeto,
aliado a um processo baseado em regras, dão a criatura informações sobre o
objeto. Uma árvore de decisão foi usada para representar a opinião da criatura
sobre algum objeto. Para os desejos da criatura, foram utilizadas redes neurais.
Mas seu uso não se restringiu apenas à criatura, e está presente em cada
personagem do jogo (Molyneux, 2001). Essas técnicas, aplicadas onde são
mais relevantes, tornam o processo mais realista. O jogo provou que o
aprendizado em jogos é uma tecnologia legítima para os jogos de mercado.
6
Em 2005, foi lançado o jogo F.E.A.R., que melhorou consistentemente
os processos de resposta a eventos em tempo real utilizados pelos jogos até
então. A partir desses melhoramentos, movimentos em esquadrão se tornaram
mais intuitivos e realistas (CHAMPANDARD, 2007).
O jogo de Tiro em Primeira Pessoa Left 4 Dead, de 2008, utilizou
técnicas de IA de uma maneira nova, gerando inimigos e desafios, baseandose na atual situação do jogador, tornando-o mais fácil, ou mais difícil,
dependendo do desempenho do jogador (CHAMPANDARD, 2007).
Neste contexto da evolução histórica da tecnologia da IA, recentemente
começaram as pesquisas e a utilização dos algoritmos genéticos aplicados a
jogos eletrônicos, especialmente sobre o comportamento dos personagens dos
jogos.
3 ALGORITMOS GENÉTICOS
O desenvolvimento dos estudos de Charles Darwin sobre a evolução
das espécies, apresentados em 1859, no qual o indivíduo mais bem adaptado
ao meio tem maiores possibilidades de sobrevivência, resultaram no conceito
de que as diferentes formas de vida são passíveis de adaptações, através de
mudanças genéticas gradativas. Estas mudanças ocorrem devido à influência
do ambiente em que vive o indivíduo.
Tendo como referência estes conceitos apresentados por Darwin, no
início, as pesquisas relacionadas aos algoritmos evolutivos foram realizadas
por biólogos evolucionistas que criaram representações programadas em
computadores para a modelagem de aspectos evolucionários dos animais
(MARCZYK, 2004). Baseando-se na observação dos organismos vivos, que
são grandes solucionadores de problemas, possuindo uma incrível capacidade
de adaptação ao ambiente imposto a eles, houve um grande aprofundamento
das pesquisas de sistemas de aprendizado.
O estudo dos algoritmos evolutivos baseou-se em três áreas diferentes
de pesquisa: a programação evolucionária, a estratégia evolucionária e os
Algoritmos Genéticos (GROSKO et al., 2009). Todas estas áreas possuem uma
7
mesma base de conhecimento. Porém, se diferenciam em detalhes nos
processos e em seu escopo.
Os primeiros estudos na área de sistemas adaptativos complexos foram
realizados por Nils Aall Barricelli na década de 50. Porém, seu trabalho foi
pouco conhecido. O mesmo aconteceu com o trabalho do australiano Alex
Fraser, também na década de 50. A partir destes primeiros estudos, pesquisas
sobre simulações do processo evolutivo se tornaram mais populares, mas
apenas no final da década de 60 e início da década de 70, o processo de
evolução artificial se tornou amplamente reconhecido, através dos estudos de
Ingo Rechenberg e Hans-Paul Schwefel, os quais conseguiram resolver
problemas complexos através de processos de simulação evolutiva. Porém,
estes processos que foram utilizados pouco se assemelhavam aos Algoritmos
Genéticos (MARCZYK, 2004).
Todos os estudos supracitados se utilizavam de máquinas de estados
finitos, que eram adaptadas durante o processo para melhor adequação ao
problema. Somente na década de 70, com o trabalho de John Holland,
considerado o criador dos Algoritmos Genéticos, foi criada a base para futuras
pesquisas na área. Estes estudos foram focados na adaptação dos seres vivos,
no processo evolutivo, que diz que uma característica que melhor se adapta ao
ambiente é passada adiante. Holland foi o primeiro a introduzir os processos de
crossover, que cria um novo indivíduo com partes definidas dos seus geradores,
e de mutação, que altera um valor aleatório dentro do indivíduo.
Contrastando com o padrão de pesquisa utilizado, que definia o uso de
algoritmos para resolução de problemas específicos, Holland queria estudar os
processos de adaptação na natureza e adaptar estes processos à realidade
computacional (MITCHELL, 1998). O primeiro framework que realizava estes
processos foi nomeado Holland’s Schema Theorem.
Utilizando como base suas pesquisas anteriores, John Holland e
companheiros da Universidade de Michigan publicaram o livro Adaptation in
Natural and Artificial Systems, em 1975, que efetivamente introduziu o conceito
de sistemas digitais adaptativos utilizando mutação, crossover e seleção
natural, os quais serão descritos em detalhe posteriormente, para simular
processos biológicos e utilizá-los para resolução de problemas, sendo esta
8
uma grande inovação para o período. Holland também foi o primeiro a buscar o
desenvolvimento de uma base teórica mais firme para as futuras pesquisas na
área de Algoritmos Genéticos.
Neste mesmo ano, o trabalho de Kenneth De Jong estabeleceu o
potencial dos Algoritmos Genéticos na resolução de testes, introduzindo ruídos
e descontinuidades aos parâmetros das buscas (MARCZYK, 2004).
Em meados da década de 80, os Algoritmos Genéticos já eram
utilizados em vários tipos de aplicações, desdedesde problemas matemáticos
abstratos até problemas de Engenharia mais tangíveis, como controle de fluxo,
detecção de padrões e classificação (MARCZYK, 2004).
No final da década de 80, David E. Goldberg, outro precursor dos
Algoritmos Genéticos atuais, descreve o mesmo como “uma pesquisa baseada
no mecanismo de seleção e genética natural objetivando a otimização”.
Segundo ele, os Algoritmos Genéticos são superiores aos métodos clássicos
de otimização descritos na literatura, pois se apoiaram no fato de que eles
utilizam codificação dos parâmetros e não dados reais; que fazem busca numa
população e não num único ponto; que usam a informação de aptidão e não
outro conhecimento auxiliar; e também que usam regras de transição
probabilísticas e não determinísticas.
O processo de evolução acontece por dois métodos: pela seleção
natural, que faz com que as melhores qualidades dos indivíduos, as quais são
selecionadas em relação ao problema em mãos, sejam repassadas aos seus
descendentes, e a reprodução em si, que garante a mistura dos genes dos
indivíduos envolvidos, resultando num indivíduo diferente e possivelmente
melhor que seus ancestrais (HOLLAND, 2009).
Atualmente, computação evolutiva é um campo muito amplo, e os
Algoritmos Genéticos passaram também a ser aplicados para resolução de
problemas mais comuns, como previsões de bolsas, planejamento de vôos em
aeroportos, design de microchips, entre várias outras aplicações, não havendo
praticamente nenhuma área que não se utilize desses processos (MARCZYK,
2004).
O processo de um algoritmo genético começa com uma população
formada por uma lista aleatória de possibilidades, chamadas de indivíduos ou
9
cromossomos. Estes indivíduos podem ser convertidos de sua notação original,
que é uma representação de uma possível solução do problema, seja ela boa
ou ruim, para notação binária, que é utilizada pelo algoritmo, como mostrado na
Ilustração 1, podendo também ser utilizados em sua notação original. O
número de bits dos indivíduos deve ser o suficiente para que as possíveis
soluções possam ser convertidas novamente à notação inicial, como afirma
(BUCKLAND, 2002): “Uma coisa importante é que cada cromossomo seja
codificado de forma que o conjunto de bits possa ser decodificado para
representar uma solução do problema em questão”.
Ilustração 1: Representação de um indivíduo na notação binária.
Após a geração da população inicial, uma parte dela é selecionada para
reprodução e, consequentemente, para a criação de uma nova geração. Esta
seleção se dá através de uma função de aptidão, ou função de fitness, que
verifica o quão próximo do resultado desejado está aquele indivíduo e atribui
um valor, ou nota, ao indivíduo, baseada nesse fator. O grupo que participará
da reprodução é chamado de grupo gerador, cujos indivíduos são selecionados
com base na nota resultante da função de fitness. Notas melhores aumentam a
probabilidade de um indivíduo participar do grupo gerador (RUSSELL e
NORVIG, 2004).
Depois de selecionado o grupo gerador, os indivíduos são divididos em
pares, e, para cada par, é realizada uma troca de parte dos bits de cada
indivíduo. Esta troca é denominada crossover (BUCKLAND, 2002). O crossover
é realizado seguindo uma taxa de crossover, que é uma porcentagem na qual o
crossover será executado, definida pelo usuário. Ela define a porcentagem de
indivíduos da população que sofrerão crossover. Seguindo uma posição
aleatória, todos os bits à direita daquele ponto serão trocados. Considerandose a posição do crossover igual a 3, a reprodução se dá como mostra a
Ilustração 2.
10
Ilustração 2: Processo de crossover.
O resultado da operação de crossover são dois indivíduos novos, que
carregam características dos indivíduos geradores, e farão parte da nova
geração.
Quando
os
indivíduos
geradores
são
muito
diferentes,
os
descendentes resultantes da operação de crossover podem ser totalmente
diferentes dos pais, o que demonstra que, no início do processo, as primeiras
execuções de crossover darão saltos maiores, enquanto, mais adiante no
processo, devido à seqüência de reproduções, os descendentes tendem a ser
mais parecidos com seus geradores, como afirma (RUSSELL e NORVIG,
2004):
Em geral, a população é bastante diversa no inicio do processo,
e assim o crossover (como a têmpera simulada)
freqüentemente executa grandes passos no espaço de estados
bem no inicio do processo de busca e passos menores adiante,
quando a maioria dos indivíduos é bastante semelhante.
(RUSSELL e NORVIG, 2004, p.116)
Após o crossover, pode ocorrer o processo de mutação dos indivíduos,
em que um bit do indivíduo é invertido (BUCKLAND, 2002), como mostra a
Ilustração 3. A frequência na qual as mutações são realizadas é baseada na
taxa de mutação, esta sendo uma porcentagem da população que sofrerá a
mutação, também definida pelo usuário.
Ilustração 3: Processo de mutação.
Após a geração dos descendentes, é feita uma avaliação para verificar
se algum dos novos indivíduos faz parte da solução desejada. Caso ocorra, o
processo é finalizado, retornando este indivíduo como solução. O processo
11
também pode ser encerrado caso o tempo limite definido tenha decorrido. Caso
não haja solução, os indivíduos da população inicial menos propensos a ser a
solução do problema são substituídos pela nova geração. Esta nova geração
passa pela função de fitness, em que são atribuídas suas notas, e o processo
de reprodução recomeça (BUCKLAND, 2002).
O fragmento de pseudocódigo na listagem 1 representa um algoritmo
genético. Apesar de ser uma representação relativamente simples de um
algoritmo genético, ela demonstra com objetividade a organização e execução
dos passos descritos anteriormente. Porém, neste caso, ele é apresentado com
uma pequena diferença, a reprodução gera apenas um descendente, como
afirma (RUSSEL e NORVIG, 2004): “[...] em sua versão mais popular, cada
união de dois pais produz apenas um descendente, e não dois.”
O algoritmo recebe como parâmetros a população inicial, gerada a partir
de possíveis soluções do problema, e a função de fitness FN-FITNESS, que irá
definir, através de um valor, a proximidade do indivíduo em relação à solução.
Inicialmente ele cria uma população vazia, nomeada nova_população, que irá
receber os indivíduos gerados pela reprodução. Em seguida, são selecionados
dois indivíduos, x e y, aleatoriamente, usando como base a função de fitness,
que farão parte da reprodução e gerarão um novo indivíduo, denominado filho.
Na função de reprodução, o tamanho do indivíduo x é armazenado na variável
n, e, logo após, é gerado um valor aleatório entre 1 e n, definido como c. O filho
é gerado concatenando os valores do indivíduo x, das posições 1 até c e os
valores do indivíduo y das posições c+1 até n, gerando uma sequência de
valores totalmente nova. Além da reprodução, dependendo da taxa predefinida,
é realizada a mutação no filho, sendo, em seguida, adicionado à
nova_população. Isto é feito até que o limite da população inicial seja atingido.
função ALGORITMO-GENÉTICO(população, FN-FITNESS) retorna um indivíduo
entradas: população, um conjunto de indivíduos
FN-FITNESS, uma função que mede a adaptação de um indivíduo
repita
nova_população ← conjunto vazio
para i ← 1 até TAMANHO(população) faça
x ← SELEÇÃO-ALEATÓRIA(população, FN_FITNESS)
y ← SELEÇÃO-ALEATÓRIA(população, FN_FITNESS)
filho ← REPRODUZ(x,y)
se (pequena probabilidade aleatória) então
filho ← MUTAÇÃO(filho)
12
adiciona filho a nova_geração
população ← nova_população
até algum indivíduo estar adaptado o suficiente ou até ter
decorrido tempo suficiente
retornar o melhor indivíduo de população, de acordo com FN-FITNESS
---------------------------------------------------------------função REPRODUZ(x,y) retorna um indivíduo
entradas: x,y, indivíduos pais
n ← COMPRIMENTO(x)
c ← número aleatório de 1 a n
retornar CONCATENA(SUBCADEIA(x,1,c),SUBCADEIA(y,c+1,n))
Listagem 1: Representação em pseudocódigo de um algoritmo genético
Fonte: (RUSSEL e NORVIG, 2004)
Os passos descritos anteriormente são repetidos até que algum
indivíduo da população esteja suficientemente próximo da solução proposta,
até que um tempo definido tenha decorrido ou até que o número limite de
iterações definido ocorra. O algoritmo então retorna o indivíduo mais próximo
da solução, baseando-se na função de fitness FN-FITNESS.
4 Aplicações em Jogos
Para exemplificar os conceitos apresentados anteriormente, se faz
necessária a demonstração de possíveis aplicabilidades dos Algoritmos
Genéticos em jogos eletrônicos, tais como a navegação autônoma e controle
de comportamento de personagens.
4.1 Navegação Autônoma
Navegação autônoma se dá quando um agente, utilizando como base
informações como o local pelo qual transitará, a extensão deste local e
possíveis obstáculos, consegue, sem interferência humana, partir de um local
qualquer e atingir um outro local definido como objetivo.
4.1.1 Busca em Árvores de Decisão
Uma busca em árvore de decisão busca o resultado, expandindo, a
partir de um ponto inicial, que é denominado nó raiz da árvore, todas as
13
possibilidades do problema, gerando novos nós, que expandem todas as
possibilidades em novos nós, sendo cada nó uma possibilidade do problema,
fazendo assim até que sejam cobertas todas as possibilidades do problema e o
resultado seja alcançado. Neste modelo, a busca se torna custosa, pois ela
expande sempre todos os nós possíveis, fazendo com que o tempo de busca
seja maior. A solução utilizada para melhoria do processo foi a busca pela
melhor escolha (SHI, 2006).
Na busca por melhor escolha (Best-First Search) são expandidos os nós
e, em seguida, é escolhido o nó que está mais próximo do objetivo final,
baseando-se numa função heurística que estima a distancia do nó até o
objetivo. Com a expansão de menos nós, há um ganho de desempenho no
algoritmo.
4.1.2 Exemplo de aplicação em navegação autônoma
O objetivo principal deste exemplo é que o personagem, no caso, um
tanque, partindo de qualquer ponto de um mapa (ilustração 6), possa, através
do uso de Algoritmos Genéticos, encontrar o ponto de chegada desviando-se
de obstáculos que se apresentam pelo mapa, os quais são posicionados de
forma aleatória (APPOLINARIO e PEREIRA, 2007).
4.1.3 Representação do problema
Inicialmente é considerado um mapa representado através de uma
matriz 10x10 posições. Como ponto de partida será considerada a coordenada
(0,0), no canto esquerdo superior do mapa, e o ponto de chegada se situará na
coordenada (9,9), no canto direito inferior do mapa. Para uso nos processos,
valores são atribuídos às posições do mapa para definir sua característica,
sendo atribuído o valor 0 às posições livres, o valor -1 aos obstáculos
posicionados no mapa, o valor -9 para o ponto de partida e o valor 9 para o
ponto de chegada (APPOLINARIO e PEREIRA, 2007).
Nesta aplicação, conforme Appolinario e Pereira (2007), foram usados
cromossomos que continham entre 60 e 80 alelos, sendo estes subdivisões de
14
um cromossomo, os quais definem uma característica do mesmo, e variando,
neste caso com o tamanho de 2 bits, sendo 00 para movimento para cima; 01
para a esquerda; 10, para baixo; e 11, para a direita. Uma verificação é
realizada durante o processo para analisar se o objeto realizou um movimento
válido, ou seja, se ele se movimentou para fora do mapa, ou se atravessou
uma posição ocupada por um obstáculo, e realizar o cálculo do fitness. Caso o
cromossomo possua algum movimento inválido dentro de sua estrutura, o valor
de seu fitness é reduzido de acordo com essa falha. Além desse fator, também
são levados em consideração, para atribuição do fitness, quantos movimentos
válidos estão presentes naquele cromossomo, através de um contador, e
também a proximidade da última posição do cromossomo em relação ao ponto
de chegada (APPOLINARIO e PEREIRA, 2007).
Após testes preliminares, Appolinario e Pereira (2007) verificaram que as
taxas de acertos do algoritmo, atuando no mapa com 10x10 unidades foram
mais altas quando o número de indivíduos da população foi 80, o número de
gerações a ser criadas foi de 100 e o tamanho do cromossomo foi estabelecido
com 70 bits. Os números que froam base para a quantidade de obstáculos
variaram entre 10, 18 e 34 obstáculos no mapa. Os resultados tiveram valores
médios para tempo de execução e número de movimentos iguais a 0,21
segundos e 22 passos, respectivamente.
4.1.4 Resultados e Comparação
Os testes usados para comparação entre o uso de Algoritmos Genéticos
e busca em árvore tomaram como base 3 mapas, representados por matrizes
10x10, 30x30 e 50x50 (APPOLINARIO e PEREIRA, 2007).
Para análise posterior dos resultados, foram usados como base os
dados de tempo de execução dos processos, tanto do algoritmo genético
quando da busca em árvore, assim como o custo da solução, sendo este custo
o número de passos contidos na solução encontrada por ambas as técnicas
(APPOLINARIO e PEREIRA, 2007).
15
O algoritmo genético teve resultados piores do que a busca em árvore,
tendo a diferença de desempenho aumentado de acordo com o aumento de
blocos e obstáculos no mapa, como mostra a tabela 1.
Tamanho do
cenário
Tempo do
AG
Tempo da
árvore
Custo do
AG
Custo da
árvore
10x10
0,21
0,1
20
15
30x30
0,35
0,1
151
103
0,59
0,3
428
292
50x50
Tabela 1: Tabela de dados comparativa
Fonte: (APPOLINARIO e PEREIRA, 2007)
Tanto nos cenários de 10x10 unidades, quanto no de 30x30 unidades, o
desempenho da busca em árvore se manteve em 0,1 segundos, enquanto o
algoritmo genético levou 0,21 no primeiro caso, e ainda mais no segundo, com
0,35 segundos. No cenário com 50x50 unidades, a vantagem da busca em
árvore se mantém à frente, realizando o processo em 0,3 segundos, contra
0,59 do algoritmo genético. Em relação ao custo, ou número de passos total da
solução, o algoritmo genético tambem teve desempenho pior, com custos
relativamente grandes em relação a busca em árvore, aumentando ainda mais
com o crescimento do cenário, como mostrado na tabela 2.
As diferenças em relação aos dois métodos fica mais evidente nos
gráficos apresentados na Ilustração 4.
Comparativo por custo
Comparativo por tempo
500
0,8
400
0,6
300
0,4
200
AG
0,2
Árvore
0
10x10 30x30 50x50
AG
100
Árvore
0
10x10
30x30
50x50
Ilustração 4: Gráficos comparativos de desempenho
Fonte: (APPOLINARIO e PEREIRA, 2007)
16
Apesar de ter seu desempenho inferior ao da busca em árvore, o
algoritmo genético conseguiu encontrar possíveis resultados, atingindo valores
máximos de 36, 270 e 750 passos para os mapas de 10x10 unidades, 30x30
unidades e 50x50 unidades, respectivamente, enquanto a busca em árvore
atingiu máximos de 44, 287 e 766 passos (APPOLINARIO E PEREIRA, 2007).
Para melhor se adaptar às mudançar de terreno, o número de alelos do
cromossomo, antes fixo, tornou-se variável, definindo-se que um cromossomo
precisaria conter entre 30% e 35% da quantidade total de movimentos
possíveis de serem realizados no mapa, como mostra a tabela 2. Outra
mudança importante realizada por Appolinario & Pereira (2007) foi a de fixar a
quantidade de cromossomos utilizada pelo algoritmo, já que a mudança desse
valor não trouxe variações significativas para os resultados dos testes.
Também foi implementado o elitismo, com seu valor definido em 3%, para
garantir que possíveis soluções ótimas não sejam eliminadas de uma geração
para outra.
Tamanho do Mapa
10 x 10
30 x 30
50 x 50
Tamanho do cromossomo
70
540
1500
Tabela 2: Relação Tamanho do Mapa x Tamanho do Cromossomo
Fonte: (APPOLINARIO E PEREIRA, 2007)
Outro problema encontrado foi que as soluções do algoritmo genético,
em certos momentos, apresentavam falhas e movimentos desnecessários.
Porém, estas soluções foram passadas adiante pois seu valor de fitness
sugeria que esta poderia ser uma solução cabível, como mostra a Ilustração 5.
Ilustração 5: Solução encontrada com movimento desnecessário
Fonte: (APPOLINARIO e PEREIRA, 2007)
Os Algoritmos Genéticos se mostraram como uma possível solução para
o problema de navegação em jogos eletrônicos, apresentando resultados
17
satisfatórios, além de tempos de resposta rápidos. Porém, em comparação
com o método de busca em árvore, seu desempenho foi consideravelmente
pior, tanto no tamanho das soluções, quanto no tempo de execução. Uma
possível resposta para agilização dos Algoritmos Genéticos pode estar na
hibridização, como afirma (APPOLINARIO e PEREIRA, 2007):
[...] pretende-se implementar um algoritmo híbrido, utilizando o
método de busca em árvore para a geração da população
inicial em vez de ela ser gerada aleatóriamente.
(APPOLINARIO e PEREIRA, 2007, p. 91)
4.2 Controle de Comportamento de Personagens
Neste tópico é abordado o uso de Algoritmos Genéticos no controle do
comportamento de personagens autônomos, explorando o jogo Último
Sobrevivente, descrito em Silva, Crocomo, e Andrade (2008).
4.2.1 Descrição do problema
O jogo analisado possui como cenário uma arena, onde o jogador
controla um cavaleiro e, usando sua espada, deve se defender contra o ataque
de 4 outros cavaleiros controlados pelo algoritmo, denominados NPCs (NonPlayable Characters ou Personagens Não Jogáveis), e ao final, eliminá-los
(Silva, Crocomo, e Andrade, 2008).
4.2.2 Representação do Problema
A arena adotada como cenário para o jogo, possui proporções de
570x600 pixels. A movimentação, tanto do jogador quando dos NPCs, se dá
em 8 direções, vertical para cima e para baixo, horizontal para a esquerda e a
direita e para as 4 diagonais. Cada cavaleiro possui uma quantidade fixa de
vidas e cada ataque realizado remove de maneira fixa um quarto do valor atual
da vida do outro cavaleiro (Silva, Crocomo, e Andrade, 2008).
Os comportamentos são adotados pelos NPCs de acordo com a
situação atual do jogo. São três possíveis valores para o comportamento: o
18
valor 0 faz com que o NPC fuja do jogador, o valor 1 faz com que o NPC vá em
direção a um aliado e o valor 2 faz com que o NPC persiga e ataque o jogador.
Duas informações servem de base para definir o comportamento do
personagem: o número de aliados presentes atualmente no mapa e a
quantidade de energia restante. Os níveis de vida podem variar de 0 até 2, em
que 0 representa o nível mais baixo de vida, 1 representa um nível
intermediário e 2 representa o nível mais alto de vida do NPC ou Jogador. A
relação entre estas informações é mostrada na tabela 3.
Vida
0
0
0
0
1
1
1
1
2
2
2
2
Amigos
0
1
2
3
0
1
2
3
0
1
2
3
Cromossomo (Saída)
2
1
2
2
0
0
1
0
2
1
2
1
Tabela 3: Relação Dados x Comportamentos
Fonte: (SILVA et al., 2008)
Se um NPC, por exemplo, tiver seu valor de vida com valor 0 e não
houver mais nenhum aliado, a ação que será realizada por esse NPC será a de
perseguir e atacar o jogador.
Neste caso, para formação dos cromossomos, foi utilizado um vetor
numérico de 12 posições, variando entre 0 e 2, chegando a um total de
531.441 possíveis cromossomos. O cromossomo representa as possíveis
ações dos NPCs, sendo assim, cada cromossomo pode ser considerado como
um personagem nesta situação. Para a função de fitness, o padrão utilizado
para definir as notas dos indivíduos foi de 5 pontos a mais para cada ataque
realizado, e de 2 pontos a cada 10 segundos nos quais o NPC esteja vivo. Em
contrapartida, 3 pontos são removidos da nota do indivíduo caso ele seja
atingido pelo jogador. A tabela a seguir mostra os dados relativos a uma
população qualquer:
19
População
Indivíduo 1
Indivíduo 2
Indivíduo 3
Indivíduo 4
Cromossomo
021002010001
010202210101
000000000000
112110111111
Aptidão
20
12
5
11
Tabela 4: Informações de uma possível população
Fonte: (SILVA et al., 2008)
Este jogo, assim como o estudo anterior, utiliza o elitismo para
resguardar, neste caso, apenas a melhor solução obtida em uma geração e
acelerar a convergência do algoritmo (Silva, Crocomo, e Andrade, 2008).
O jogo utiliza um processo de crossover um pouco diferente, chamado
crossover multiponto, o qual define não só um, mas vários pontos de corte ao
longo dos cromossomos selecionados, ocorrendo uma troca maior de
informações para geração do novo indivíduo, como é mostrado na ilustração 6.
A taxa de mutação foi fixada em 5% (SILVA et al., 2008).
Ilustração 6: Crossover Multiponto
Fonte: (SILVA et al., 2008)
4.2.3 Resultados
O comportamento dos NPCs evoluiu à medida que novas partidas foram
sendo realizadas, e também conforme o jogador assimilava suas estratégias.
Dois experimentos foram realizados, cada um contendo 80 partidas. No
primeiro, as notas atribuídas aos indivíduos da geração inicial foram muito boas,
porém à medida que o jogador assimilava as estratégias utilizadas, as notas
sofreram uma queda. Em seguida, já se adaptando às novas técnicas do
jogador, as notas voltaram a subir. O saldo final do jogador foi de 30 derrotas
contra 50 vitórias, sendo muitas delas em sequência. A Ilustração 7 demonstra
esta variação nas notas a cada geração do algoritmo.
20
Ilustração 7: Gráfico Aptidão x Geração do primeiro experimento
Fonte: (SILVA et al., 2008)
No gráfico, cada linha representa um personagem, apontando a variação
dos valores de aptidão a cada geração do algoritmo, esta sendo baseada nos
resultados do primeiro experimento.
O segundo experimento teve resultados mais balanceados, com o
algoritmo se adaptando ao comportamento do jogador com maior velocidade,
assim como as repostas do jogador, o que manteve as notas numa variação
menor. O saldo do jogador no segundo experimento foi de 54 derrotas e 26
vitórias que, diferentemente do primeiro experimento, foram distribuídas
uniformemente entre as partidas. A Ilustração 8 mostra o equilíbrio que se deu
durante o experimento.
Ilustração 8: Gráfico Aptidão x Geração do segundo experimento
Fonte: (SILVA et al., 2008)
21
Assim como no primeiro, o gráfico possui quatro linhas, uma para cada
NPC, mostrando o desempenho dos mesmos em cada geração do experimento
dois.
Além dos 3 comportamentos básicos definidos anteriormente, os NPCs
em alguns momentos, definiam estratégias inesperadas, pois não faziam parte
da programação inicial. Uma estratégia muito eficaz utilizada pelos NPCs foi a
de se agruparem para realizar um ataque concentrado ao jogador.
Ao adaptar a dificuldade nos jogos, alterando seu comportamento de
acordo com a habilidade do jogador, é mantido o interesse no jogo, pois o
adversário sempre apresenta um novo desafio, uma nova estratégia, que faz
com que o jogador tenha de se esforçar mais para derrotar seu oponente.
5 Aplicação proposta
O jogo utilizado como base para uma nova proposta de aplicação será o
jogo Pac-Man, aplicando o algoritmo genético nos fantasmas, controlando seu
comportamento. O objetivo do jogo é recolher todas as moedas, que dão
pontos ao jogador, presentes no mapa, sem que os quatro fantasmas, que são
os inimigos, o destrua através do toque do fantasma no personagem, exceto
se o jogador possuir o Power-up, que permite ao jogador destruir os fantasmas
por um curto período de tempo.
Será considerado um mapa 17x24 unidades, composto por paredes, que
são os obstáculos, moedas e Power-ups. Os valores atribuídos no mapa para
cada objeto são: -1 para obstáculos, 0 para espaços vazios, 2 para espaços
vazios com moedas, 3 para espaços vazios com Power-ups e 1 para a posição
inicial do Pac-Man.
A movimentação de todos os personagens se dá apenas nos sentidos
vertical e horizontal, sem movimentos diagonais. Para o comportamento dos
fantasmas foram definidos dois possíveis valores: 0 faz com que o fantasma
persiga o jogador em situação normal e o valor 1 faz com que o fantasma fuja
do jogador quando este tiver adquirido um Power-up, como mostra a Tabela 6.
Situação do jogador
Resposta do fantasma
22
Sem Power-up
Com Power-up
0
1
Tabela 6: Saída de comportamento dos fantasmas
A população, neste caso, será composta de apenas 4 indivíduos, um
para cada fantasma do jogo. Cada cromossomo será representado inicialmente
por um vetor de 8 posições, sendo que cada posição do mesmo pode variar
entre 0 e 1, conforme definido anteriormente e demonstrado na Tabela 5.
População
Indivíduo 1
Indivíduo 2
Indivíduo 3
Indivíduo 4
Composição do cromossomo
01001011
01011100
11010011
01011010
Tabela 5: Tabela de composição de indivíduos
A estratégia de fitness adotada, neste caso, atribui mais 5 pontos à
função de avaliação do cromossomo caso o fantasma consiga destruir o
jogador, e menos 3 pontos caso o jogador, possuindo o Power-up, consiga
destruir o fantasma. A taxa de mutação, inicialmente, será definida em 3%.
Também será aplicado o elitismo, neste caso, repassando apenas um indivíduo,
devido à pequena quantidade de indivíduos da população. O processo de
crossover utilizado será o padrão, gerando apenas um indivíduo.
23
6 Considerações Finais
Com base numa pesquisa bibliográfica, explorou-se um histórico da
Inteligência Artificial com seu foco direcionado para jogos eletrônicos. Também
foi possível desenvolver uma descrição do surgimento e os avanços realizados
na área dos Algoritmos Genéticos, principalmente baseados na teoria
darwiniana da evolução das espécies, em que o indivíduo mais bem adaptado
tem mais possibilidade de sobrevivência, assim como o desenvolvimento de
seus conceitos e processos.
As duas aplicações descritas neste trabalho mostram que os Algoritmos
Genéticos, no contexto de jogos eletrônicos, ainda têm seu uso restrito, pois
como ilustra o primeiro estudo, eles não obtiveram boa performance, o que
muitas vezes é necessário. Já no contexto de controle de comportamento, os
algoritmos se mostraram uma boa solução, pois se adaptam bem ao ambiente
de forma dinâmica e também encontram soluções inesperadas, o que se
assemelha em muitas vezes ao próprio comportamento humano, mantendo
assim o nível de diversão e adicionando um grau a mais de realismo aos jogos.
Como base para futuros trabalhos, foi proposta uma aplicação do
algoritmo em um contexto em que este não foi utilizado originalmente, no caso,
o jogo Pac-Man, fazendo o controle de comportamento dos personagens
considerados inimigos dentro jogo. Tendo sido definidos os parâmetros básicos
e as características necessárias para o desenvolvimento e funcionamento do
algoritmo, espera-se que possa ser obtido um resultado semelhante ao citado
anteriormente, aumentando a dificuldade do jogo e aumentando o realismo do
comportamento dos personagens.
Este trabalho traz então, como contribuição, uma aproximação inicial à
utilização dos Algoritmos Genéticos em jogos eletrônicos, abrindo caminho
para futuros trabalhos nessa área, seja na exploração teórica aprofundada,
seja na continuação da exploração de estudos de caso ou até mesmo na
implementação de personagens inteligentes.
24
7 Referências Bibliográficas
BATISTA, M. S., LIMA, S, M B, QUINTAO, P. L., DIAS, L., BATISTA, T. S. Um
Estudo Sobre a História dos Jogos Eletrônicos. Juiz de Fora: Faculdade
Metodista Granbery, 2007.
BUCKLAND, M. AI Techniques for Game Programming. Cincinnati, Ohio:
Premier Press, 2002.
CHAMPANDARD, A. J. Top 10 Most Influential AI Games. Disponível em
AiGameDev.com: http://aigamedev.com/reviews/top-ai-games/. Acesso em 22
de Julho de 2009.
GALLAGHER, M., E RYAN, A. Learning to Play Pac-Man: An Evolutionary,
Rule-based
Approach.
Disponível
em
http://www.itee.uq.edu.au/~marcusg/papers/CEC2003-1432.pdf. Acesso em 23
de Setembro de 2009.
GAMESPOT.
Disponível
em
Half-Life
1
HEV
Suit
Upgrade:
http://www.gamespot.com/users/hl20302/view_image?id=a9II4Bsi7hqY4R3knA.
Acesso em 23 de Setembro de 2009.
GROSKO, A. P., GORSKI, J. R., E DIAS, J. D. Algoritmo Genético: Revisão
Histórica e Exemplificação. Pontifícia Universidade Católica do Paraná, 2009.
HOLLAND, J. H. Genetic Algorithms. Disponível em Genetic Algorithms:
http://www.econ.iastaté.edu/tesfatsi/holland.GAIntro.htm. Acesso em julho de
2009.
LUGER, G. F. Inteligência Artificial: Estruturas e Estratégias para a
Solução de Problemas Complexos. São Paulo: ARTMED, 2004.
MARCZYK, A. Genetic Algorithms and Evolutionary Computation.
Disponível
em
The
TalkOrigins
Archive:
http://www.talkorigins.org/faqs/genalg/genalg.html#intro. Acesso em 19 de
Agosto de 2009.
MITCHELL, M. An Introduction to Genetic Algorithms. Cambrige: MIT Press,
1998.
MOLYNEUX, P. Postmortem: Lionhead Studios' Black & White. Disponível
em
Gamasutra:
http://www.jnoodle.com/careertech/files/postMortems/BlacknWhite.pdf. Acesso
em 23 de Setembro de 2009.
25
NERF US PLEASE, E. Inteligência Artificial em Jogos Eletrônicos.
Disponível
em
http://www.cin.ufpe.br/~ldsp/Semin%E1rio%20Agentes%20Aut%F4nomos/Sem
in%25E1rio%20Agentes.ppt. Acesso em 31 de Maio de 2009.
NILSSON, N. J. Artificial Intelligence: A New Synthesis. San Francisco:
Morgan Kaufmann Publishers, 1998.
PERALTY, D. EA Donates Original SimCity to OLPC Program. Disponível
em Geeks are Sexy: http://www.geeksaresexy.net/2007/11/09/ea-donatésoriginal-simcity-to-olpc-program/. Acesso em 23 de Setembro de 2009.
POSEY, S. Left 4 Dead DLC coming soon?. Disponível em The Videogame
Blog:
http://www.thatvideogameblog.com/2008/12/30/left-4-dead-dlc-comingsoon/. Acesso em 23 de Setembro de 2009.
RABIN, S. AI Game Programming Wisdom. Hingham: Charles River Media,
2002.
RUSSELL, S., E NORVIG, P. Inteligência Artificial - Tradução da Segunda
Edição. Rio de Janeiro: Editora Campus, 2004
SILVA, C. R. Uso de Algoritmos Genéticos como redutor de
dimensionalidade na classificação de imagens hiperspectrais. Disponível
em
http://dspace.c3sl.ufpr.br/dspace/bitstream/1884/4654/1/disserta_claudionor.pdf.
Acesso em 23 de Setembro de 2009.
APPOLINARIO, V. B., PEREIRA, T. L. Navegação autônoma em jogos
eletrônicos
utilizando
Algoritmos
Genéticos.
Disponível
em
http://redalyc.uaemex.mx/redalyc/pdf/810/81050108.pdf. Acesso em 23 de
Novembro de 2009.
SHI,
H.
Best-First
Decision
Tree
Learning.
Disponível
em
http://adt.waikato.ac.nz/uploads/approved/adtuow20070112.105857/public/01front.pdf. Acesso em 19 de Novembro 2009.
COMPUTAÇÃO, G. M. Busca em Árvores ou Grafos. Disponível em
http://www.computacao.gigamundo.com/2009/03/10/busca-em-arvores-ougrafos/. Acesso em 19 de Novembro de 2009.
SILVA, A. E., CROCOMO, M. K., E ANDRADE, K. O. Um Algoritmo Evolutivo
para a adaptação de NPCs em um jogo de ação. Disponível em
http://200.169.53.89/scgames/artigos/08980100008.pdf. Acesso em 20 de
Novembro de 2009.
26

Documentos relacionados

JOGOS EDUCATIVOS COMPUTADORIZADOS - Niee

JOGOS EDUCATIVOS COMPUTADORIZADOS - Niee Componentes de um Algoritmo Genético: • Indivíduos: cada solução parcial de um problema a otimizar está codificada em uma string, cada string é um indivíduo. • População: conjunto de indivíduos. • ...

Leia mais

Fazer o

Fazer o (registros). Neste contexto, a otimização de consultas assume grande importância pois nem sempre é possível agilizar as respostas às consultas através da criação de índices sem que isso afete o des...

Leia mais