COMPUTAÇÃO EVOLUTIVA APLICADA A JOGOS ELETRÔNICOS André Bezerra Lima, Daniel Oliveira Aguiar, Diego de Souza Sarkis Centro Universitário Nove de Julho / Depto. Exatas e Tecnologia, São Paulo, Brasil. andreb.lima@gmail.com, daguiar69@gmail.com, sarkis.diego@gmail.com, Resumo: Este artigo tem como objetivo estudar a viabilidade de aplicação de computação evolutiva em jogos eletrônicos, mais precisamente, a aplicação de Algoritmos Genéticos, que é uma adaptação computacional da teoria de Darwin sobre a evolução natural das espécies, em um jogo que consiste em um mapa com alguns obstáculos, no qual o computador precisa determinar um caminho para que o agente chegue à saída. Tennis (fig.2), e Hockey (fig.3) até o Playstation3, lançado pela Sony em 2006 e que assume 2º lugar nas vendas da sétima geração.[11] Palavras Chaves: Computação Evolutiva, Algoritmos Genéticos, Inteligência Artificial, Jogos Eletrônicos, Movimentação autônoma. 1. Introdução Os jogos eletrônicos evoluíram bastante desde a sua criação. Foram muitas as melhorias tanto na qualidade gráfica, que hoje chega a ser muito próxima da realidade, quanto na forma de processamento. O processamento da Inteligência Artificial em jogos é o foco deste trabalho com a aplicação da Computação Evolutiva em um jogo eletrônico. Implementando um Algoritmo Genético que é uma adaptação computacional da teoria de Darwin sobre a evolução natural das espécies, para movimentação autônoma de agentes. Para explicação de forma mais clara, na introdução são expostos os 3 tópicos abordados neste trabalho. Fig. 1 Odyssey 100, o primeiro console de videogame da história 1.1. Jogos Eletrônicos A Indústria de jogos representa hoje uma grande fatia do mercado, apesar de não ser tão explorado no Brasil quanto em outros países, mesmo apresentando um crescimento na indústria brasileira de jogos. [6] Criada inicialmente como nova forma de redefinição da televisão, ganhou identidade própria e se tornou um dos maiores meios de entretenimento e lazer. O primeiro jogo relatado foi em 1958, criado pelos Estados Unidos simulando um jogo de Tênis, onde um ponto piscando representava a bola e os jogadores controlavam seu movimento por cima de uma linha vertical que representava a rede. Desde então, aprimoramentos e novas idéias não pararam de surgir aliadas com a tecnologia. A história dos games está dividida em sete gerações e vai desde Odyssey 100 (fig.1), lançado em 1972 pela Magnavox que continha somente 2 jogos, Fig. 2 Pessoas jogando Tennis no Odyssey 100 Fig. 3 Jogo de Hockey no Odyssey 100 (jogos muito parecidos, tanto no visual quanto na jogabilidade) 1
O surgimento de jogos como Spacewar (fig.4) de Nolan Bushnell, responsável pela criação do Computer Space (fig.5), o primeiro arcade do mundo. Mais tarde Bushnell sai da empresa para fundar a Atari e logo lança o jogo Pong (fig.5), se tornando um fenômeno e campeão de vendas, surge então a primeira geração dos games. É nessa época que surgem as primeiras críticas aos jogos eletrônicos violentos. Como Death Race (fig.6), da Exidy Games, onde o objetivo do jogador é sair atropelando tudo o que vier pela frente. [6] Fig. 7 Death Race, responsável pelas primeiras criticas de violencia A década de 1980 é composta pela segunda e terceira geração. Space Invaders (fig.7) lançado para o Atari 2600. foi um marco. Fig. 4 Jogo Spacewar Fig. 8 Space Invaders, considerado um marco para industria de games Empresas como Mattel, Actvision e Nanco e Sega envestem em games e sucessos como Pac Man (fig.9) e Donkey Kong (fig.10) surgem. O meio da década é considerada um marco negro para os video games devido ao surgimento dos computadores como MSX (fig.11) que possuíam um custo quase equivalente. Fig. 5 Computer Space, primeiro arcade do mundo Fig. 9 Pac Man, um dos sucessos da 2º e 3º gerações Fig. 6 Jogo Pong para Atari 2
Fig 14 Bomberman Fig. 10 Donkey Kong, outro dos sucessos da 2º e 3º gerações Fig 11 MSX, responsável pelo marco negro dos games Nasce então no japão o console NES (fig.12) e com eles os jogos Star Soldier (fig.13), Bomberman (fig.14) e Adventure Island (fig.15). Fig. 15 Adventure Island Começa a se investir em jogos de computadores e é lançado a segunda versão do MSX, o MSX2, com melhores gráficos e RAM mínima de 64KB. Os jogos eram lançados em cartuchos, mas cópias de programas podiam ser encontradas em fitas cassetes e, depois, em disquetes. Com o aparecimento de jogos maiores que 64KB, os chamados MegaROMs, foram desenvolvidos periféricos específicos para acomodar todos os dados e permitir que as cópias rodassem sem sobressaltos. Mesmo com o surgimento do Master System da Sega, PC Engine da NEC e Atari 7800 da Atari, a Nintendo continuou dominando o mercado com o NES. O game, Super Mario Bros (fig.16) da NES, criado por Shingeru Miyamoto se torna febre. Na quarta geração, começou a guerra dos 16 Bits, são lançados os video games Mega Drive da Sega e Super NES da Nintendo e com eles, jogos como Super Mario World (fig.17), E-Swat, AfterburnerII, Street Fighter II (fig.18), Tartarugas Ninjas e Sonic (fig.19) criando filas gigantescas e rendendo fortunas.[6] Fig. 12 console NES, da Nintendo Fig. 13 Star Soldier Fig. 16 Super Mario Bros, febre responsável pelo inicio da 4º geração Fig. 17 Super Mario World 3
Fig. 18 Street Figther II Fig. 21 Tomb Raider Fig. 19 Sonic Acontece a primeira investida da Sony no mercado de videogames. Propondo o lançamento de um CD- ROM, para o console Super NES. O periférico melhoraria as capacidades gráficas e sonoras com o novo formato em CD, mas desfazem o projeto próximos da conclusão. Na quinta geração, com jogos de 32 e 64 bits e o surgimento dos jogos em 3D, juntos são lançados os consoles Playtation, Jaguar, 3DO e Nintendo 64, o sucesso foi inevitável. A quinta geração marcou com os jogos Super Mario 64 (fig.20), Tomb Raider (fig.21) e Final Fantasy VII (fig.22). Além de mais realismo e ação ao invés da fantasia, havia mais velocidade como nos jogos Sonic e Mario. Fig. 22 Final Fantasy VII Outros jogos importantes dessa época foram: Virtua Fighter, Daytona USA, Virtua Cop, Sega Rally Panzer Dragoon, NiGHTS into Dreams, Chrono Cross, Metal Gear Solid, Castlevania: Symphony of the Night, Tekken, Ridge Racer, The Legend of Zelda: Ocarina of Time, F-Zero X,GoldenEye 007, Banjo-Kazooie e Perfect Dark. A sexta geração de 128 bits é composta pelo Dreamcast da Sega, Playstation 2 da Sony, GameCube da Nintendo e um novo competidor que entrava no mercado: a gigante do software Microsoft, com o Xbox. A sexta geração foi marcada por jogos com excessiva violência e sexo como as séries Grand Theft Auto (fig.23), Resident Evil, Manhunt (fig.24), e NARC e pelo abandono do mercado brasileiro com jogos e consoles importados. Em 2005 com o novo console da Microsoft, o Xbox 360, começou a sétima geração e na sequencia foram lançados em 2006 pela Sony o Playstation 3 e Wii da Nintendo. Pela primeira vez na história dos video games, Sonic (SEGA) e Mario (Nintendo) estam juntos num jogo de video game. O jogo chamado Mario & Sonic at the Olympic Games(Nintendo Wii e Dreancast). [6] Fig. 20 Super mario 64 4
Fig. 23 Grand Theft Auto - GTA Fig. 24 Manhunt 1.1.1 Inteligência Artificial em Jogos Eletrônicos Inicialmente os jogos eletrônicos sempre seguiam certo padrão, tal fato desmotivava os desafiantes, com o passar dos anos, pessoas ligadas à área de Inteligência Artificial demonstraram interesse e até mesmo certa curiosidade em adaptação de melhorias em jogos. Isso ocorreu devido à área de jogos representar um bom domínio para a exploração da Inteligência Artificial, pois esta constitui uma tarefa estruturada (conhecimento de estados iniciais e finais) na qual é fácil medir o sucesso ou fracasso. Inicialmente, tinha-se a idéia de que a implementação de jogos não exigia grande quantidade de conhecimento e que podiam ser solucionados por uma busca direta a partir do estado inicial para a posição vencedora. Realmente os jogos são estruturados, porém de acordo com a complexidade destes a quantidade de conhecimento cresce rapidamente. No início dos anos 60, Arthur Samuel obteve êxito na criação do primeiro programa operacional significativo de jogos com uso de Inteligência Artificial. O programa jogava damas, e além de simplesmente jogar, ele aprendia com seus próprios erros e melhorava seu desempenho [7]. O termo IA em jogos" (ou Game AI ) é geralmente usado de forma muito ampla, variando desde a representação e controle de comportamento de personagens não controlados pelo jogador no jogo (nonplayer characters NPCs) a problemas de controle de mais baixo nível, que geralmente seriam considerados campo da teoria de controle. Os primeiros jogos que tentaram implementar uma certa inteligência" nos personagens controlados pelo computador o faziam de maneiras bastante precárias, através de regras estímuloresposta implementadas por meio de estruturas do tipo if-then-else dentro do código. Esta abordagem causava grandes problemas no caso de necessidade de alterações e não permitia grande flexibilidade. Percebeu-se rapidamente a necessidade de melhores técnicas de modelagem para a representação e controle do comportamento desses personagens, por exemplo, permitindo aos NPCs ter objetivos e incorporarem um estado interno que permita perseguir esses objetivos. [8] Hoje em dia existem diversos jogos que utilizam de técnicas de Inteligência Artificial. Tradicionalmente, desenvolvedores de jogos digitais fazem uso sempre de um mesmo conjunto de técnicas simples na implementação das funcionalidades de inteligência artificial em jogos, algumas das técnicas encontradas são: Máquinas de estado finito (Finite State Machines - FSMs) (Fig. 25) e Máquinas de estado fuzzy (Fuzzy Finite Sate Machines - FuSMs), que são basicamente um conjunto de estados e transições, usadas para representar comportamentos, bastante utilizadas em jogos em 1º pessoa. O algoritmo A* (A-Star) (fig.26), componente de uma técnica conhecida como pathfinding, bastante utilizada em jogos de estratégia, para calcular caminhos, algumas outras técnicas que podem ser chamadas de Artificial Life (A-Life), tais como comportamentos de movimentação que podem dar maior realismo para a movimentação, como exemplo de jogo que utiliza esta técnica, podemos citar Sim City (fig.27) e The Sims (fig.28). Dentre as técnicas mais atuais, podemos citar as redes neurais artificiais, que podem ser exploradas em jogos de futebol e Algoritmos Genéticos, tema desse artigo, que pode ser utilizado em jogos de corrida. Alguns jogos também fazem uso de árvores de decisão e regras de produção quando algum tipo de raciocínio sobre o mundo de jogo é necessário[9]. Fig. 25 Maquina de Estados Finita FSM 5
Fig. 26 Algoritmo A-Star em funcionamento Ano Jogo I.A. Utilizada 1952 OXO Busca em árvore 1974 Qwak e Pursuit Padrão de movimentação 1975 Gun Fight Padrão de movimentação 1978 Space Invaders Padrão de movimentação 1980 Pacman Padrão de movimentação com personalidade 1987 Jogos de esporte Sistemas Especialistas 1989 SimCity A-Life 1990 Herzog Wei Máquina de estados finita 1993 Doom Máquina de estados finita 1996 Battlecruiser Redes Neurais 3000AD 1998 Half Life Máquina de estados finita e scripts 2000 The Sims Máquina de estados Fuzzy e A-Life 2001 Black & White Redes Neurais e aprendizado por reforço 2002 Creatures A-Life (DNA digital) Quadro 1: Linha de tempo da IA em jogos. [3] 1.2. Evolução Natural das Espécies Fig. 27 Sim Cyti Fig. 28 The Sims No entanto, com o avanço dos jogos eletrônicos, técnicas mais avançadas vêm também sendo utilizadas. Este artigo explora a utilização de Computação Evolutiva, para resolução do problema de rota (caminhos), implementando um Algoritmo Genético para que o jogador (agente) encontre uma rota (solução) analisando os prós e contras da utilização desta técnica como Inteligência Artificial em Jogos. A teoria da evolução é baseada na idéia de que, especécies sofrem mutações ao longo das gerações levando ao surgimento de novas especies, ou seja, afirma que as espécies de animais e vegetais existentes na Terra não são imutáveis. Até o século XVIII a cultura ocidental entendia que a criação de qualquer espécia era ato Divino e era impossivel adimitir que a espécie humana percentia a ordem dos primatas ao invés de serem criados por sopro Divino. [12] Deus era responsável pela criação e tudo e cabia ao homem apenas dar o nome. [12] As descobertas eram adaptadas as crenças religiosas.[12] Quando começaram a ser descobertos ossos de dinossauros e outros animais extintos, explicações como ossos de animais que não conseguiram embarcar na arca de Noé e morreram no dilúvio foram dadas pelo sábio francês George Cuvier. De acordo com a história, um dos primeiros a discordar dessa idéia, foi o pesquisador francês Jean-Baptiste Lamarck que afirmava que as condições abientais unfluenciavam na modificação nas características dos individuos gerando um novo individuo. Dessa forma, segundo Lamarck, as condições de sobrevivencia de um individuo, faziam com que suas características sofressem alterações e consequentemente em seus descendentes: Os filhos de pessoas que tomassem muito sol, já nasceriam mais morenas ou a necessidade de peixes em respitar na atmosfera teria feito aparecer pulmões, fazendo com que os seu descendentes passassem menos tempo na agua, fazendo com que as brânquias dessaparecesse pela inutilização gerando assim uma nova espécie, diferente da primeira gerada. [12] Em 1859, Charles Darwin gerou grande impacto com a publicação do livro A origem das espécies que pôs em evidência a seleção natural no mecanismo da evolução. Darwin observou que existiam diferenças de 6
indivíduos entre a mesma espécie, porém constatou que na luta pela existência havia uma competição de individuos com capacidades diverasas e portanto os mais adaptados deixavam maior o numero de descendentes e assim afirmou que o processo evolutivo se dava por mutações e não por meio de esforços contínuos como acreditava Lamarck. Mutações eram alterações genéticas que surgiam com o acaso em determinados indivíduos de uma espécie. Dessa forma os herdeiros de individuos mais vantajosos, predominam nas gerações sucessivas, fazendo com que os tipos inferiores se existinguissem, ou seja, na evolução, nada se criava ou se reciclava, os organismos estavam sempre em um lento mas constante processo de mutação agindo através de um acúmulo de sucessivas variações favoráveis a sobrevivencia. Segundo Darwin [12], a seleção natural é baseda no fato de que os serem vivos sofrem mutações genéticas e podem passá-las para seus descendentes fazendo com que casa descendente coloque a prova sua herança genécia as condições ambientais em que são obrigadas a viver, e os mais fortes possam viver e passar a diante seus genes. Um exemplo são os peixes primitivos que não posiam tirar oxigênio diretamente da água, alguns passaram por mutações e se adaptaram melhor a vida aquática e hoje dominam os rios, lagos e oceanos. 1.3. Algoritmos Genéticos Os Algoritmos Genéticos são técnicas de busca e otimização que se baseiam na teoria de Darwin sobre a Evolução Natural das Espécies, nos princípios de seleção natural e da genética. [1] Os Algoritmos Genéticos aplicam os princípios de Darwin á modelos computacionais para encontrar soluções [4]. A evolução que as soluções sofrem, dependem de uma codificação entre elas. Na natureza, o cruzamento entre diferentes indivíduos ancestrais pode gerar superindividuos, tendo uma adaptação bem maior que seus pais. Desta forma que as espécies evoluem, tendo características adaptadas ao ambiente em que vive. Os Algoritmos Genéticos trabalham com uma analogia direta com a natureza. Iniciando com uma população de indivíduos, onde cada um representa a possível solução para o problema apresentado. Para cada indivíduo se associa um grau de aptidão, determinando a capacidade de competir com os outros indivíduos da população, quanto maior a sua aptidão mais chances ele tem de ser escolhido pra cruzar com outro individuo escolhido da mesma forma, desse cruzamento será gerado descendentes com as características dos indivíduos que se cruzaram. Quanto menor for à probabilidade do individuo, menor será a possibilidade de propagação das características desse individuo para as gerações futuras. Com isso se produz uma nova população que substitui à antiga atendendo melhor a solução. Assim ao longo das gerações, as melhores características se propagam, facilitando a exploração de áreas do espaço de busca. Quando os Algoritmos Genéticos são bem projetados é grande a possibilidade de encontrar uma solução valida próxima de uma solução ótima, se não uma propria solução ótima. Existem diferentes tipos de Algoritmos Genéticos, Algoritmos Genéticos Convencionais, Não Convencionais, Paralelos, entre outros. 1.3.1 Características Gerais Segundo [10]. Os Algoritmos Genéticos diferem em quatro pontos principais dos métodos tradicionais de busca e otimização: 1) Trabalham com uma codificação de conjunto 2) Trabalham com população 3) utilizam informações de custo e recompensa 4) utilizam regras probabilísticas Os princípios dos Algoritmos Genéticos são análogos aos princípios da teoria da evolução natural das espécies descritos por Darwin, sendo que o indivíduo mais adaptado (apto) a situação ou problema, tem maior chance de existir e fazer com que sua espécie perpetue, através da reprodução. A utilização de Algoritmos Genéticos como ferramenta para solução de problemas é a representação destes problemas, pois sua finalidade é uma melhor solução para o problema apresentado [10]. 1.3.2 Codificação Consiste na seleção dos indivíduos para determinado problema. Primeiramente existe o problema a ser resolvido, a partir deste e, a partir de um indivíduo (parâmetro/gene), gera-se uma população aleatória (cromossomos) de indivíduos que podem ser a solução para o problema. As 4 características fundamentais dos Algoritmos Genéticos, são citadas abaixo; Função de avaliação: Para esta característica ntende-se como a avaliação das habilidades e aptidão de cada cromossomo (população) para determinado problema. Após a criação aleatória dos indivíduos são avaliadas suas aptidões e os melhores, têm maiores chances de serem perpetuados através da reprodução. Convergência prematura: conseqüência de má formação do modelo dos genes bem adaptados, mas não ótimos, podem rapidamente dominar a população. Quando isto ocorre, são eliminadas as possibilidades de busca por melhores soluções para o problema, pois o algoritmo se converte ao azar. Finalização lenta: neste acontece ao contrário do anterior, pois ao longo de muitas gerações a população haverá convergido, mas não localizado o máximo local. Reprodução: Escolha dos melhores indivíduos para o cruzamento e reprodução criação da nova população sucessivamente, até se obter a solução satisfatória do problema. Convergência: Progressão uniforme; quando um Algoritmo Genético é devidamente implementado favorece na evolução da população e perpetuação das espécies, resultando numa solução válida. 7
Para um Algoritmo Genético ser desenvolvido basicamente os passos são; criação alguns parâmetros, tais como quantidade de gerações, tamanho da população, tamanho da cadeia de bits para cada individuo, taxa de mutação, taxa de permanência na população, quantidade de cruzamentos e condição de parada, a definição da função de avaliação, a forma de reprodução e mutação. Tendo todos esses passos finalizados inicia-se o desenvolvimento do Algoritmo Genético da seguinte forma: uma população inicial é gerada aleatoriamente, após ser criada, a mesma é avaliada, escolhem-se os melhores indivíduos (que obtiveram a melhor nota) para o cruzamento, realizamse as mutações necessárias definidas, gera-se a nova população e o processo de avaliação é realizado novamente, geralmente o programa fica em loop, até que a condição de parada seja satisfeita, geralmente não se usa uma solução válida como condição de parada, mas dependendo da utilização a primeira solução valida é o suficente. A Figura 29 representa o fluxo de funcionamento de um Algoritmo Genético. utilizada uma ferramenta chamada Blitz3D (Fig.30). O Blitz3D é uma ferramenta de desenvolvimento, focada no desenvolvimento de aplicações multimídia em geral (2D e 3D), com uma linguagem de programação derivada do Basic. Fig.30 Ambiente de desenvolvimento do Blitz3D Para efeito de testes, foi utilizado um mapa de 20 x 15 células (Fig.31), onde cada obstáculo assim como a saída, o ponto de partida, o ambiente disponível para movimentação e o próprio jogador (agente) possuíam dimensões de 40 x 40 pixels, assim formando um mapa de 800 x 600 pixels. Fig.31 Mapa de teste 20 x 15 (800 x 600 pixels) Fig. 29 Processo básico de funcionamento de um Algoritmo Genético. 2. Metodologia O mapa de teste é um simples arquivo BMP, confeccionado num editor simples de imagem (Paint Brush). Para as tarefas de movimentação e avaliação dos indivíduos utiliza-se uma matriz (Fig.32), gerada a partir da imagem BMP do mapa. No carregamento do mapa para a matriz, foram armazenados todos os espaços disponíveis para movimentação, mapeado todos os obstáculos, a posição inicial do jogador (agente) e o destino (saída). Com base no conhecimento adquirido em pesquisas, (artigos, dissertações, monografias, entre outros), foi desenvolvido um jogo consistindo num labirinto, onde o computador, através de um jogador (agente), precisa chegar à saída do mapa (ambiente) sem colidir com os obstáculos. Para isso foi utilizada uma técnica fundamentada em Algoritmo Genético como técnica de Inteligência Artificial para conseguir com que o agente chegasse à saída. No desenvolvimento do jogo foi Fig.32 Matriz do mapa gerada pelo programa a partir da imagem que descreve o ambiente. 8
Para interpretação da matriz pelo programa, foram definidos alguns números inteiros como representações de elementos do mapa de forma que, onde o programa encontra um inteiro 1 significa que o indivíduo (agente) não pode passar, pois trata-se de um obstáculo. Onde encontra um 0 pode-se realizar movimentos normalmente, o inteiro 5 representa a posição inicial do jogador (agente) e o inteiro 9 representa o destino (meta). Até agora foi abordado o funcionamento inicial do programa, consistindo nas etapas de carregamento do mapa em BMP para uma matriz e reconhecimento do mesmo (obstáculos, espaços disponíveis para movimentação, posição inicial e destino do agente). Para o desenvolvimento do Algoritmo Genético, foi criada uma população inicial, composta por N indivíduos, sendo que cada indivíduo podia realizar P passos, e reproduzirem-se entre si por G gerações. Cada indivíduo possui algumas características próprias que passam de geração para geração. Na genética, as características envolvem genes e cromossomos, os cromossomos são constituídos de alelos. Damos uma importância elevada ao cromossomo e aos seus alelos, pois estes fazem parte de um Algoritmo Genético e como não poderia deixar de ser, também fazem parte do nosso desenvolvimento. Em um Algoritmo Genético, um indivíduo possui um cromossomo representado por um conjunto binário (cadeia de bits) onde cada elemento da cadeia representa um alelo (Fig.33). Utilizamos esta cadeia de bits para representar os passos possíveis para os indivíduos da população. Cada par de alelos representa a direção do passo do individuo, de forma que, quando o par obtido é; 01 entende-se um movimento para baixo, 11 um movimento para cima, 10 um movimento para direita e 00 um movimento para esquerda, desta forma, para que um individuo realize 100 passos, seu cromossomo deve possuir obrigatoriamente 200 alelos. Na criação do cromossomo foi utilizado um mecanismo que sorteia aleatoriamente um número 0 ou 1 para um alelo. A figura 7 ilustra a representação de 1 cromossomo e os passos, separados de 2 em 2 alelos. Passos Filho1 Filho 2 Filho 3 Filho 4 Filho 5 Filho 6 Fig.34 Reprodução utilizada no desenvolvimento do Algoritmo Genético Para cada individuo foi dada uma nota, que foi interpretada pelo programa como nota de aptidão da seguinte forma; usa-se o total de passos validos PV dividido pela Distância Euclidiana DE, que nada mais é que à distância a qual o jogador (agente) ficou do destino ao chegar ao final de sua avaliação, dada pela equação 1. DE = ( x u) ² + ( y v)² Equação 1 Fórmula para cálculo da distância euclidiana Após processar e avaliar todos os indivíduos, são selecionados 6% dos indivíduos que apresentam o melhor desempenho (maior nota) para realizarem o cruzamento, desses 6% os 4 melhores indivíduos permanecem na população para fazerem parte da próxima geração, ou seja, fazem parte da próxima geração os indivíduos Elitistas que são os 4 melhores e os filhos gerados a partir do cruzamento dos 6% dos melhores indivíduos. Após esse processamento, caso a próxima geração ainda não atinja o total de indivíduos da população, realiza-se a mutação de alguns indivíduos. A mutação no Algoritmo Genético consiste na troca aleatória de bits, 1 por 0 e 0 por 1 (Fig.35). A mutação foi realizada da seguinte forma, foi definida uma porcentagem de mutação, onde se multiplicou o tamanho da população pela quantidade de alelos e pela taxa de mutação e dividiu-se por 100. (Equação.2). Antes Depois Antes Depois Fig.33 Representação do cromossomo e os seus alelos (passos) Para reprodução no Algoritmo Genético, foi adaptada uma forma de reprodução, na qual se gera, para cada cruzamento 6 filhos, cada filho apresenta as seguintes características do individuo 1 e do individuo 2 respectivamente 25% e 75%, 50% e 50%, 75% e 25%, e do individuo 2 para o individuo 1 respectivamente, 25% e 75%, 50% e 50%, 75% e 25%, (Fig.34). Antes Depois Fig.35 Ilustração do cromossomo de 3 indivíduos sofrendo mutação TP A TM M = 100 Equação 2 Formula para calculo do total de mutações 9
TP Tamanho da população A Quantidade de Alelos TM Taxa de Mutação M Quantidade de Mutações Quadro 2 elementos da Equação 2 Para finalização do Algoritmo Genético (condição de parada do programa), não foi considerado o primeiro individuo solução valido, uma vez que um outro ou alguns outros indivíduos da mesma ou de próximas gerações podiam apresentar um melhor resultado, o funcionamento do Algoritmo Genético foi realizado com um Loop considerando a quantidade de gerações. Inicio Gera a população Inicial Geracao_Atual <- 1 Enquanto Geracao_Atual < Geracoes Avalia os indivíduos Seleciona os Melhores indivíduos Realiza o Cruzamento entre os melhores Realiza a Mutação Geracao_Atual <- Geracao_Atual + 1 Fim enquanto Exiba na tela o tempo utilizado para o....processamento Se houveram indivíduos soluções Exiba as soluções encontradas Fim se Fim Portugol utilizado para representação do Programa (Algoritmo Genético) 3. Análise dos Resultados Após a finalização do desenvolvimento, o Algoritmo Genético foi executado, para obtenção dos resultados, no mesmo computador utilizado para desenvolver o mesmo, o qual apresenta a seguinte configuração: Processador Intel Pentiun 4, CPU 2,66 GHz. Memória 512 MB DDR II Placa de Vídeo G - Force FX 5200 Resolução 800 x 600, 32 Bits de Cor Foram realizados 120 testes variando o tamanho da população, a quantidade de gerações e a quantidade de passos possíveis por individuo. Os resultados dessa simulação podem ser observados na Tabela 1. Tabela 1 Resultados Observados Indivíduos Gerações Passos Solução 80 100 40 30% 80 100 50 90% 80 120 40 50% 80 120 50 100% 90 100 40 30% 90 100 50 90% 90 120 40 40% 90 120 50 100% 100 100 40 30% 100 100 50 90% 100 120 40 60% 100 120 50 100% Através dos resultados obtidos na Tabela 1, pode-se observar que os melhores resultados foram obtidos utilizando-se uma quantidade de 61% a mais de passos alem do necessário para atingir o estado meta (saída), considerando uma solução ótima (31 passos). Para todos os indivíduos solução, em todos os cenários acima testados houve realização de movimentos desnecessários. Tentando resolver esse problema, foram realizadas algumas execuções do programa com quantidade de passos cada vez menor, onde percebeu-se a dificuldade de encontrar solução com uma quantidade de passos inferior a 45. De 45 a 50 passos foi possível encontrar soluções, de 40 a 45 passos, raramente encontrava-se solução. Já com quantidade de passos inferior a 40, pelos nossos testes, foi possível encontrar soluções numa proporção de 1 execução valida, com pelo menos 1 individuo solução para 180 testes, mesmo a quantidade de passos necessários sendo apenas 31. Outro teste foi realizado tentando encontrar mais soluções com 40 passos variando a quantidade de gerações, foram testadas as seguintes quantidades de gerações: 150, 200, 250, 300, 350 e 400. O tempo de processamento foi aumentando a cada teste, no ultimo o tempo de processamento chegou a 2,186 segundos e os resultados foram respectivamente 0,8%, 1,2%, 1,9%, 2,4%, 3% e 5% de sucesso, encontrando pelo menos 1 individuo solução. O Gráfico 1 mostra o aumento na quantidade de indivíduos solução proporcionalmente ao aumento de gerações. Gráfico 1 - % de Soluções x Gerações 10
O aumento do tempo de processamento decorrente ao aumento de gerações, também foi algo relevante, para o desenvolvimento do Algoritmo Genético. Gráfico 2 - Tempo x Gerações Alem dos testes mencionados até o momento, foram elaborados mais dois mapas diferentes, com uma necessidade diferenciada de passos para chegar à saída. Para o mapa ilustrado na Figura 36, foram realizados 10 testes utilizando uma quantidade de 61% a mais de passos além do necessário para atingir o estado meta (saída), considerando uma solução ótima, ou seja 36 passos. Para esse teste houve 100% de soluções. Foram também realizados testes com uma quantidade de 45% a mais de passos, porém nesse teste houve um aproveitamento 60%. Fig. 36 Mapa alternativo utilizado para mais testes Para o último mapa (Fig. 37), foram realizados os mesmos tentes anteriores, com 61% e 45% de passos além do necessário e os resultados foram respectivamente, 100% e 70% de soluções. Para o mapa ilustrado na figura 10 apenas 9 passos válidos resolveriam o problema com uma solução ótima, porém com apenas 9 passos (18 alelos/bits na cadeia), não foi encontrada nenhuma solução em 30 testes, algo curioso que pensamos no momento desse teste foi, como o Algoritmo Genético se comportaria com 30, 50, 100 passos?. Com o surgimento dessa questão foram realizados mais testes e os resultados foram como imaginamos. Para 30 passos o processamento conseguiu um único resultado valido, com alguns passos desnecessários. Houve um aproveitamento de 90% e com 50 passos, verificou-se o aumento da quantidade de passos desnecessários. A porcentagem de aproveitamento diminuiu para 30%. Com 100 passos, neste caso foi observado que apesar da quantidade de passos aumentar grandiosamente a porcentagem de aproveitamento caiu para 0%. O Algoritmo Genético se perdeu no mapa. 4. Discussão Para a implementação do Algoritmo Genético, dentre as diversas variações do mesmo, escolhemos para testes o Algoritmo Genético Convencional. Alguns pontos foram explorados e alterados no desenvolvimento, um deles relacionando ao Cruzamento (Crossover). Para efeito de estudo, procuramos aprofundar, um pouco mais na Biologia, utilizando a idéia de que, na reprodução de dois indivíduos existem combinações que determinam algumas características do pai ou da mãe, tal como a cor dos olhos. Essas combinações referem-se aos Genes Recessivos e Genes Dominantes, AA, Aa, aa, aa. Como não encontramos nos materiais pesquisados uma implementação de Algoritmo Genético na qual o cruzamento envolvesse estas combinações biológicas de Genes, escolhemos utilizar esse processo de cruzamento. (Fig. 34) Todo material relacionado a Algoritmo Genético que encontramos nas pesquisas tratava do assunto Reprodução. Alguns tratavam da reprodução de um filho baseado em 50% das características de um indivíduo, que poderia ser entendido como sendo o pai, e 50% do outro indivíduo que poderia ser entendido como sendo a mãe, gerando assim 2 filhos novos (Fig.38). [2] Individuo 1 Individuo 2 Filho 1 Filho 2 Fig.38 Ilustração da reprodução com 50% de características dos pais Fig. 37 Mapa alternativo utilizado para mais testes Outros tratavam da reprodução partindo de um corte aleatório gerando 2 novos indivíduos (Fig.39). Para essa reprodução, selecionava-se um ponto de corte qualquer do cromossomo e a partir deste ponto selecionado 11
gerava-se os filhos, até o ponto de corte, copiava-se as características de 1 individuo, do ponto de corte em diante completava-se os bits faltantes com os bits do individuo 2. [5] Individuo 1 Individuo 2 Filho 1 Filho 2 Fig.39 Ilustração da reprodução com ponto de corte aleatório Sobre a mutação, como na natureza, uma mutação qualquer que seja, pode ser benéfica ou maléfica. No Algoritmo Genético isso também acontece. A parte benéfica é que se pode trocar um ou mais bits, de modo que os passos antes inválidos tornam-se válidos. Com uma mutação nesse nível a distância euclidiana diminui, fazendo assim a nota do individuo ser alta. A parte maléfica é que devido ao fato da mutação ser aleatória, pode-se destruir um filho possivelmente bom que poderia ser uma solução válida. Quanto a forma de avaliação, esta foi escolhida para ser realizada através de uma matriz, pois na primeira fase de desenvolvimento, quando foi utilizada diretamente a imagem do mapa para realizar a avaliação dos indivíduos, o tempo de processamento, apesar de não estar demorado, (em torno de 0,167) segundos para resolução do caminho (problema), com uma população de 80 indivíduos, com 100 passos por indivíduo e 100 gerações, com o incentivo, as idéias e alguns desafios propostos pelo nosso professor orientador Sidnei Alves de Araújo, resolvemos então alterar a forma de processamento para a movimentação dos indivíduos. Depois de alterada a programação do Algoritmo Genético para utilizar a matriz do mapa, o mesmo teste apresentou um resultado com 0,037 segundos. Se pararmos para analisar, não há uma diferença tão grande entre as duas soluções para nós, porém num jogo com diversos agentes tendo de ser processados simultaneamente, o tempo de processamento vai aumentando, e num jogo que necessite de respostas imediatas, um processamento demorado torna-se inviável e como o objetivo desse artigo foi estudar a viabilidade de aplicação em jogos eletrônicos, onde puder reduzir o tempo de processamento, faremos o possível e o impossível para reduzir. Para trabalhos futuros, pretendemos adaptar ao Algoritmo Genético mais 4 possibilidades de passos, diagonal superior direita, diagonal superior esquerda, diagonal inferior direita e diagonal inferior esquerda, aumentando o cromossomo (cadeia de bits), mas ficando ainda mais próximo da realidade de um jogo. Juntas com algumas idéias novas quanto às formas de reprodução, avaliação e mutação. Além da implementação num possível cenário tridimensional (3D) com interatividade do jogador (personagem) para com os agentes (inimigos). 5. Conclusão O uso de Algoritmo Genético mostrou-se útil para resolução de alguns tipos de problemas. Observou-se que a variante mais agravante para a solução é a quantidade de gerações necessárias para convergir. Aliado a essa agravante, podemos citar a quantidade de passos necessários para se obter 100% de aproveitamento (soluções), que deve ser 61% a mais da quantidade necessária para solução ótima, mas o Algoritmo Genético mostrou resultados validos com uma porcentagem menor, porém não obteve 100% de aproveitamento (soluções). Outra observação foi a extrapolação de passos, uma quantidade demasiadamente grande ou desnecessária, além de prejudicar o processamento, tende a não conseguir convergir, devido ao fato do Algoritmo Genético se perder no mapa. Dessa maneira, dependendo do tipo do jogo, a utilização do AG como técnica de Inteligência Artificial não é viável, tanto na quantidade de tempo gasto quanto na necessidade de uma solução. Já imaginou um jogo no qual você precisa enfrentar um inimigo, mas ele não chega a você, pois o algoritmo responsável pela Inteligência do jogo não consegue encontrar uma solução? Outra consideração é quanto à utilização. Quando se necessita descrever o caminho percorrido para se chegar ao estado meta o Algoritmo Genético não é a técnica de Inteligência Artificial mais propícia, uma vez que para um Algoritmo Genético diferentemente de outros algoritmos de Inteligência Artificial, (por exemplo, árvores de busca), que criam o caminho no momento de avaliação, já avaliando o caminho, caso encontre uma falha, descarta o resultado. Por outro lado os Algoritmos Genéticos realizam uma busca em feixe os caminhos são providos através dos operadores genéticos, assim sendo, no momento da avaliação, os caminhos já existem (um caminho por individuo), realizando uma busca em feixe, ou seja, varias soluções ao mesmo tempo. 6. Agradecimentos Os autores agradecem a Deus pela sabedoria concedida. Agradecem também às seus familiares, e namoradas pela compreensão e pela ajuda no desenvolvimento desse artigo. Por ultimo, mas não menos importante, alias o mais importante, o Professor orientador, Sidnei Alves de Araujo, pela sua paciência, pelas suas idéias, criticas, sugestões e desafios. 7. Referências [1] LINDEN, Ricardo, Algoritmos Genéticos, Editora Brasport, 2006 [2] UNIDEV, Site Internet: www.unidev.com.br, acessado em 10/2007 [3] KISHIMOTO, André Inteligência Artificial em Jogos Eletrônicos, 2007 12
[4] OCHI, Luiz Satoru Algoritmos Genéticos: Origem e Evolução, 2007 [5] APPOLINARIO, Vitor Borgatto, PEREIRA, Thompson Laureano Navegação Autônoma em Jogos utilizando Algoritmos Genéticos [6] ABRAGAMES, Associação Brasileira das Desenvolvedoras de Jogos Eletrônicos, site da internet, http://www.abragames.org, acessado em 05/2008 [7 ] Acontecimentos Importantes para Inteligência Artificial, Instituto Superior de Engenharia do Porto http://www.gecad.isep.ipp.pt/nr/rdonlyres/ A155E746-761E-4C13-803B4CCC4F40E63/37/ Acontecimentos_Importantes_IA.pdf, Acessado em 05/2008 [8] KARLSSON, B. F. F. Um Middleware de Inteligência Artificial para Jogos Digitais, Dissertação de Mestrado - Pontifícia Universidade Católica do Rio de Janeiro, 2005 [9] Perucia, Alexandre Souza; Berthén, Antonio Córdova; Bertschinger, Guilherme Lage; Menezes, Roberto Robeiro Castro. Desenvolvimento de jogos eletrônicos. São Paulo: Novatec, 2005 [10] Algoritmos Genéticos, Site Internet: http://www.icmc.sc.usp.br/~andre/research/genetic /index.htm, acessado em 03/2007 [11] HIGH-DEF DISC NEWS, site da internet http://www.highdefdigest.com/news/show/industr y_trends/sony/playstation_3/ps3_holiday_sales _Total_1.2_Million/1343 Acessado em 05/2008 [12] Charles Darwin Origem das Espécies - Col. A Obra Prima de Cada Autor - Série Ouro. Martin Claret 1859 / 2004 13