análise do desempenho de arquiteturas de agentes

Propaganda
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.
Download