tutorial: sbgames 2009 criação de um jogo de quebra-cabeças usando algoritmo genético como motor...

Post on 17-Apr-2015

103 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

TUTORIAL: SBGAMES 2009Criação de um Jogo de

Quebra-Cabeças Usando Algoritmo Genético como

Motor de ResoluçãoAutores:

Alex Fernandes da Veiga MachadoCarla Rezende Barbosa BoninEsteban Walter Gonzales CluaGustavo Montes NovaesMauro 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)

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

Algumas Apresentações (2008)

4

Índice Heurísticas e Aplicações Problema!!! Algoritmo Genético com Árvore de Buscas

5

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.

6

Tipos Utilizados• Algoritmo Genético

• GRASP

• AG-GRASP

Áreas de Atuação

Implementação das Heurísticas

Heurísticas e Aplicações

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

10

Problema!!!

11

Problema!!!

12

Tabela de Movimentos

13

Á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)

Solucionar todo o jogo

Receber informação da solução completa do jogo

Paralisar o tempo

Sair do jogo

Procedimentos de Interação Usuário/Jogo

16

Conceitos gerais

Gene Cromossomo Geração Inicial Mutação Crossover Fitness

17

Exemplo do Projeto

18

Algoritmo Genético

Conceito

Características

Vantagens

19

Algoritmo Genético aplicado - Fluxograma

20

Exemplo: Magic SquareEtapa 1

Representação de todas as situações

21

Exemplo: Magic Square

Etapa 2Definição do tempo limite e do nº de gerações

Tempo Limite (segs.) = 10

N de Gerações = 10

22

Exemplo: Magic SquareEtapa 3

Definição da profundidade (game tree) e da função de fitness

Profundidade = 15

23

Exemplo: Magic Square

Etapa 4Definição da taxa de crossover e mutação

Crossover= 50%

Mutacao= 10%

24

Exemplo: Magic Square

Etapa 5Geração da população inicial de cromossomos

25

Exemplo: Magic SquareEtapa 6

Execução do crossover

C1= {14, 4, 8, 0, 18, 17, 10, 12, 4, 6, 17, 17, 17, 14, 16}

C2= {10, 0, 1, 6, 3, 2, 2, 0, 5, 0, 8, 15, 12, 2, 2}

OS1= {14, 4, 8, 0, 18, 17, 10, 12, 4, 6, 17, 15, 12, 2, 2}

OS2= {10, 0, 1, 6, 3, 2, 2, 0, 5, 0, 8, 17, 17, 14, 16}

26

Exemplo: Magic Square

Etapa 7Execução da mutação

C1= {7, 11, 8, 12, 8, 0, 3, 9, 1, 2, 11, 13, 9, 3, 2}

OS1= {7, 11, 8, 12, 8, 0, 3, 9, 8, 2, 11, 13, 9, 3, 2}

27

Exemplo: Magic Square

Etapa 8Cálculo do valor de fitness de cada offspring

28

Exemplo: Magic Square

Etapa 9Seleção dos melhores candidatos (critério elitista)

29

Exemplo: Magic Square

Etapa 10Finalizaçã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 begin 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;

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; end;

Troca de Botões

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; for i:=1 to max do begin 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 begin n:=n+1; numero[n]:=numero[k]; end; end; end;

for i:=1 to max do resposta:=resposta+inttostr(escolhido[i])+' - '; //Form1.Edit1.Text:=resposta; end;

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;

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;

Definição dos Possíveis Movimentos

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 begin for contador1:=1 to nmovimentos do begin num2:=random(51); cromossomo[contador][contador1]:=num2; end; end;

Realização do Crossover procedure crossover(); begin v1:=''; //taxa:=round(taxacross/100*nmovimentos); taxa:=35; t:=1; while (t<=10) do begin 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]; t:=t+1; 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 begin for contador12:=1 to nmovimentos do begin ssomo[contador3][contador12]:=cromossomo[contador3][contador12]; end; end; //mutação for contador13:=1 to 10 do begin

Realização da Mutação for qnt:=1 to taxa1 do begin gene:=1+random(nmovimentos); muta:=random(51); ssomo[contador13][gene]:=muta; end; end; //guarda o resultado da mutação for contador3:=1 to 10 do begin for contador4:=1 to nmovimentos do begin cromossomo[contador3+20][contador4]:=ssomo[contador3][contador4]; end; end;

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; if (cromof[1]=14)then um :=4; if (cromof[1]=15)then um :=3; if (cromof[1]=16)then um :=2; if (cromof[1]=17)then um :=3; if (cromof[1]=18)then um :=4; if (cromof[1]=19)then um :=4; if (cromof[1]=20)then um :=3; if (cromof[1]=21)then um :=1; if (cromof[1]=22)then um :=2; if (cromof[1]=23)then um :=3; if (cromof[1]=24)then um :=3; if (cromof[1]=25)then um :=2; //total de fitness total:=100-(um+dois+tres+...+vintetres+vintequatro+vintecinco);

Troca Interna com Entrada de Genesprocedure trocab(t1:integer); begin if(t1=1)then begin seg:=cromof[2]; cromof[2] := cromof[1]; cromof[1] := seg; end;

if(t1=2)then begin seg:=cromof[5]; cromof[5] := cromof[1]; cromof[1] := seg; end;

Alinha os Cromossomos (melhores fitness) procedure setimo(); begin dan:=1; nad:=1; maior:=100;

while(maior>=0) do begin for most1:=1 to 30 do begin if(fitcromossomo[most1]=maior) then begin for contador7:=1 to nmovimentos do maiorcromo[dan]

[contador7]:=cromossomo[most1][contador7]; maiorfit[nad]:=maior;

dan:=dan+1; nad:=nad+1; end; end; maior:=maior-1; end;

//Apenas mostra os cromossomos alinhados pf:=''; for most:=1 to 30 do begin pf:=inttostr(maiorfit[most]); Form1.Memo7.Lines.Add(pf); end; end;

Alinha os Cromossomos (melhores fitness)

Seleciona Melhores Cromossomos procedure oitavo(); begin Form1.memo1.lines.Clear; Form1.memo2.lines.Clear; Form1.memo7.lines.Clear; for contador10:=1 to 10 do begin for contador11:=1 to nmovimentos do begin cromossomo[contador10]

[contador11]:=maiorcromo[contador10][contador11]; v4:=v4+' '+ inttostr(cromossomo[contador10][contador11]); end;

fitcromossomo[contador10]:=maiorfit[contador10]; Form1.memo1.lines.add(v4);

Form1.memo2.lines.add(inttostr(fitcromossomo[contador10]));

form1.Memo7.Lines.Add(inttostr(maiorfit[contador10])); v4:=''; end; end;

Seleciona Melhores Cromossomos

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 begin Form1.memo1.clear; Form1.memo2.clear; Form1.memo3.clear; Form1.memo4.clear; Form1.memo5.clear; Form1.memo6.clear; end;

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

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 begin form1.edit10.text:='Não'; form1.edit9.text:=inttostr(maiorfit[1]); 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; end;

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(); end;

Demais Áreas de Aplicação de AG

Jogos de Raciocínio como: Sudoku, Jogos de Tabuleiro

Softwares aplicados à Economia

56

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.

57

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.

58

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

top related