Anais do 15O Encontro de Iniciação Científica e Pós-Graduação do ITA – XV ENCITA / 2009 Instituto Tecnológico de Aeronáutica, São José dos Campos, SP, Brasil, Outubro, 19 a 22, 2009. ANÁLISE DO DESEMPENHO DE ARQUITETURAS DE AGENTES INTELIGENTES NA RESOLUÇÃO DE PROBLEMAS ESTRATÉGICOS EM TEORIA DOS JOGOS Roger Vinícius Garcia ITA - Instituto Tecnológico de Aeronáutica Rua H8-B, nº224, Campus do CTA, São José dos Campos - SP, Brasil, CEP 12228-461 Bolsista PIBIC-CNPq [email protected] Paulo Marcelo Tasinaffo ITA - Instituto Tecnológico de Aeronáutica – Divisão de Ciência da Computação Pç. Marechal Eduardo Gomes, nº 50, São José dos Campos – SP, Brasil, CEP 12228-900 [email protected] Resumo. O objetivo deste trabalho é utilizar técnicas de Inteligência Artificial para desenvolver um agente capaz de jogar o jogo Mancala, mas cujo algoritmo pode ser aproveitado e expandido para qualquer outro jogo iterativo. Para tanto, utiliza-se o algoritmo Minimax, que busca a árvore de jogadas da partida e tenta estimar a melhor jogada a partir de uma heurística de avaliação dos estados encontrados. Uma otimização no tempo da busca é feita com a Poda a-b, que organiza de maneira inteligente a busca. A problemática da patologia do Minimax é analisada. Por fim, utiliza-se um Algoritmo Genético para tentar resolver a patologia do Minimax e para otimizar a heurística de avaliação, resultando em um agente com jogadas melhores e mais rápidas. Palavras-chave: Mancala, Minimax, Algoritmos Genéticos, Teoria dos Jogos. 1. Introdução Os agentes inteligentes programados segundo técnicas da Inteligência Artificial são capazes de executar inúmeras tarefas; entre elas, está a capacidade de jogar jogos iterativos, buscando o resultado que o favoreça ao máximo. Há muito o campo da Teoria dos Jogos estuda esses jogos, e um de seus principais frutos para a programação de agentes inteligentes foi o algoritmo Minimax, que possibilita ao agente prever jogadas boas e ruins, em uma árvore de busca. Os resultados obtidos em Teoria dos Jogos são, geralmente, aplicados em simulações e previsões no ramo da Economia, mas também podem ser utilizados para trabalhar planejamentos estratégicos em caso de guerra. O algoritmo Minimax é então aplicado ao jogo de tabuleiro Mancala, de origem africana. A simplicidade do jogo, em comparação a outros jogos de tabuleiro, reduz algumas complicações específicas, sendo possível o foco majoritário das atenções sobre as técnicas do Minimax em si. O objetivo do trabalho é buscar uma otimização do algoritmo Minimax, tanto em tempo de processamento quanto em qualidade do agente jogador. Para tanto, são utilizadas as técnicas Poda a-b (tempo) e Algoritmos Genéticos (qualidade), em conjunto com o Minimax. 2. Modelagem do jogo Neste trabalho, aborda-se o caso de jogos nos quais os jogadores alternam-se em movimentos, em um número finito deles, até ser atingido um estado final. Nesta categoria, enquadram-se diversos estilos populares de jogos, como Xadrez, Damas, Gamão, Othello, entre outros. Aqui, será abordado o jogo Mancala, cuja simplicidade nos permite focar mais em aspectos próprios do Minimax. 2.1 Definição formal de um jogo Um jogo pode ser definido formalmente como uma busca, que apresenta um estado inicial, um conjunto de operadores capazes de levar um estado a outro, um teste que identifica quando o jogo termina, e uma função utilidade, que atribui pontuações a cada um dos jogadores (Russel, 2003). Estendendo-se essa definição e utilizando a notação adequada, são identificados os seguintes elementos de um jogo: i. Um conjunto de jogadores P = {p1, p2, ... , pn }; ii. Um conjunto S de estados, sendo dado um s0 e S como estado inicial; iii. Um subconjunto SF Õ S, contendo os estados terminais; Anais do XV ENCITA 2009, ITA, Outubro, 19-22, 2009 2 iv. Um conjunto de ações aij e Ai, permitidas a cada jogador pi, em um dado estado s; v. Uma função mudança de estado T: SäAöS, que aplica a ação de um jogador em um estado, levando o jogo para o estado seguinte: T(s,a) = s’; vi. Uma estratégia gi:SöA de cada jogador pi, sendo esta uma função que associa um estado s (completamente ou parcialmente observável pelo jogador pi) a uma de suas ações aij; vii. Uma função utilidade aproximada ui:Sö, que avalia o quão favorável é um estado intermediário do jogo, do ponto de vista do jogador pi; viii. Uma função utilidade Ui:SFö , que atribui pontuações a cada um dos jogadores ao final do jogo; 2.2 Definição do jogo Mancala A denominação Mancala abrange uma categoria de jogos de tabuleiro de origem africana, com regras ligeiramente diferentes, mas todos baseados em um mesmo esquema de jogo: a semeadura de grãos em cavidades. O tabuleiro é composto de 14 cavidades, sendo 2 maiores, denominadas Kahalas; as outras 12 cavidades menores são divididas em 2 grupos, sendo 6 pertencentes a cada jogador. A Kahala de cada jogador fica ao lado direito das cavidades menores, e o número de pedras contidas nela define a pontuação do jogador. No início do jogo, são dispostas 4 pedras, em cada uma das cavidades menores. Nessa configuração, as pedras não pertencem a nenhum jogador em especial, mas sim ao tabuleiro. A Fig. 1 exemplifica a configuração inicial. Figura 1. Esquema da disposição inicial das peças no tabuleiro de Mancala. Uma jogada é realizada quando um jogador escolhe uma de suas 6 cavidades menores com número de pedras diferente de zero, e “semeia” seu conteúdo, em sentido anti-horário, depositando uma pedra em cada cavidade subsequente. A sua própria Kahala deve ser contemplada na semeadura, mas a Kahala adversária deve ser ignorada. Caso a última cavidade a ser semeada seja sua própria Kahala, o jogador deve jogar novamente. A captura se dá quando a última pedra semeada cai em uma cavidade vazia, pertencente ao jogador que efetuou a semeadura. Neste caso, tanto a pedra em questão como todas as pedras da cavidade adversária oposta a essa são recolhidas para a Kahala do jogador. O final da partida se dá quando não houver mais pedras em um dos lados do tabuleiro. As peças que sobraram são recolhidas para a Kahala do jogador dono das cavidades onde se encontram. Vence o jogador que possuir o maior número de pedras em sua Kahala, ao final do jogo. O jogo Mancala é de implementação simples, do ponto de vista computacional, pois cada um de seus estados pode ser descrito como um vetor de 14 elementos, cada elemento representando o número de pedras em sua respectiva cavidade. Por essa simplicidade, o desenvolvimento da árvore de jogadas é facilitado, economizando processamento com o jogo em si, e focando mais no desempenho do agente jogador. A ausência de especialização das peças, como ocorre no Xadrez, e a limitação dos movimentos de cada jogador (no máximo 6) também simplificam a realização dos cálculos. Apesar de ter sido escolhido o Mancala, outras plataformas de jogos podem ser utilizadas, utilizando-se a mesma teoria na implementação dos agentes (como Othello, Damas e Xadrez). No entanto, jogos que incluem um elemento de 3 Anais do XV ENCITA 2009, ITA, Outubro, 19-22, 2009 sorte (como Gamão e outros jogos que incluam dados) devem ser adaptados, a fim de incluir pesos probabilísticos no desenvolvimento da árvore de jogadas. 2.3 Assimetria da primeira jogada Um problema detectado no jogo Mancala foi uma assimetria no tocante à primeira jogada da partida. Depois de implementada a plataforma Mancala no ambiente MATLAB, foi executada uma simulação em que dois jogadores executam, ao longo da partida, movimentos aleatórios, dentre os permitidos. Após 106 partidas da simulação, observou-se que o jogador que inicia a partida (efetua a primeira jogada) tem mais chances de ser o vencedor da partida, como mostra a Tab. 1: Tabela 1: Porcentagens de vitórias para o agente da primeira jogada. Vitórias Derrotas Empates Resultados obtidos pelo agente da jogada inicial 48,36% 45,35% 6,29% Essa assimetria estatística revela que o jogador que inicia a partida é uma variável relevante, quando se considera o desempenho dos agentes. Por isso, quando são rodados testes e simulações (mostrados mais à frente), realiza-se duas vezes a mesma partida, comutando-se o jogador que a inicia, para que haja maior homogeneidade e fidelidade ao desempenho real do agente, cancelando os efeitos da assimetria estatística. 2.4 Aplicação do modelo ao Mancala As correspondências entre o modelo apresentado na seção 2.1 e o jogo Mancala são descritas a seguir: i. Dois jogadores perfazem P = {p1, p2}; ii. Cada estado do jogo pode ser descrito como um vetor s e 14, s = (c1, c2, c3, c4, c5, c6, K1, c7, c8, c9, c10, c11, c12, K2), sendo o valor de ci o número de pedras contidas na cavidade i, e Kj o número de pedras contidas na Kahala do jogador j (contudo, notar que S ∫ 14). O estado inicial é s0 = (4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 0); 6 12 iii. O conjunto de estados terminais é aquele em que ∑ ci = 0 ou ∑ ci = 0 (um dos jogadores fica sem peças); i =7 i =1 iv. A ação permitida a cada jogador é escolher uma de suas cavidades não vazias e semear as pedras contidas nela, totalizando um máximo de 6 opções a cada instante; v. A função mudança de estado é a própria semeadura das pedras, levando a um novo estado s’; vi. A estratégia de cada jogador é definida por ele mesmo. No caso deste trabalho, a função do agente jogador desenvolvido é aplicar uma estratégia que o leve à vitória; vii. A utilidade aproximada de cada estado também é dependente do jogador. No caso do agente jogador, ela é dada por uma heurística de avaliação, que leva em conta diferentes características do jogo para chegar a um veredicto sobre a utilidade do estado; viii. As funções utilidades são U1(s) = K1 e U2(s) = K2, para um s e SF. Assim, dado s0 e S, o jogador p1 dá como input ao jogo uma ação a = g1(s0), de acordo com sua estratégia g, levando o jogo a um estado s’ = T(s0, a). O jogador p2 realiza o mesmo procedimento, e assim sucessivamente, até que seja alcançado um estado sf e SF. Então, o resultado do jogo são as pontuações U1(sf) e U2(sf), e o ganhador é aquele com a maior pontuação final. Caso sejam iguais, há um empate. 4 Anais do XV ENCITA 2009, ITA, Outubro, 19-22, 2009 3. Desenvolvimento do agente jogador com Minimax Uma abordagem clássica para problemas de Teoria dos Jogos é a utilização do algoritmo Minimax. Nesse algoritmo, o jogador denominado MAX tenta obter o maior resultado possível no jogo, enquanto MIN tenta minimizá-lo. O algoritmo Minimax desenvolve a árvore de jogadas da partida, atribuindo um estado para cada um de seus nós, a partir do estado inicial. Em cada nó, o jogador da vez tem um conjunto de jogadas que pode realizar, e cada uma delas leva a um nó diferente, formando a árvore de jogadas até os estados finais. Nos estados finais, ou seja, nas folhas da árvore, a utilidade dos estados é calculada, e são atribuídos pontos a cada um dos jogadores. A função de MAX é escolher a melhor jogada, dado um ponto da árvore correspondente ao estado atual, supondo que MIN executará sempre sua melhor jogada. Esse cálculo é realizado desde as folhas até o nó da árvore que representa o estado atual do jogo, sempre admitindo que MIN escolherá a jogada que o leva a nós com função utilidade menor. Matematicamente: seja A o conjunto de ações do jogador que executa o Minimax, e B o conjunto de ações do jogador adversário. A estratégia Minimax é a resolução de γ ( s ) = a tal que o termo indicado na Eq. (1) seja máximo. O raciocínio é análogo para jogos com mais de uma ação de cada jogador: basta iterar o algoritmo para profundidades maiores da árvore de jogadas. max min U [T ( s ', b )] , s ' = T ( s , a ) a∈A b∈B (1) Um exemplo pode ser dado no jogo trivial de 2 jogadas descrito pela Tab. 2: o jogador A (MAX) deve escolher uma linha, e somente depois disso o jogador B (MIN) deve escolher uma coluna. O resultado do jogo é o elemento da matriz que corresponde à linha e à coluna escolhidas pelos jogadores. Prevendo que a melhor escolha de MIN seja a coluna que contém o menor elemento da linha escolhida, MAX tentará maximizar a jogada de MIN, escolhendo a linha 3. Dessa forma, o melhor resultado para MIN será a escolha da coluna 3, resultando o valor -1 no jogo. Tabela 2. Exemplo de jogo em matriz. A escolhe 1 A escolhe 2 A escolhe 3 B escolhe 1 +3 -4 +2 B escolhe 2 -2 +1 0 B escolhe 3 -1 0 -1 Em forma de árvore, o jogo de 2 movimentos acima seria descrito como na Fig. 2: Figura 2. Árvore do jogo. Na árvore, pode-se perceber que o agente espera que MIN faça sempre a melhor jogada, indo para o estado de menor valor. Prevendo isso, MAX pode basear sua escolha aplicando valores -2, -4 e -1, respectivamente, às jogadas A1, A2 e A3. Escolhe, portanto, a de maior valor: A3. No entanto, na maioria dos jogos (incluindo o Mancala), não é possível descrever uma árvore de possibilidades em sua totalidade, dado que a característica exponencial do desenvolvimento dos nós produziria um número muito grande de estados, sendo admitido infinito na maioria dos jogos. Nesses casos, a função utilidade dos nós não pode ser calculada, e portanto deve ser estimada segundo uma heurística de avaliação. Anais do XV ENCITA 2009, ITA, Outubro, 19-22, 2009 5 3.1 Poda a-b Um método de otimizar a busca do algoritmo Minimax é a Poda a-b. Nela, o algoritmo elimina galhos da árvore que comprovadamente não podem trazer resultados melhores para o agente, interrompendo a busca naquele trecho da árvore. Desta forma, o tempo de processamento é reduzido, mas o resultado da busca é o mesmo nas duas técnicas (Korf, 2996). Um exemplo pode ser dado na Fig. 3. Na árvore da Fig. 3, o agente MAX faz a avaliação dos três primeiros estados, determinando a A1 o valor -2. Ao analisar A2-B1, encontra o valor -4. Assim, assumindo que MIN fará sempre a melhor jogada, pode esperar que MIN escolha -4 (ou um número menor, dependendo da avaliação das outras 2 opções) se sua escolha for A2. Portanto, pode “podar” a busca nesse galho da árvore, pois não encontrará valores mais favoráveis do que encontrou em A1. Passando para o nó A3, faz normalmente a avaliação, encontrando o valor -1, não havendo poda. Há, portanto, uma economia no tempo de processamento da árvore, especialmente para buscas de profundidade maior. Figura 3. Árvore com Poda a-b. A implementação da Poda a-b no algoritmo Minimax otimizou consideravelmente o tempo de processamento durante a busca. A Fig. 4 mostra tempos de agentes a profundidades diferentes na árvore de jogadas: Figura 4. Gráfico comparativo entre o algoritmo Minimax com e sem Poda a-b. Anais do XV ENCITA 2009, ITA, Outubro, 19-22, 2009 6 Portanto, a utilização da Poda a-b no algoritmo Minimax revelou-se de grande utilidade para a otimização do tempo de processamento. 3.2 Patologia do Minimax Em jogos cuja árvore de jogadas pode ser completamente explorada, utiliza-se o resultado do jogo como função utilidade, geralmente +1 para o ganhador e -1 para o perdedor. Contudo, devido ao problema da extensão da árvore de busca do Mancala, o algoritmo Minimax teve de ser programado utilizando uma heurística como função utilidade aproximada, utilizando a diferença da pontuação nas Kahalas dos dois jogadores. Em jogos de agentes que utilizam essa heurística de diferença de pontuação (doravante denominado agente canônico) para avaliar os estados, observou-se que, em certos jogos, agentes com profundidade de busca menor conseguiam melhor desempenho do que agentes com busca mais profunda. Por exemplo, em uma partida entre um agente com busca de profundidade de 2 jogadas contra um agente de profundidade de 6 jogadas, o placar final obtido foi de 29x19, com vitória do primeiro, cuja procura na árvore de busca foi mais rasa. A literatura explica esse comportamento como “Patologia do Minimax”, que ocorre quando a heurística de avaliação não é próxima o suficiente da função utilidade. Isto é, fazendo uma avaliação errônea dos estados do jogo, o agente é levado a acreditar que está fazendo uma boa escolha, quando na verdade acontece o contrário. Como agravante, quanto maior a profundidade da busca, maior é o ruído que esse erro causa na escolha do agente, na raiz da árvore, levando-o a executar jogadas ruins. (Abramson, 1986). Para contornar o problema, deve-se utilizar uma heurística que aproxime com maior exatidão o valor de utilidade de cada estado do jogo. Para determinar essa heurística, foram combinadas as técnicas de Minimax (com Poda a-b) e de Algoritmos Genéticos, apresentada na seção seguinte. Melhorando a precisão das jogadas do agente, espera-se que o efeito da patologia seja minimizado, indicando que a avaliação de uma heurística otimizada se aproxima mais da função utilidade do que o agente canônico. 4. Algoritmos Genéticos Algoritmos Genéticos são uma subclasse de algoritmos evolucionários cujo objetivo principal é a otimização de processos, através da determinação de pontos quase-ótimos de máximos ou mínimos de uma função de avaliação. A teoria por trás dos Algoritmos Genéticos é baseada na Teoria da Evolução de Darwin, que leva à afirmação de que indivíduos mais adaptados a um meio tendem a sobreviver nele por mais tempo e perpetuar seu código genético através das gerações. Nesse sentido, o Algoritmo Genético deve atuar sobre uma população de indivíduos, sendo cada indivíduo um candidato a máximo ou mínimo global da função que se deseja analisar. Através de restrições feitas aos indivíduos, análogas à hostilidade do meio para indivíduos biológicos, os melhores entre eles vão sendo naturalmente classificados para transmitir suas informações genéticas para as próximas gerações, onde se busca a convergência para um indivíduo quase perfeito, ou seja, uma solução quase ótima para o problema de maximização ou minimização da função analisada. O algoritmo é interrompido quando é atingida uma condição de parada. As vantagens desse tipo de algoritmo sobre outras arquiteturas de busca são sua capacidade estocástica de analisar os pontos do domínio da função, evitando máximos e mínimos locais, e sua capacidade de economizar processamento (em relação a uma busca exaustiva), por selecionar apenas uma pequena amostra do domínio para análise. Além disso, por ser um algoritmo de busca de ordem zero, não envolve derivadas na modelagem do problema, o que permite a ele ser aplicado a funções descontínuas ou até discretas. Por outro lado, o algoritmo não garante a determinação exata de um ponto de máximo global, mas sim pontos de valor muito próximo a ele. A implementação do algoritmo requer uma função de avaliação, ou função fitness, para a qual se deseja determinar um ponto quase-ótimo de máximo ou mínimo. Essa função deve atribuir, a cada ponto do domínio, um valor real. Analogamente à Biologia, essa função representa as imposições do meio sobre os indivíduos. Sobrevivem e perpetuam suas características apenas os indivíduos bem adaptados a esse meio, ou seja, apenas indivíduos com altos valores de função fitness (seu fenótipo biológico). Os pontos do domínio são usualmente codificados segundo a base binária, transformando cada um em uma cadeia de números 1 ou 0. Analogamente à Biologia, essa cadeia representa o “código genético” do indivíduo (ou o seu genótipo biológico).O algoritmo inicia sua busca escolhendo um número pré-determinado de indivíduos do domínio. Essa escolha pode ser feita através da simples geração aleatória de cadeias de números 1 e 0, para domínios sem restrições. Caso haja mais restrições para o domínio, outras técnicas de escolha de candidatos pode ser usada, como a iteração aleatória, que produz indivíduos estocasticamente até que um deles satisfaça as restrições do problema e possa ser considerado um candidato válido para a execução do algoritmo. Depois de escolhidos os indivíduos (ou candidatos) iniciais, cada um deles é testado segundo a função fitness, e seus desempenhos são armazenados em um vetor. Segundo a Teoria de Darwin, os mais adaptados tem mais probabilidade de perpetuar seu código genético. Assim, alguns desses indivíduos são escolhidos estocasticamente, com probabilidade proporcional ao seu desempenho da função fitness, para se reproduzirem e gerarem descendentes. Indivíduos de baixo desempenho na função fitness têm baixa probabilidade de transmitir seu código genético para gerações futuras, o que 7 Anais do XV ENCITA 2009, ITA, Outubro, 19-22, 2009 garante que o algoritmo caminhe sempre no sentido correto da busca (aumento da avaliação fitness dos indivíduos). Entretanto, é necessário que os indivíduos de baixo desempenho também tenham alguma probabilidade de ser escolhidos, para prevenir o algoritmo de uma convergência precoce para um ponto de máximo ou mínimo local da função. Computacionalmente, atribui-se a cada indivíduo uma probabilidade de ser escolhido para a reprodução, baseada no desempenho deste na função avaliadora. Assim, seja uma população de p indivíduos, e f(xi)=di, com i=1,2,...,p, o desempenho de cada um. A probabilidade P de escolha de um indivíduo é definida como sendo: d Pi = p i ∑ d k =1 k (2) Escolhidos os indivíduos, dá-se início ao processo de reprodução. Assim como na Biologia, a reprodução se dá combinando-se os códigos genéticos dos pais, num processo chamado Crossover. Nesse processo, o código genético de cada um dos pais é dividido em um mesmo ponto, escolhido aleatoriamente, entre o i e o (i+1)-ésimo bit de sua representação binária. A seguir, os trechos de código são trocados, gerando dois novos indivíduos. Esses indivíduos contêm uma mistura de características dos pais, e se aproximam de uma combinação das características que mais se adaptam ao meio, isto é, se aproximam de um valor de máximo ou mínimo global da função analisada. Computacionalmente, se são escolhidos dois pais x e y de uma representação com m bits: x = (b , b , b ,..., b ) 0 1 2 m−1 y = (c , c , c ,..., c ) 0 1 2 m−1 (3) Então, após o Crossover, são gerados dois novos indivíduos: w = (b0 , b1, b2 ,..., bi , ci+1, ci +2 ,..., cm−1) (4) z = (c , c , c ,..., ci , b , b ,..., b ) 0 1 2 i+1 i +2 m−1 Antes de serem proclamados novos candidatos do algoritmo de busca, os indivíduos da nova geração devem passar por uma operação de mutação, que varre todos os bits dos novos indivíduos, alterando-os de 1 para 0 ou de 0 para 1, segundo uma pequena probabilidade (geralmente entre 2% e 5%). Como no correspondente biológico, esse processo busca novas características, contempladas ou não por outros indivíduos já existentes, que possam ser relevantes para a determinação de um quase-ótimo. Além disso, a mutação ajuda a desviar o algoritmo de uma convergência a um máximo ou mínimo locais. Depois de sofrerem uma pequena taxa de mutação, os indivíduos da nova geração tem seu valor fitness calculado e armazenados em um vetor. Esses desempenhos são comparados com os da população inicial, e os melhores deles (incluindo a população inicial) são selecionados para formarem a população da próxima iteração do algoritmo. A Fig. 5 exemplifica o processo. População inicial aleatória Seleção da nova geração Avaliação Fitness Condição de parada? NÃO Escolha probabilística dos pais Avaliação Fitness dos filhos Mutação Figura 5. Esquema do Algoritmo Genético Crossover SIM FIM 8 Anais do XV ENCITA 2009, ITA, Outubro, 19-22, 2009 Dessa forma, o algoritmo busca convergência para pontos do domínio que sejam quase-máximos ou quase-mínimos globais da função analisada. 4.1 Otimização da heurística de avaliação com Algoritmos Genéticos Como explicado, a heurística da função utilidade aproximada empregada pelo agente canônico era simplesmente a diferença de pontuação nas Kahalas. Para refinar essa heurística, de modo a criar um agente otimizado, foram elaboradas sub-heurísticas de avaliação, sendo cada uma delas uma condição ou característica do estado analisado. Assim, a heurística geral foi definida como uma combinação linear do valor dessas sub-heurísticas ξ, que são: 1. Diferença de pontuação na Kahala; 2. Possibilidade de jogar novamente: 1 unidade para cada oportunidade; 3. Mobilidade própria: 1 unidade para cada cavidade não vazia; 4. Mobilidade do adversário: 1 unidade para cada cavidade não vazia do adversário; 5. Aglutinação de pedras em uma das cavidades: 1 unidade para cada cavidade com número de pedras maior que 6; 6. Número total de peças em sua parte do tabuleiro; 7. Número de peças opostas a cavidades vazias do adversário (propensas a ser capturadas); A cada uma dessas n características foi atribuído um peso λ, sendo a avaliação do estado do ponto de vista do jogador pi definida como a heurística Hi(s): u ( s) = H ( s) = ∑ λ ξ , s ∈ S i i j j n (5) Os pesos λ das característica foram determinados através da utilização de um Algoritmo Genético. Contudo, no entendimento de que o jogo é dividido em fases, nas quais o objetivo do agente se altera, a heurística de avaliação foi dividida em três partes: - Início: até 25% das peças capturadas - Desenvolvimento: de 25% até 75% das peças capturadas - Finalização: mais que 75% das peças capturadas Essa estratégia de resolução do problema acaba por triplicar o número de variáveis envolvidas. Na utilização de Algoritmos Genéticos, observa-se que problemas de dimensão grande (maior que 10) geralmente são de difícil convergência. De fato, depois de vários testes, observou-se que o desempenho dos agentes mistos obtidos era pouco satisfatório. Para lidar com essa questão, elaborou-se um novo esquema: cada uma das sub-heurísticas (a partir da 2ª) foi testada em conjunto com a heurística 1, separadamente das outras e com peso unitário – isso porque a heurística 1 foi considerada como extremamente relevante em testes prévios. Assim, o número de variáveis foi reduzido a três por vez, e os resultados destes testes puderam mostrar quais das sub-heurísticas se destacavam na avaliação dos estados. A função fitness utilizada nestes teste foi a pontuação do agente de características mistas contra o agente canônico (cuja heurística é simplesmente a diferença de pontuação na Kahala), em jogos de profundidade 1, 2, 3, 4, 5 e 6 jogadas (iguais para ambos os agentes). Como explicado anteriormente (na seção 2.3), os jogos foram efetuados duas vezes, comutando-se o agente que fazia a jogada inicial, a fim de cancelar os efeitos da assimetria estatística da primeira jogada. Depois de selecionados os melhores indivíduos de cada sub-heurística, foi realizado um outro teste, ainda efetuando partidas contra o agente canônico, mas agora cobrindo todas as combinações de profundidades – agente canônico e agente misto com profundidades de 1 a 6, totalizando 36 jogos. Repetindo as partidas, trocando-se o jogador inicial, totalizaram-se 72 jogos por teste. A Tab. 3 mostra o desempenho de alguns dos melhores indivíduos dos agentes de heurística mista, sendo combinados com a sub-heurística 1 com peso unitário. A exceção é o desempenho da própria sub-heurística 1: neste caso, ela foi implementada pura, com o objetivo de determinar a relação de pesos ótima nos três estágios do jogo. Nota-se uma discrepância no desempenho dos agentes entre o primeiro e o segundo teste. Isso ocorre porque a avaliação utilizada em cada teste foi diferente, como explicado: o teste 1 foi rápido para fazer uma triagem, enquanto o teste 2 foi mais preciso e, por isso, mais demorado. 9 Anais do XV ENCITA 2009, ITA, Outubro, 19-22, 2009 Tabela 3. Valores encontrados para os melhores desempenhos das sub-heurísticas Sub-heurística testada 1 2 3 4 5 6 7 Média da pontuação do melhor indivíduo (teste 1) 24,875 26,25 28,25 27,25 30,5 36 33 Vitórias contra o agente canônico (teste 2) 50% 50% 36% 50% 36% 50% 50% Fazendo-se testes sobre combinações utilizando os pesos das sub-heurísticas 1, 2, 4, 6 e 7, chegou-se à conclusão de que a combinação com o melhor desempenho envolvia os parâmetros 1, 2 e 7, respectivamente: diferença de pontuação na Kahala, possibilidade de jogar novamente e peças propensas a ser capturadas. De posse dessa informação, utilizou-se novamente a técnica dos Algoritmos Genéticos para determinar qual o melhor peso multiplicativo para cada uma dessas características, em cada um dos momentos do jogo. A função fitness utilizada foi o esquema de 72 jogos citados anteriormente. Isso elevou enormemente o tempo de processamento, mas entregou resultados bastante otimizados. Empregando-se uma população de 16 candidatos, com fator de mutação de 5% e 10 gerações, o algoritmo demorou 10h30min para rodar em um computador trabalhando com clock de 2,2GHz. Isso demonstra o fato de que esse tipo de algoritmo não é adequado para aplicações de tempo real. 5. Resultados Depois de definido o melhor dos indivíduos entre os dois algoritmos, realizaram-se testes entre ele e o agente canônico, com profundidades variando de 1 a 8. As pontuações são mostradas nas Tabelas 4 (canônico joga primeiro) e 5 (misto joga primeiro). Os placares mostram a pontuação do agente misto, seguida pela pontuação do agente canônico. As partidas em que o agente misto perde ou empata estão em destaque. Tabela 4. Placares dos testes em que o agente canônico joga primeiro. A coluna da esquerda indica as profundidades utilizadas para o jogador misto, enquanto a primeira linha indica as profundidades utilizadas para o jogador canônico. Misto\Can 1 2 3 4 5 6 7 8 1 (34, 14) (34, 14) (34, 14) (38, 10) (32, 16) (25, 23) (25, 23) (25, 23) 2 (34, 14) (34, 14) (34, 14) (31, 17) (27, 21) (38, 10) (41, 7) (40, 8) 3 (26, 28) (28, 20) (31, 17) (31, 17) (38, 10) (32, 16) (33, 15) (28, 20) 4 (28, 20) (28, 20) (31, 17) (27, 21) (25, 23) (32, 16) (33, 15) (28, 20) 5 (41, 7) (41, 7) (14, 34) (30, 18) (30, 18) (30, 18) (26, 22) (33, 15) 6 (21, 27) (22, 26) (22, 26) (20, 28) (20, 28) (28, 20) (26, 22) (21, 27) 7 (32, 16) (33, 15) (9, 39) (7, 41) (14, 34) (14, 34) (14, 34) (32, 16) 8 (39, 9) (39, 9) (40, 8) (30, 18) (30, 18) (30, 18) (26, 22) (41, 7) Observa-se que, na segunda tabela (agente misto jogando primeiro), o número de vitórias do agente misto é maior, ilustrando o fenômeno causado pela assimetria estatística discutida anteriormente. De todos os jogos realizados neste último teste, o agente misto, otimizado com Algoritmos Genéticos, obteve vitória sobre o agente canônico em 89% das partidas. Isso mostra que o algoritmo proporcionou uma melhora expressiva no desempenho do agente. 10 Anais do XV ENCITA 2009, ITA, Outubro, 19-22, 2009 Tabela 5. Placares dos testes em que o agente misto joga primeiro. A coluna da esquerda indica as profundidades utilizadas para o jogador misto, enquanto a primeira linha indica as profundidades utilizadas para o jogador canônico. Mis\Can 1 2 3 4 5 6 7 8 1 (34, 14) (34, 14) (34, 14) (38, 10) (38, 10) (38, 10) (33, 15) (37, 11) 2 (34, 14) (34, 14) (34, 14) (43, 5) (40, 8) (40, 8) (33, 15) (23, 25) 3 (35, 13) (34, 14) (27, 21) (43, 5) (42, 6) (42, 6) (40, 8) (34, 14) 4 (36, 12) (40, 8) (36, 12) (37, 11) (33, 15) (33, 15) (33, 15) (18, 30) 5 (43, 5) (40, 8) (35, 13) (37, 11) (37, 11) (37, 11) (33, 15) (42, 6) 6 (42, 6) (40, 8) (30, 18) (37, 11) (37, 11) (37, 11) (33, 15) (42, 6) 7 (38, 10) (40, 8) (38, 10) (34, 14) (38, 10) (38, 10) (31, 17) (33, 15) 8 (38, 10) (40, 8) (38, 10) (34, 14) (38, 10) (38, 10) (37, 11) (33, 15) A eficiência do agente ainda apresentou alguns problemas em grandes profundidades (6 e 7) quando este não era o jogador inicial, mas recuperou-se na profundidade de 8 jogadas. Como o tempo de processamento para análises mais profundas do que 8 são inviáveis, pode-se dizer que o efeito da patologia do Minimax foi reduzido neste caso. Já nas partidas em que o agente era o jogador inicial, observou-se eficiência em todas as profundidades. Isso é um sinal de que a heurística chegou tão próxima de uma avaliação exata, que a patologia não se faz presente a esse nível. Talvez haja sinais da patologia a níveis mais profundos; contudo, como esses níveis não são utilizáveis na prática (por requererem elevado tempo de processamento), pode-se considerar a heurística do agente como muito próxima à função de avaliação real do jogo. Como sugestão de trabalhos futuros, podem-se procurar novas sub-heurísticas relevantes à otimização do agente, bem como refazer a otimização, considerando-se somente o caso em que o agente joga em segundo. Assim, criar-se-iam duas heurísticas separadas, agindo quando o agente realiza a jogada inicial ou não. 6. Conclusões Do trabalho realizado, conclui-se que os Algoritmos Genéticos são eficientes na otimização de processos, mas que sua implementação exige correções empíricas dos parâmetros utilizados, como tamanho da população, taxa de mutação e função fitness. Seu tempo de processamento é proporcional à dimensão do problema estudado, podendo ter tempo de processamento inviável para dimensões muito grandes. Pôde-se observar que o algoritmo Minimax procura jogadas boas à medida que a heurística de avaliação utilizada esteja próxima do valor real do estado. Para heurísticas ruins, evidencia-se ruído na tomada de decisão quando o agente procura a grandes profundidades da árvore de busca, fenômeno ao qual dá-se o nome de “Patologia do Minimax”. A Poda a-b revelou-se de grande utilidade no algoritmo Minimax, uma vez que traz os mesmos resultados em menor tempo de processamento. Isso é uma otimização crítica quando se utilizam esses cálculos como fitness em um Algoritmo Genético, no qual o Minimax tem que ser efetuado inúmeras vezes. A otimização da heurística do Minimax através de Algoritmos Genéticos mostrou-se eficaz, gerando um agente otimizado capaz de derrotar um agente simples na maioria das partidas realizadas. A amenização do efeito da patologia do Minimax e o desempenho melhorado do agente nas partidas mostra que se alcançou de fato uma heurística muito mais próxima à função de avaliação exata do jogo, gerando jogadas mais inteligentes por parte do agente. Portanto, como visto, alcançou-se o objetivo de otimizar o algoritmo Minimax em questão de tempo de processamento e de qualidade das decisões. 7. Agradecimentos Agradeço ao Prof. Dr. Paulo Marcelo Tasinaffo pelo imenso apoio e ensinamentos, que tornaram possível não só a conclusão deste trabalho, como também um grande aprendizado na área de Inteligência Artificial. Agradeço também ao CNPq que, através do suporte financeiro, torna possível a execução deste e de outros trabalhos, contribuindo para a formação de jovens pesquisadores brasileiros. Anais do XV ENCITA 2009, ITA, Outubro, 19-22, 2009 11 8. Referências Bibliográficas Abramson, B. An explanation and cure for minimax pathology. In: Proc. of First Conf. on Uncertainty of Artificial Intelligence, North-Holland Publishers, 1986, pp. 495-504. Alves, C. Planejamento online para robô móvel baseado em amostragem esparsa e macro-operadores. Tese de Mestrado – Instituto Tecnológico de Aeronáutica, São José dos Campos. 2007. Alves da Silva, A. P. Tutorial Genetic Algorithms. Learning and Nonlinear Models. Vol. 1, No. 1, pp. 43-58, 2003. Fritzsche, H. Programação Não-Linear análise e métodos. São Paulo: Edgard Blücher: Ed. da Universidade de São Paulo, 1978. Haurie, A; Krawczyc, J. An Introduction to Dynamic Games. 2000. Disponível on-line em http://www.docstoc.com/docs/9171268/Mathematics---Introduction-to-Dynamic-Gamesdecision-theory. Acesso em 23/01/2009. Korf, E. Artificial Intelligence Search Algorithms. University of California, 1996. Mitchell, M. An Introduction to Genetic Algorithms. The MIT Press: Massachusetts Institute Technology, 1996. Nascimento Jr., C. L.; Yoneyama, T. Inteligência Artificial em Controle e Automação. 1. ed., São Paulo: Edgard Blucher Ltda., Fapesp, 2000. Russell, S.; Norvig, P. Artificial Intelligence A Modern Approach. Second Edition, New Jersey: Pearson Education, 2003. Wismer, D. A.; Chattergy R. Introduction to Nonlinear Optimization A Problem Solving Approach. Second Printing, New York: Elsevier North Holland, Inc., 1978.