A UTILIZAÇÃO DE ALGORITMOS GENÉTICOS NO DESENVOLVIMENTO DE JOGOS Jonatan Medina (Bolsista PIBIC-UEMS), Raquel Márcia Müller (Orientadora) Universidade Estadual de Mato Grosso do Sul Cidade Universitária de Dourados, Caixa postal 351, CEP: 79804-970 [email protected] , [email protected] RESUMO Um algoritmo genético pode ser definido como uma técnica utilizada para encontrar soluções aproximadas em problemas de otimização e busca, pertencente à classe de algoritmos evolutivos. Um algoritmo genético envolve conceitos típicos da lei da evolução em biologia, como hereditariedade, mutação, seleção natural e recombinação. Algoritmos Genéticos têm sido bastante utilizados em jogos de tabuleiros como “Damas” e “Xadrez”. Seguindo este conceito foi desenvolvido um jogo de tabuleiro, onde o agente inteligente é um AG, gerando populações e utilizando operadores genéticos, como mutação e grau de adaptação. Os resultados obtidos foram satisfatórios, mostrando que os AG’s satisfazem as necessidades de um agente inteligente da melhor maneira possível, com isso podemos concluir que os AG’s são ótimos em problemas que não conhecemos de antemão a jogada de um adversário. Palavras – Chaves: Inteligência Artificial. Computação Evolutiva. Evolução ABSTRACT A genetic algorithm can be defined as a technique used to find approximate solutions in problems of optimization and search, belonging to the class of evolutionary algorithms. A genetic algorithm involves concepts typical of the law of evolution in biology, such as heredity, mutation, natural selection and recombination. The Genetic Algorithms has been widely used in board games like "Ladies" and "Chess". Following this concept was developed a board game, where the intelligent agent is an AG, generating populations and using genetic operators such as mutation and degree of adaptation. The results were satisfactory, showing that the AG's meet the needs of an intelligent agent the best possible way and we can conclude that the AG's are in great trouble we do not know in advance the move of an opponent. Words – Keys: Artificial Intelligence. Evolutionary Computation. Evolution 1. INTRODUÇÃO Um algoritmo genético pode ser definido como uma técnica utilizada para encontrar soluções aproximadas em problemas de otimização e busca, pertencentes à classe de algoritmos evolutivos (Goldberg, 1989). Um algoritmo genético envolve conceitos típicos da lei da evolução em biologia, como hereditariedade, mutação, seleção natural e recombinação. De forma mais simplificada, pode-se afirmar que algoritmos genéticos são utilizados para buscar uma solução ótima para um dado problema. Em computação, algoritmos genéticos são implementados simulando-se uma população de soluções que, ao decorrer de seu desenvolvimento, passa por melhorias, evoluindo a cada ciclo (Norving & Russel, 1995). A partir daí são criadas uma nova seqüência de soluções para dar início à fase de evolução; a cada geração há uma adaptação da população, havendo mutações e recombinações em alguns individuos dessa geração, criando-se, assim, uma nova população. Quando se cria uma nova população esta é usadas para uma próxima interação do algoritmo. Um algortimo genético segue quatro etapas básicas: 1. Uma função, um objetivo, que é o objeto para a otimização. A grande vantagem de algoritmos evolutivos, é que não é necessário saber para que serve esta função, apenas é preciso tê-la disponível para ser aplicada nos indivíduos, podendo assim, comparar os melhores resultados. 2. A evolução, próximo passo do algoritmo, geralmente usa, nessa parte, a seleção por roleta, onde os indivíduos são ordenados de acordo com sua função e objetivo e são atribuídos a eles probabilidades decrescentes de serem escolhidos. A escolha é feita de forma aleatória, de acordo com essas probabilidades. Dessa forma conseguimos escolher como pais os mais bem adaptados, sem deixar de lado a diversidade dos menos adaptados. Pode-se tambem utilizar outras formas de seleção, apesar dessa ser a mais apta. 3. A reprodução é divida em três subcategorias: acasalamento, recombinação e mutação. Há a escolha de dois induvíduos para se reproduzirem (acasalamento), partindo do conceito de recombinação, um processo que imita a reprodução sexuada. Os decendentes recebem parte do código genético dos pais, garantindo assim que os melhores indivíduos possam trocar, entre si, informações que os levam a ser mais aptos à sobreviver, gerando assim, indivíduos sem defeitos em seus códigos genéticos. 4. Por último, vêm as mutações, que são feitas com probabilidade a mais baixa possível, e tem como objetivo permitir maior variabilidade genética na população, impedindo que a busca fique estagnada em um mínimo local. As partes mais importantes de um algoritmo genético são o cruzamento e a mutação, pois todo o desempenho de um algoritmo genético depende desses operadores. Algoritmos genéticos têm sido usados no desenvolvimento de diversos jogos. Através deles, o jogador pode, por exemplo, traçar caminhos por onde um objeto do jogo deve “caminhar”. Este caminho pode ser determinado por um algoritmo genético. Dentre alguns exemplos de jogos que utilizam algoritmos genéticos, pode-se citar: − o jogo mastermind, em que um jogador tem que adivinhar uma seqüência de cores definida pelo adversário; − o puzzle pentominos, onde o problema pode ser resolvido em cerca de 50.000 avaliações feitas em poucos minutos; − em jogos de xadrez, o problema n-queens é freqüentemente utilizado para testar o desempenho de algoritmo genético, especialmente devido ao fato da sua complexidade ser regulada pelo número de rainhas que se utilizam. Devido à sua flexibilidade os algoritmos genéticos têm sido utilizados em diversas áreas de atividade com maior ou menor sucesso dependendo da facilidade de adaptação dos problemas a este tipo de algoritmo. Sua escolha para aplicação em jogos educativos se justifica pelo fato de jogos educativos computadorizados possuírem, como uma de suas principais vantagens, um grande potencial para o processo de ensino e aprendizagem, por despertarem naturalmente o interesse dos alunos. 1.1. Objetivos O objetivo geral dessa proposta de pesquisa é o estudo de algoritmos genéticos que possam ser utilizados no desenvolvimento de jogos educativos ou de tabuleiro e o desenvolvimento de um jogo simples usando um dos algoritmos pesquisados. Os objetivos específicos são: − Pesquisar e definir os conceitos que envolvem algoritmos genéticos; − Pesquisar e definir etapas que envolvem o desenvolvimento de um jogo educativo; − Pesquisar os algoritmos genéticos que podem ser utilizados no desenvolvimento de jogos educativos; − Desenvolver um jogo educativo, exemplificando toda a sua funcionalidade. As atividades desta pesquisa podem ser divididas em duas etapas: fundamentos e desenvolvimento de software. Em fundamentos, estudaremos os conceitos, teorias, algoritmos e métodos computacionais necessários ao desenvolvimento do jogo educativo. A metodologia adotada nesta etapa envolve, basicamente, o estudo dos conceitos, teorias, algoritmos e métodos relacionados ao tema da pesquisa: algoritmos genéticos e desenvolvimento de jogos educativos. Estes estudos serão baseados em consultas à literatura especializada, ou seja, livros e artigos de revistas técnicas, bem como consultas a sites da Internet. A metodologia utilizada na etapa de e desenvolvimento do jogo será baseada nas etapas propostas por Clua (2005): • Design Bible. Nesta etapa são definidas as especificações do jogo. Deve ser composto dos seguintes elementos: 1. Roteiro. Semelhante ao roteiro de um filme. Este é um item fundamental para o processo de criação e será o elemento crucial para convencer possíveis investidores da potencialidade do produto. É nesse item que o jogo deve mostrar seu diferencial em relação aos outros. Devem ter espaço para interferência do usuário no desencadeamento da história. Ao elaborar o roteiro deve-se considerar qual o estilo do jogo será desenvolvido. 2. Game Design. É a conceituação artística do jogo. Preferencialmente deve ser escrita por um artista. Dentro deste item deverão ser expostos quais as principais características dos cenários, esboços de personagens, descrição das texturas fundamentais, mapas e descrições das fases (também denominado de level design). 3. Game Play. Nesta parte do documento deve descrever-se como será a jogabilidade. Por jogabilidade entendem-se as regras do jogo e o balanceamento das regras (game balancing). Nesta descrição deve ficar claro que o jogo é divertido e irá proporcionar desafios interessantes. 4. Interface Gráfica. Pode-se dividir a interface em ingame e outgame. A primeira consiste na instrumentação disponível durante o jogo e é responsável pela entrada de dados do jogador para a aplicação. A interface outgame é a forma de apresentar a introdução do jogo, sua configuração, instruções, carregar um jogo salvo anteriormente, entre outras operações de suporte. • Produção de áudio e imagens 2D. Nessa etapa faz-se uso de ferramentas para a produção de efeitos sonoros (áudio) e para a composição de imagens bidimensionais, que serão usadas como texturas e para compor a interface gráfica ingame e outgame, tais como, botões, janelas, barras de energia e outros componentes gráficos. • Definição do Engine. O engine é um componente de software responsável por lidar com o hardware gráfico, controlar os modelos para serem renderizados, tratar as entradas de dados do jogador, tratar de todo o processamento de baixo nível e outras coisas que o desenvolvedor de jogos normalmente não deseja fazer ou não tem tempo para se preocupar. • Integração dos aspectos artísticos com os aspectos computacionais. 2. FUNDAMENTAÇÃO TEÓRICA 2.1. Inteligência Artificial O cérebro humano é a parte mais magnífica do corpo, uma massa acinzentada, composta em sua maioria por água, é capaz de em milésimos de segundos, tomar decisões, enviar comandos a todos os membros do corpo, guardar lembranças, distinguir emoções, entre outras várias magnitudes possíveis a ele. Por muito tempo cientistas tentaram entender como ele funciona. Segundo Russel e Norving (2004) a área de IA, vai além do que tentar compreender como funciona o cérebro, a área de IA procura criar entidades artificiais dotadas de inteligência. É uma área muito nova, seu estudo começou logo após o fim da Segunda Guerra Mundial, em meados de 1956, e ela é citada regularmente como “o campo de trabalho em que eu gostaria de estar” por cientistas de outras áreas. A IA é a ciência que estuda a melhor maneira de fazer o computador raciocinar, é uma definição um tanto pobre, pois a Inteligência Artificial vai alem do que buscar o raciocínio para uma maquina,logo essa definição é um tanto que filosófica, mas por ora, dá para se ter um noção básica do que essa ciência estuda (Knigth & Rich, 2004). A Inteligência Artificial é fundamentada em cima de definições teóricas de outras ciências, tais como (Russel & Norving, 2004). A filosofia, a ciência mais antiga, procura uma resposta racional para um problema ate então respondidos com argumento míticos, ou que não se tem idéia de como surgiu. Mas a parte que interessa a IA são: • Regras formais podem ser usadas para obter conclusões valida? • Como a mente se desenvolve a partir de cérebro físico? • De onde vem o conhecimento? • Como o conhecimento conduz a ação. A Matemática, considerada a ciência exata ou do raciocínio lógico, ela procura incansavelmente a verdade, é considerada rigorosa e precisa. A filosofia demarcou a maioria das idéias para IA, mas o salto para formalidade exigiu a presença de três agentes matemáticos importantíssimos: probabilidade, lógica e computação. A Inteligência Artificial evoluiu muito nos últimos anos, e possui um amplo campo de pesquisas, desde aprendizado e concepção até o diagnóstico de doenças. Como vimos, a Inteligência Artificial é dividida em vários subcampos de estudos, entre eles está o de “otimização e busca”, ou “resolução de problemas por meio de busca”, conhecido por encontrar uma seqüência de ações para a resolução de um impasse ou problema, quando uma simples ação não é suficiente para resolvê-lo, são os chamados de algoritmos de busca (Russel & Norving, 2004). Algoritmos de buscas funcionam da seguinte maneira: recebe um problema, faz uma busca em todo o espaço de busca, acha as melhores saídas, ou seja relaciona as ações mais eficientes para a resolução do problema, elimina as ações que não satisfazem, retorna a solução através de uma seqüencia de atos a serem executados. Algoritmo de busca: Função Resolução_de_problemas_simples(percepção) retorna uma ação Entradas: percepção, uma percepção; Variáveis estáticas: seq //uma seqüencia de ações de ações inicialmente vazia; estado //alguma descrição do estado atual; objetivo //um objetivo inicialmente nulo; problema // uma formulação de problema; Estado ATUALIZAR_ESTADO ( estado,percepção); Se seq esta vazia então faça objetivo FORMULAR-OBJETIVO (estado); problema FORMULAR-PROBLEMA (estado, objetivo); seq BUSCA (problema); fim se ação PRIMEIRO (seq); seq RESTO(ação); retornar uma ação; fim função Acima temos um exemplo de uma estrutura algorítmica de um “algoritmo de busca”, executado da seguinte forma: primeiro ele formula um objetivo e um problema, busca uma seqüencia de ações que resolveriam o problema e depois executa as ações uma a uma. Quando a seqüencia se completa, ele formula outro objetivo e recomeça. O algoritmo ignora a “percepção” e supõe que a solução que encontrou sempre funcionará. Vimos até agora estratégias de buscas sem informações, que encontram soluções para problemas gerando sistematicamente novos estados testando-os por comparações com a função objetivo. Infelizmente esta estratégia é ineficiente na maioria dos casos, para isso foi desenvolvido um sistema de busca utilizando um conhecimento especifico do problema a ser estudado e melhorado. Dentre as varias estratégias de busca com informação, a que nos interessa é a estratégia de “busca local e problemas de otimização”. Sabemos que os algoritmos de busca foram criados para varrer todo o espaço de busca necessário para resolução de um problema. A característica de busca sistemática é alçada, ao se manter um ou mais caminhos na memória e ao registrar as alternativas que foram exploradas em cada ponto e as que ainda não foram exploradas. Quando um objetivo é alcançado, o caminho até esse objetivo se torna uma solução para o problema. Mas, no entanto, o caminho até o objetivo pode ser irrelevante em alguns problemas de busca (Russel & Norving, 2004). Quando o caminho até o objetivo é irrelevante, pode-se dizer que surge uma classe diferente de algoritmos, aqueles que de forma alguma se preocupam com o caminho percorrido. Um algoritmo de busca local opera usando um único caminho (estado corrente) em vez de vários, normalmente se movimento para seus vizinhos, logo por ser irrelevante, os caminhos não são guardados. Esses algoritmos possuem duas vantagens, utilizam pouca memória, normalmente O (1) e freqüentemente eles conseguem alcançar soluções ótimas para resolução de problemas. Além de encontrar objetivos, esses algoritmos são úteis para resolver problemas de otimização puros, onde o objetivo é encontrar o melhor caminho de acordo com uma função objetivo. Maximizam e minimizam soluções para problemas. Para isso foram desenvolvidos estudos para a otimização de problemas em cima de conceitos naturais, assim surgiu uma área em IA chamada Computação Evolutiva ou Evolucionária, inspirada nos métodos de evolução natural, área de utilização dos Algoritmos Genéticos. 2.2 Algoritmos Genéticos Entre os vários algoritmos que buscam resolver problemas de busca e otimização, estão os Algoritmo Genéticos. Não se da á ele o nome Algoritmo Genético ao acaso, o nome genético vem pelo simples motivo dele ser inspirado no modelo de evolução natural de Charles Darwin. Antes de entendermos o que é um algoritmo genético vamos entender primeiro a teoria de “seleção natural” de Darwin. Para explicar sua teoria vamos recorrer ao exemplo mais famoso de evolucionismo: por que a girafa tem o pescoço grande? Segundo Darwin em seu livro “A origem das espécies”, de 1859 (Darwin apud Russel & Norving, 2004), não foi a ação prolongada em esticar o pescoço para colher as folhas mais altas que fez com que certos animais se tornassem girafas. Imaginemos que alguns tipos de animais foram habitar determinada região onde as melhores opções de alimentos eram as folhas altas. Destes animais, alguns tinham pescoço um pouco maior, e colhiam as folhas com mais facilidade, e outros um pescoço um pouco menor, tendo mais dificuldade em se alimentar. Assim, com o tempo, os animais de pescoço comprido foram favorecidos pelo ambiente, isto é, foram selecionados naturalmente, e os animais de pescoço menor acabaram por ser extintos, ou se mudaram para outro local com condições que lhes fossem mais favoráveis. Isso é chamado de ”seleção natural”. Uma Lei que determina que só os mais adaptados ao ambiente podem sobreviver, se reproduzir e assim transmitir suas características adaptativas aos seus descendentes. Portanto, os descendentes não tem o pescoço maior apenas porque o pescoço de seus pais se desenvolveu, mas sim por que seus pescoços já eram avantajados, e por isso eles sobreviveram e se reproduziram. Esta idéia foi montada em cima da idéia de Lamarck, apesar de muitos verem ela como uma critica a essa teoria, grande maioria do cientista a considera como uma melhoria. Na natureza os indivíduos competem entre si por recursos como, comida, água e refúgio. Entre os animais de uma mesma espécie, aqueles que não obtêm êxito tendem provavelmente a ter um número reduzido de descendentes, tendo assim uma menor probabilidade de seus genes serem propagados ao longo de sucessivas gerações. A combinação entre os genes dos indivíduos mais fortes da espécie podem produzir um novo indivíduo muito mais adaptado ao ambiente. A lei do mais forte. A teoria da evolução natural das espécies conclui, que toda espécie é altamente capacitada a se adaptar a certos ambientes para preservar sua sobrevivência, ainda que pra isso seus membros tenham que sofrer mutações genéticas, ou serem escolhidos naturalmente pelas suas características, sendo que essas características ao serem passadas aos descendentes podem ser melhoradas. Os algoritmos genéticos possuem estruturas que representam os cromossomos, sendo que eles, possuem uma cadeia de bits, que convergem para a melhor solução à um problema estudado pelo AG. Estes cromossomos representam indivíduos que são levados ao longo de várias gerações, na forma similar aos problemas naturais, evoluindo de acordo com os princípios de seleção natural e sobrevivência dos mais aptos. Eles podem resultar em uma busca de azar, mas a vantagem é que sempre há a segurança de quem nem um ponto do espaço de busca tem chance zero de ser examinada, diferentemente dos algoritmos de busca tradicionais, os algoritmos evolutivos trabalham com uma codificação de parâmetros e não com os próprios parâmetros, trabalham com toda uma população e não apenas com um ponto dela, e utilizam dados probabilísticos e não deterministas. As funções de busca e otimização possuem parâmetros como, o espaço de busca, ou seja, todas as possíveis soluções para um determinado problema, uma função de avaliação, que nada mais é que a avaliação de todas as soluções possíveis a um determinado problema. O ponto de partida para o desenvolvimento de Algoritmo Genético, é a representação dos problemas de maneira adequada, de forma que o algoritmo possa estudá-los corretamente. Tradicionalmente, os indivíduos são representados por vetores binários, onde cada elemento de um vetor denota a presença (true) ou ausência (false), de uma determinada característica “ou ainda representados por números como 0 e 1”. O principio básico de algoritmo genético é a convergência de um estado problema para a melhor solução possível, ou seja, após varias interações (gerações) restem somente as soluções mais apropriadas (os indivíduos mais aptos). função ALGORITMO-GENETICO (população, FN-FITNESS) retorna um individuo entradas: população // um conjunto de indivíduos, FN-FITENESS //uma função que mede a adaptação de um individuo repita nova-população conjunto vazio; para i de1 de até TAMANHO(população) faça x SELEÇÃO-ALEATORIA (população, FN-FITNESS); y SELEÇÃO-ALEATORIA (população, FN-FITNESS); filho REPRODUZ (x,y); se (pequena probabilidade aleatória) então filho MUTAÇÃO (filho); fim se adicionar filho a nova-população; fim para até algum individuo estar adaptado o suficiente ou até ter decorrido tempo suficiente; retornar o melhor individuo em população, de acordo com FN-FITNESS; fim função função REPRODUZ (x,y) retorna um individuo entradas: x,y //indivíduos pais; n COMPRIMENTO (x); c numero aleatório de 1 a n; retornar CONCATENA(SUBCADEIA (x,1,c), SUBCADEIA (t,c+1,n)); fim função Basicamente um algoritmo genético é composto por uma “população” uma “função FITNESS ( adequação)”, a operação de escolhas das melhores soluções “seleção”, após a seleção as melhores soluções estarão sujeitas a “reprodução” e se for necessário sujeita também a “mutações”. Uma função FITNESS, é o objeto de otimização, um problema a ser resolvido, ao ser passado um estado para ela, que retorna valores probabilísticos altos para as melhores saídas e baixos para as menos favoráveis, e assim poder ocorrer a seleção, reprodução e raramente a mutação. A população é composta por indivíduos, os indivíduos de uma população são portadores do código genético, logo o código genético é a representação do espaço de busca do problema a ser resolvido. O código genético precisa ser de tamanho finito, mas necessariamente possível representar todo o espaço de busca. Outra parte muito importante do algoritmo é a seleção, geralmente para a seleção dos indivíduos usa –se algoritmo de seleção por roleta, onde os indivíduos são ordenados de acordo com a função FITNESS. Dessa forma a escolha consegue escolher os pais mais adaptados, mas sem deixar de lado a diversidade dos menos aptos. Após a seleção dos indivíduos, ocorre a reprodução, ela pode ser dividida em três etapas, o acasalamento, a recombinação e a mutação. No acasalamento ocorre a escolha de dois indivíduos, como pai e mãe. A recombinação, processo de reprodução sexuada, faz com que o descendente gerado, receba em seu genótipo parte do código genético do pai e da mãe, isso faz que os indivíduos mais bem adaptados possam trocar entre si suas características, gerando indivíduos mais bem adaptados, logo, a cada interação, há sempre uma melhor solução para o problema estudado. A mutação quando acontece, é feita nas probabilidades mais baixas, ou seja, em cima dos indivíduos menos aptos, garantido assim a variabilidade da espécie. A principal vantagem dos Algoritmos Genéticos, se existir, vem da operação de crossover, que pode ser demonstrado matematicamente que, se as posições do código genético forem permutadas no começo em ordem aleatória, o crossover não trará nenhuma vantagem. Logo, a vantagem vem da habilidade do crossover para combinar grandes blocos de genes que evoluem de forma independente para executar funções úteis, elevando assim o nível de afunilamento em que a busca opera. Para conseguir alcançar vantagens significativas ao se utilizar algoritmos genéticos, é necessária uma cuidadosa engenharia na representação. Os AG’s tiveram um grande impacto sobre problemas de otimização e busca, mas no momento não esta claro se a atração em utiliza – los esta em seu desempenho ou em suas origens, esteticamente agradáveis aos conceitos naturais. É necessário, ainda, muito estudo para identificar sob quais circunstancias eles alcançam os melhores resultados. (Russel, Norving, 2004). 2.3 Jogos educativos Jogos por computador são aplicações sofisticadas que exploram muitos dos aspectos oferecidos por um computador, como interfaces que suportam alto nível de interatividade e o uso de diversas mídias. O potencial tecnológico dos jogos aliado às características lúdicas e de desafios favorecem o seu uso na educação (Battaiola, 2002). Jogos usam várias mídias integradas, como textos, animações, vídeo, áudio, etc. O uso de mídias integradas origina as apresentações multimodais e o efeito da atenção dividida, no qual o observador divide a sua atenção entre múltiplos meios que apresentam uma informação de forma complementar ou não. Assim, o uso de mídias integradas passa obrigatoriamente pelo estudo de conceitos cognitivos que guiam esta integração. Piaget (1998) relata que a criança que joga desenvolve suas percepções, sua inteligência, suas tendências à experimentação, seus sentimentos sociais. O jogo é um meio poderoso para a aprendizagem da criança, e porque não aplicá-lo na iniciação à leitura, ao cálculo, ou à ortografia, levando as crianças a se apaixonarem por essas ocupações, que de outra forma lhes seriam “chatas” e incômodas. Os jogos de computador indicados são aqueles que visam estimular o raciocínio e motivar a criança para querer aprender. Nesses contextos educacionais, para a interação entre o saber científico e o jogo, é necessário que na execução da brincadeira o jogo envolva conhecimentos específicos ao componente curricular. 3. RESULTADOS 3.1 Roteiro Como foi colocado na metodologia, o objetivo deste projeto é elaborar um jogo educativo utilizando Algoritmos Genéticos, mais especificamente desenvolver um jogo de tabuleiro (damas) aproveitando as vantagens trazidas pelos AG’s. Vários jogos utilizam Algoritmos Genéticos em sua arquitetura, pela sua facilidade e economia de tempo em problemas de buscas e otimização, são utilizados em jogos que necessitam buscar soluções ótimas para determinados problemas, tais como os jogos de tabuleiros, jogos como o de Xadrez tem sido desenvolvidos com utilizando métodos AG’s. Por se tratar de algo similar ao Xadrez, o jogo de Damas também pode ser desenvolvido utilizando as técnicas dos AG’s, logo, iremos aplicar as técnicas AG’s, para desenvolver o jogo de damas. A funcionalidade do jogo de damas é descrita a seguir. O jogo de damas pratica-se entre dois parceiros, num tabuleiro quadrado, de 64 casas alternadamente claras e escuras, dispondo de 12 pedras brancas e 12 pretas. O objetivo é capturar ou imobilizar as peças do adversário. O parceiro que o conseguir mais, ganha a partida. O tabuleiro deve ser colocado de modo que a casa angular à esquerda de cada parceiro seja escura. No início da partida, as pedras devem ser colocadas no tabuleiro sobre as casas escuras, da seguinte forma: nas três primeiras filas horizontais, as pedras brancas; e, nas três últimas, as pedras pretas. A pedra movimenta-se em diagonal, sobre as casas escuras, para frente, e uma casa de cada vez. A pedra que atingir a oitava casa adversária, parando ali, será promovida a "dama", peça de movimento mais amplos que a simples pedra. Assinala-se a dama sobrepondo, à pedra promovida, outra da mesma cor. A dama pode mover-se de determinada casa para qualquer outra, não obstruída, situada na mesma diagonal. Quando na casa contígua a uma pedra houver uma peça adversária, com uma casa imediata vaga, na mesma diagonal, a pedra tomá-la-á passando para a citada casa vaga. Assim, a pedra toma para frente e para trás, sendo este o único movimento retrógrado da pedra. Se após a tomada de uma peça, a circunstância se repetir, a pedra continuará a tomada no mesmo lance, chamando-se a este movimento, tomada em cadeia, ou tomada em serie. Se, nas diagonais da casa de partida da dama, houver uma peça adversária cuja casa imediata esteja vaga, a dama toma – a passando para qualquer casa vaga após a peça tomada. A dama também toma em cadeia ou serie. A tomada é obrigatória. A pedra e a dama têm o mesmo valor para tomar ou ser tomada. Se, no mesmo lance, se apresentar mais de um modo de tomar, é obrigatório executar o lance que tome o maior número de peças (lei da maioria). A peça que toma poderá passar mais que uma vez pela mesma casa vazia, porém não poderá tomar qualquer peça mais de uma vez. Não será promovida a pedra que, numa tomada em cadeia, apenas passe pela oitava casa adversária. As peças tomadas só deverão ser retiradas do tabuleiro depois de completo o lance. A partida termina empatada quando: • Os dois parceiros concordarem com o empate; • A partir de qualquer ponto da partida, ocorrer 20 (vinte) lances sucessivos de Damas, sem tomada ou deslocamento de pedra; • Uma mesma posição se produzir pela terceira vez, cabendo ao mesmo jogador o lance, deverá o interessado reclamar o empate, antes que a posição se modifique (esta regra só vale se a partida estiver sendo anotada em uma planilha); • Na luta de três damas contra uma, o lado maior não conseguir obter vitória em vinte lances. O jogo de damas, difundido que foi por todo o mundo, acabou por receber alterações, dependendo da região em que é jogado. O jogo de damas elaborado neste projeto será montado em cima das regras gerais do jogo, desprezando suas variações regionais. 3.2 Game design Por se tratar de um jogo de tabuleiro, sua interface gráfica se torna simples, pelo simples motivos de não se ter personagens. Utilizando a biblioteca gráfica Allegro1, o cenário será constituído por um tabuleiro, e as pedras verdes e vermelhas, sendo que sempre que uma pedra for comida, a mesma desaparecera do cenário. O tabuleiro a ser utilizado será o tabuleiro clássico em jogos de tabuleiros, nas cores pretas e brancas. 1 Allegro é uma biblioteca de programação de jogos para usuários da linguagem de programação C/C++, com distribuição livre. Maiores informações podem ser obtidas no endereço http://alleg.sourceforge.net/. Figura 1 – Interface gráfica do jogo. 3.3 Game play O jogo de damas é constituído por um tabuleiro, 24 peças (12 a 12) e dois jogadores, humano versus maquina. O código do programa deve ser elaborado para atender as regras do jogo de damas, assim sendo deve verificar a validade dos lances. A estrutura tabuleiro deve armazenar as peças que estão em jogo e suas respectivas posições, alem de receber as instruções do jogador quando desejar movimentar as peças, remover as peças quando necessários, e inserir novas peças quando se iniciar um novo jogo. Existem dois tipos de jogadores, um jogador é o usuário (Human Player) e outro é a maquina (CPU Player). O jogador humano recorre à interface gráfica para visualizar as peças no tabuleiro, sejam suas peças, seja as peças do adversário e às suas habilidades e conhecimento do jogo para escolher uma jogada. O programa deve armazenar a informação passada pelo jogador (lugar onde a peça deve ser movimentada) e executá-la quando esta for válida. O jogador “máquina” deve recorrer ao Algoritmo Genético para tomar decisões, todas as demais operações de validação são executadas de forma semelhante à do jogador humano. O jogado humano tem associado uma pequena base de dados que é criada na primeira execução do programa/jogo e atualizada sempre que um novo jogo é terminado, algo como que um banco de dados onde mostra um histórico de vitórias e derrotas do jogador, sendo que sempre que desejar o jogador pode apagar o histórico antigo e iniciar outro. A cada jogador são atribuídas doze peças de cores diferentes para cada um no tabuleiro, cada peça tem como atributos, sua cor, a qual jogador pertence e qual sua posição no tabuleiro. Toda essa descrição funciona como um motor para o jogo, que é alimentado, ou por instruções humanas orientadas pela interface gráfica, ou por um AG cuja inteligência varia de acordo com os parâmetros que lhe são atribuídos. Veremos agora como funciona o Algoritmo Genético dentro do jogo, este que é responsável pela inteligência artificial. Temos como parâmetros para o Algoritmo Genético, as populações, respectivos cromossomos e genes, operadores genéticos. Os genes têm identificação real e seu tamanho e codificação varia de acordo com o tipo de peça que identificam. Cada gene representa uma característica de um possível lance, onde estão representados a identificação da peça e o movimento. Os cromossomos são constituídos de genes. Um conjunto de vários cromossomos representa uma população de soluções possíveis. A estrutura do Algoritmo Genético tem a seguinte característica: a função Gera População gera indivíduos, ou seja, possíveis soluções para o jogo, uma jogada possível. A diferença do Algoritmo Genético usado neste jogo com o AG tradicional, da - se pelo fato de que os indivíduos não são gerados aleatoriamente, eles são gerados após uma busca e comparações no espaço de busca, ou seja, todos os indivíduos gerados são jogadas validas, desprezando a necessidade de se utilizar uma função “objetivo” para o Algoritmo. A busca retorna indivíduos aptos para uma determinada situação do jogo, a partir do momento que uma possível jogada é encontrada, a estrutura AG, responsável por guardar as populações, é atualizada, cada posição da estrutura é um individuo, cada individuo possui uma cadeia de gene, cada gene representa situações da jogada como: numero da pedra, nova posição no tabuleiro, posição antiga, posição da pedra comida, numero da pedra comida e o mais importante, pontos da jogada. A cada possível solução encontrada é atribuído a um de seus genes a pontuação da jogada, se a jogada resulta em perda, se a jogada não resulta em perda de pedra, se a jogada resulta em comer uma ou mais pedra, se a jogada resulta em dama, isso despreza o uso de uma função de fintness, pois depois de gerados os indivíduos já têm um índice de adaptação. Após gerar todos os indivíduos, existe uma função que escolhe a melhor jogada possível. Antes de se iniciar uma nova população, pega da antiga população os indivíduos que mais se adaptaram e faz uma mutação em um de seus genes, considerando a possibilidade de que se uma jogada foi considerada boa antes, ela ainda pode ser boa. Após mutar a antiga população, gera mais uma população de indivíduos, os mistura e escolhes os mais aptos. Não será usado o operador de reprodução, somente o de mutação de gene. Tendo em vista o tamanho final do Algoritmo Genético, fica inviável coloca – lo num todo neste artigo, mas para demonstração de efeito vamos colocar duas funções principais do mesmo, a primeira é responsável pela escolha do melhor indivíduo, após a função __Gerapopulacao() e __Avaliapopulacao() terem sido executadas: for(int a = 0; a<cont_pop; a++) { if(_Ag[a].genes8 > maior) { maior = _Ag[a].gene8 ; i=a; } } E aqui temos o procedimento que realiza a mutação de gene: void Damas ::__Mutacao() { Int i, k; for (k=0; k< cont_pop; k++) for (i=0; i <TamCromo; i++) if (rand(0,1) < Mut) _Ag[a].gene8 = FLIP(pc[k].cromo); } 4. DISCUSSÃO Este trabalho teve por objetivo estudar os Algoritmos Genéticos, seus conceitos e como são utilizados em diversas áreas da computação. Um algoritmo genético que pode ser definido como uma técnica utilizada para encontrar soluções aproximadas em problemas de otimização e busca, pertencentes à classe de algoritmos. Um algoritmo genético envolve conceitos típicos da lei da evolução em biologia, como hereditariedade, mutação, seleção natural. De forma mais simplificada, pode-se afirmar que algoritmos genéticos são utilizados para buscar uma solução ótima para um dado problema Para demonstrar e dar exemplo de seu funcionamento foi proposto e desenvolvido um jogo de tabuleiro (Damas). Usando os conceitos dos AG’s para desenvolver o agente inteligente do game, a biblioteca gráfica Allegro na linguagem C++. Os resultados obtidos foram satisfatórios, mostrando que os AG’s satisfazem as necessidades de um agente inteligente da melhor maneira possível, com isso podemos concluir que os AG’s são ótimos em problemas em que não conhecemos de antemão a jogada de um adversário. 5. AGRADECIMENTOS Os autores agradecem à instituição UEMS pelo apoio financeiro concedido, sendo possível assim realizar este trabalho de pesquisa sobre Algoritmos Genéticos, e também por todos os acadêmicos, coordenadores, professores e técnicos que, diretamente ou indiretamente, contribuíram para a realização desse trabalho. 6. REFERÊNCIAS BATTAIOLA, A. L. E.; NASSIM, C.; DOMINGUES, R G. et al. Desenvolvimento de um Software Educacional com Base em Conceitos de Jogos de Computador. XIII Simpósio Brasileiro de Informática na Educação. SBC, 2002. CLUA, E. W. G.; BITTENCOURT, J. R. Desenvolvimento de Jogos 3D: Concepção, Design e Programação. In: XXIV Jornada de Atualização em Informática. SBC: São Leopoldo, 2005. GOLDBERG, D. E. Genetic Algorithms in Search, Optimization, and Machine Learning. EUA: Addison-Wesley, 1989. NORVIG, P.; RUSSEL, S. Artificial Intelligence: A Modern Aproach. Upper Saddle River, NJ, EUA: Prentice Hall, 1995. PIAGET, Jean. Psicologia e Pedagogia. Rio de Janeiro: Forense Universitária, 1998. SILVEIRA, S. R.; BARONE, D. A. C. Jogos Educativos Computadorizados utilizando a abordagem de Algoritmos Genéticos. In: IV Congresso RIBIE, Brasília, 1998.