580 likes | 707 Views
Autores: Alex Fernandes da Veiga Machado Carla Rezende Barbosa Bonin Esteban Walter Gonzales Clua Gustavo Montes Novaes Mauro Lúcio Ruy de Almeida Filho. TUTORIAL: SBGAMES 2009 Criação de um Jogo de Quebra-Cabeças Usando Algoritmo Genético como Motor de Resolução.
E N D
Autores: Alex Fernandes da Veiga Machado Carla Rezende Barbosa Bonin Esteban Walter Gonzales Clua Gustavo Montes Novaes Mauro Lúcio Ruy de Almeida Filho TUTORIAL: SBGAMES 2009Criação de um Jogo de Quebra-Cabeças Usando Algoritmo Genético como Motor de Resolução
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
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
Á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
Algoritmo Genético • Conceito • Características • Vantagens
Exemplo: Magic Square Etapa 1Representação de todas as situações
Exemplo: Magic Square Etapa 2Definição do tempo limite e do nº de gerações Tempo Limite (segs.) = 10 N de Gerações = 10
Exemplo: Magic Square Etapa 3 Definição da profundidade (game tree) e da função de fitness Profundidade = 15
Exemplo: Magic Square Etapa 4 Definição da taxa de crossover e mutação Crossover= 50% Mutacao= 10%
Exemplo: Magic Square Etapa 5Geração da população inicial de cromossomos
Exemplo: Magic Square Etapa 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}
Exemplo: Magic Square Etapa 7 Execuçã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}
Exemplo: Magic Square Etapa 8 Cálculo do valor de fitness de cada offspring
Exemplo: Magic Square Etapa 9 Seleção dos melhores candidatos (critério elitista)
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 • 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;
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; • 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; • 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;
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 • 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 Genes procedure 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;
Alinha os Cromossomos (melhores fitness) • 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;
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;
Seleciona Melhores Cromossomos • 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;
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;