TUTORIAL: SBGAMES 2009 Criação de um Jogo de Quebra-Cabeças Usando Algoritmo Genético como Motor de Resolução Autores: Alex Fernandes da Veiga Machado Carla Rezende Barbosa Bonin Esteban Walter Gonzales Clua Gustavo Montes Novaes Mauro Lúcio Ruy de Almeida Filho
Algumas Apresentações (2007) SEMINF (Semana de Informática do CEFET-MG - Campus Leopoldina) X META Leopoldina ( X Mostra Específica de Trabalhos e Aplicações do Campus Leopoldina) Semana de Informática das Faculdades Doctum – Cataguases Semana de Informática da FAGOC – Ubá SBGames 2007(VI Simpósio Brasileiro de Jogos para Computador e Entretenimento Digital) – São Leopoldo/RS XII Semana de Informática da Universidade Federal de Viçosa (UFV)
Algumas Apresentações (2008) 6ª Feira Brasileira de Ciências e Engenharia (FEBRACE), na Universidade de São Paulo (USP), São Paulo 59th INTEL International Science and Engineering Fair (INTEL ISEF), Atlanta, Estados Unidos 1ª GameSul Mato Grosso, Rondonópolis, Mato Grosso 2ª Feira de Ciências e Tecnologia do Sul do Maranhão (FECITEC- MA) 2008, Imperatriz, Maranhão Semana de Informática das Faculdades Doctum – Cataguases SBGames 2008(VII Simpósio Brasileiro de Jogos para Computador e Entretenimento Digital) – Belo Horizonte, Minas Gerais
Índice Heurísticas e Aplicações Problema!!! Algoritmo Genético com Árvore de Buscas
Heurísticas e Aplicações Define soluções para um problema através da otimização dos resultados gerados Tem como objetivo medir ganhos de eficácia e de precisão para definir os melhores resultados. São utilizadas em problemas que possuem uma complexidade elevada em função do grande número de soluções possíveis Denomina-se 'heurística' a capacidade de um sistema fazer inovações e desenvolver técnicas de forma imediata e positiva para um determinado fim.
Heurísticas e Aplicações Tipos Utilizados Algoritmo Genético GRASP AG-GRASP Áreas de Atuação Implementação das Heurísticas
Jogo Modelo para Tutorial
Software e Linguagem A Linguagem utilizada foi a FreePascal O Software escolhido foi o Lazarus (Ferramenta RAD) Característica de CrossCompiling Facilidade de Desenvolvimento Boa Velocidade de Resolução Gratuidade e Disponibilidade de Licença
Problema!!!
Problema!!!
Tabela de Movimentos
Árvore de Buscas (Exemplificação) Estrutura Game Search Tree (Árvore de Buscas) Na teoria combinatória dos jogos, representa um Grafo Direcionado cujos nodos são as posições de um jogo e os vértices são os movimentos possíveis.
Procedimentos de Interação Usuário/Jogo Embaralhar o Quebra-Cabeças Iniciar a contagem do tempo Realizar a troca de peças Solicitar Dicas (Hints)
Procedimentos de Interação Usuário/Jogo Solucionar todo o jogo Receber informação da solução completa do jogo Paralisar o tempo Sair do jogo
Conceitos gerais Gene Cromossomo Geração Inicial Mutação Crossover Fitness
Exemplo do Projeto
Algoritmo Genético Conceito Características Vantagens
Algoritmo Genético aplicado - Fluxograma
Etapa 1 Representação de todas as situações Exemplo: Magic Square Etapa 1 Representação de todas as situações
Etapa 2 Definição do tempo limite e do nº de gerações Exemplo: Magic Square Etapa 2 Definição do tempo limite e do nº de gerações Tempo Limite (segs.) = 10 N de Gerações = 10
Definição da profundidade (game tree) e da função de fitness Exemplo: Magic Square Etapa 3 Definição da profundidade (game tree) e da função de fitness Profundidade = 15
Definição da taxa de crossover e mutação Exemplo: Magic Square Etapa 4 Definição da taxa de crossover e mutação Crossover= 50% Mutacao= 10%
Etapa 5 Geração da população inicial de cromossomos Exemplo: Magic Square Etapa 5 Geração da população inicial de cromossomos
Exemplo: Magic Square Etapa 6 Execução do crossover
Exemplo: Magic Square Etapa 7 Execução da mutação OS1= {7, 11, 8, 12, 8, 0, 3, 9, 8, 2, 11, 13, 9, 3, 2}
Cálculo do valor de fitness de cada offspring Exemplo: Magic Square Etapa 8 Cálculo do valor de fitness de cada offspring
Seleção dos melhores candidatos (critério elitista) Exemplo: Magic Square Etapa 9 Seleção dos melhores candidatos (critério elitista)
Finalização ou repetição da Etapa 6 Exemplo: Magic Square Etapa 10 Finalização ou repetição da Etapa 6 Solucao= {16, 9, 2 1, 4, 8, 7, 10, 16, 4, 12, 13, 7, 11, 4}
Códigos e Procedures Procedimentos que devem ser criados para viabilizar a implementação dos conceitos do Algoritmo Genético
Troca de Botões // Botão 1 if(q1=1)then begin if(q2=2) then cap:=Form1.BitBtn2.caption; Form1.BitBtn2.caption := Form1.BitBtn1.caption; Form1.BitBtn1.caption := cap; Form1.BitBtn10.Glyph:=Form1.BitBtn2.Glyph; Form1.BitBtn2.Glyph:=Form1.BitBtn1.Glyph; Form1.BitBtn1.Glyph:=Form1.BitBtn10.Glyph; end;
Troca de Botões if(q2=6) then begin cap:=Form1.BitBtn6.caption; Form1.BitBtn6.caption := Form1.BitBtn1.caption; Form1.BitBtn1.caption := cap; Form1.BitBtn10.Glyph:=Form1.BitBtn6.Glyph; Form1.BitBtn6.Glyph:=Form1.BitBtn1.Glyph; Form1.BitBtn1.Glyph:=Form1.BitBtn10.Glyph; end;
Troca de Botões if(q2=3) then begin cap:=Form1.BitBtn5.caption; Form1.BitBtn5.caption := Form1.BitBtn1.caption; Form1.BitBtn1.caption := cap; Form1.BitBtn10.Glyph:=Form1.BitBtn5.Glyph; Form1.BitBtn5.Glyph:=Form1.BitBtn1.Glyph; Form1.BitBtn1.Glyph:=Form1.BitBtn10.Glyph; end;
Troca de Botões if(q2=21) then begin cap:=Form1.BitBtn52.caption; Form1.BitBtn52.caption := Form1.BitBtn1.caption; Form1.BitBtn1.caption := cap; Form1.BitBtn10.Glyph:=Form1.BitBtn52.Glyph; Form1.BitBtn52.Glyph:=Form1.BitBtn1.Glyph; Form1.BitBtn1.Glyph:=Form1.BitBtn10.Glyph; end;
Embaralhar Imagem procedure aleatorio(max: integer); var numero: array[1..2000] of integer; resposta: string; k,n,i, ale: integer; begin for i:=1 to max do numero[i]:=i; ale:=random(max+1-i)+1; escolhido[i]:=numero[ale]; n:=0; for k:=1 to max+1-i do
Embaralhar Imagem begin if(k<>ale) then n:=n+1; numero[n]:=numero[k]; end; for i:=1 to max do resposta:=resposta+inttostr(escolhido[i])+' - '; //Form1.Edit1.Text:=resposta;
Definição dos Possíveis Movimentos if(cromo=1)then begin prime:=Form1.BitBtn2.caption; Form1.BitBtn2.caption := Form1.BitBtn1.caption; Form1.BitBtn1.caption := prime; Form1.BitBtn10.Glyph:=Form1.BitBtn2.Glyph; Form1.BitBtn2.Glyph:=Form1.BitBtn1.Glyph; Form1.BitBtn1.Glyph:=Form1.BitBtn10.Glyph; end;
Definição dos Possíveis Movimentos if(cromo=2)then begin prime:=Form1.BitBtn1.caption; Form1.BitBtn1.caption := Form1.BitBtn5.caption; Form1.BitBtn5.caption := prime; Form1.BitBtn10.Glyph:=Form1.BitBtn1.Glyph; Form1.BitBtn1.Glyph:=Form1.BitBtn5.Glyph; Form1.BitBtn5.Glyph:=Form1.BitBtn10.Glyph; end;
Geração da População Inicial // gerar o primeiro grupo de cromossomos aleatorios procedure primeiro(); begin //criar os cromossomor da população inicial for contador:=1 to 10 do for contador1:=1 to nmovimentos do num2:=random(51); cromossomo[contador][contador1]:=num2; end;
Realização do Crossover procedure crossover(); begin v1:=''; //taxa:=round(taxacross/100*nmovimentos); taxa:=35; t:=1; while (t<=10) do z:=t+1; for u:=1 to taxa+1 do cromossomo[t+10][u]:=cromossomo[t][u]; for u:=taxa+1 to nmovimentos do cromossomo[t+10][u]:=cromossomo[z][u]; t:=t+1; for u:=taxa to nmovimentos do cromossomo[t+10][u]:=cromossomo[t-1][u]; for u:=1 to taxa do cromossomo[t+10][u]:=cromossomo[z][u]; end;
Realização da Mutação procedure mutacao(); begin //taxa1:=round(taxamut/100*nmovimentos); taxa1:=3; //pega a população inicial para a mutação for contador3:=1 to 10 do for contador12:=1 to nmovimentos do ssomo[contador3][contador12]:=cromossomo[contador3][contador12]; end; //mutação for contador13:=1 to 10 do
Realização da Mutação for qnt:=1 to taxa1 do begin gene:=1+random(nmovimentos); muta:=random(51); ssomo[contador13][gene]:=muta; end; //guarda o resultado da mutação for contador3:=1 to 10 do for contador4:=1 to nmovimentos do cromossomo[contador3+20][contador4]:=ssomo[contador3][contador4];
Cálculo do Fitness procedure fitness(); begin //Button 1 if (cromof[1]=1)then um :=0; if (cromof[1]=2)then um :=1; if (cromof[1]=3)then um :=2; if (cromof[1]=4)then um :=2; if (cromof[1]=5)then um :=1; if (cromof[1]=6)then um :=1; if (cromof[1]=7)then um :=2; if (cromof[1]=8)then um :=3; if (cromof[1]=9)then um :=3; if (cromof[1]=10)then um :=2; if (cromof[1]=11)then um :=2; if (cromof[1]=12)then um :=3;
Cálculo do Fitness if (cromof[1]=13)then um :=4; //total de fitness total:=100-(um+dois+tres+...+vintetres+vintequatro+vintecinco);
Troca Interna com Entrada de Genes procedure trocab(t1:integer); begin if(t1=1)then seg:=cromof[2]; cromof[2] := cromof[1]; cromof[1] := seg; end; if(t1=2)then seg:=cromof[5]; cromof[5] := cromof[1];
Alinha os Cromossomos (melhores fitness) procedure setimo(); begin dan:=1; nad:=1; maior:=100; while(maior>=0) do for most1:=1 to 30 do if(fitcromossomo[most1]=maior) then for contador7:=1 to nmovimentos do maiorcromo[dan][contador7]:=cromossomo[most1][contador7]; maiorfit[nad]:=maior;
Alinha os Cromossomos (melhores fitness) dan:=dan+1; nad:=nad+1; end; maior:=maior-1; //Apenas mostra os cromossomos alinhados pf:=''; for most:=1 to 30 do begin pf:=inttostr(maiorfit[most]); Form1.Memo7.Lines.Add(pf);
Seleciona Melhores Cromossomos procedure oitavo(); begin Form1.memo1.lines.Clear; Form1.memo2.lines.Clear; Form1.memo7.lines.Clear; for contador10:=1 to 10 do for contador11:=1 to nmovimentos do cromossomo[contador10][contador11]:=maiorcromo[contador10 ][contador11]; v4:=v4+' '+ inttostr(cromossomo[contador10][contador11]); end;
Seleciona Melhores Cromossomos fitcromossomo[contador10]:=maiorfit[contador10]; Form1.memo1.lines.add(v4); Form1.memo2.lines.add(inttostr(fitcromossomo[contador1 0])); form1.Memo7.Lines.Add(inttostr(maiorfit[contador10])); v4:=''; end;
Resolver o Problema procedure botaoag(); var dia, mes, ano, horas, minutos1, segundos1, milisegundos1, minutos2, segundos2, milisegundos2: Word; begin // uses DateUtils DecodeDateTime(Now, ano, mes, dia, horas, minutos1, segundos1, milisegundos1); solu:=0; for constante:=1 to maxite do begin if (exibir)then Form1.memo1.clear; Form1.memo2.clear; Form1.memo3.clear; Form1.memo4.clear; Form1.memo5.clear; Form1.memo6.clear; end;
Resolver o Problema if (solu<>1)then begin primeiro(); //gerar população inicial segundo(); //calcula o fitness da população inicial solu:=1; end; terceiro(); //faz o crossover quarto(); //calcula o fitness do crossover quinto(); //faz a mutação sexto(); //calcula o fitness da mutação setimo(); //alinha em ordem decrescente de fitness oitavo(); //pega os dez melhores
Resolver o Problema if (maiorfit[1]=100) then begin form1.edit10.text:='Sim'; form1.Button16.Enabled:=true; form1.edit9.text:=inttostr(maiorfit[1]); end else form1.edit10.text:='Não'; end;
Resolver o Problema Application.ProcessMessages; form1.edit1.text:=''; for contador15 :=1 to nmovimentos do begin cromoescolhido[contador15]:=maiorcromo[1][contador15]; s2[contador15]:=cromoescolhido[contador15]; form1.edit1.text:=form1.edit1.Text+ ' '+ inttostr(cromoescolhido[contador15]); end; if (maiorfit[1]=100)then break;
Resolver o Problema form1.edit3.Text:=inttostr(constante); DecodeDateTime(Now, ano, mes, dia, horas, minutos2, segundos2, milisegundos2); form1.Edit7.Text:=inttostr(60000*(minutos2- minutos1)+1000*(segundos2-segundos1)+milisegundos2- milisegundos1); end; procedure TForm1.Button11Click(Sender: TObject); begin botaoag();
Demais Áreas de Aplicação de AG Jogos de Raciocínio como: Sudoku, Jogos de Tabuleiro Softwares aplicados à Economia
Referências Bibliográficas [1] Hong, P. T. et al. Applying Genetic Algorithms to Game Search Trees. Soft Computing, 2001. [2] Sugisaka, Masanori et al. Genetic algorithms (GAs) to evolve multiple- agent cooperative systems. Artif Life Robotics, 1999. [3] Lacerda, E. G. M.; Carvalho, A. C. P. L. F. Introdução aos algoritmos genéticos. In: Galvão, C.O., Valença, M.J.S. (orgs.) Sistemas inteligentes: aplicações a recursos hídricos e ciências ambientais. Porto Alegre: Ed. Universidade/UFRGS : Associação Brasileira de Recursos Hídricos. [4] Thomas H. Cormen; Charles E. Leiserson; Ronald L. Rivest, 2001. Introduction to Algorithms, Second Edition. MIT Press and McGraw-Hill,. ISBN 0-262-03293-7.
Agradecimentos Aos nosso orientadores Alex Fernandes da Veiga Machado e Esteban Clua Ao CEFET-MG - Campus Leopoldina Aos nossos familiares e a todos aqueles que ajudaram direta ou indiretamente. À atenção de todos aqui presentes.
E-mails para contato Alex Fernandes da Veiga Machado alexcataguases@hotmail.com Carla Rezende Barbosa Bonin carlacefet@hotmail.com Esteban Walter Gonzales Clua esteban@ic.uff.br Gustavo Montes Novaes gmontes@oi.com.br Mauro Lúcio Ruy de Almeida Filho cefetmauro@yahoo.com.br