Professional Documents
Culture Documents
Guilherme Vier Lucas Tomalack Diego Dalla: Universidade Estadual Do Oeste Do Paraná
Guilherme Vier Lucas Tomalack Diego Dalla: Universidade Estadual Do Oeste Do Paraná
Guilherme Vier
Lucas Tomalack
Diego Dalla
1. Introdução
O problema apresentado neste documento é referente ao problema conhecido como
oito (8) rainhas, em que consiste na ideia de espalhar oito rainhas em um tabuleiro de
dimensão de 8x8 e nenhuma das rainhas podem se atacar, sendo que os ataques das rainhas
consistem em atacar qualquer outra rainha que esteja na mesma linha, coluna ou diagonal no
tabuleiro. O problema pode ser apresentado com números variados de rainhas, devendo
possuir no mínimo 4 rainhas, sendo que para N rainhas o tabuleiro deve ser de dimensão NxN,
para conseguir alocar as rainhas e que possa ser solucionado.
Existem diversos métodos para encontrar a solução desse problema, o principal deles
sendo a busca exaustiva, mas isso pode demandar tempo de acordo com o grau de
complexidade do problema, então a solução que optamos para o problema apresentado foi o
desenvolvimento de um algoritmo genético que visa buscar a solução por meio de premissa da
evolução de uma população, no qual, esta população consiste na ideia que cada indivíduo da
população é a representação abstrata do problema e que esta população deverá ter uma
evolução por meios de mutações ou reproduções em diferentes gerações, o que impõe um
processo de otimização na busca por soluções com precisão e funcionalidade nas mesmas.
A seguir duas imagens ilustrando as áreas disponíveis e áreas indisponíveis para
alocação de rainhas.
A primeira imagem ilustra apenas uma rainha alocada, as flechas indicam sua área de
ataque, e os quadrados alocados com ‘X’ são áreas disponíveis para posicionar novas rainhas.
Já a segunda imagem mostra como o cenário muda alocando mais uma rainha, mostrando que
as áreas disponíveis para alocação tem uma redução considerável acrescentando uma rainha.
‘ Abaixo, uma imagem ilustrando a solução do problema das rainhas.
Oito rainhas posicionadas em um tabuleiro 8x8, sem que nenhuma rainha fique no campo de
ataque da outra.
.
2. Desenvolvimento
Para o desenvolvimento do algoritmo foi selecionada a linguagem de programação
Python, por fornecer bibliotecas que permitem a elaboração de gráficos para a demonstração
de estatísticas da população ao decorrer das gerações, e também por suas regras semânticas
serem similares às outras linguagens já usadas pela equipe.
Primeiramente, para a implementação do algoritmo genético foi necessário pensar em
como abstrair o problema para o código, sabendo que cada o tabuleiro sempre será NxN e o N
será o número de rainhas em que o tabuleiro deverá possuir, foi elaborado que o cromossomo
de cada indivíduo da população também deveria ser do tamanho N, para poder armazenar as
informações de cada rainha. Além disso, para cada rainha seria necessário encontrar algum
método para armazenar as posições das mesmas, sabendo que nenhuma rainha pode estar
na mesma coluna ou linha, foi criado um array que para cada posição de index representaria a
linha da rainha e o valor naquela posição representaria a coluna, como por exemplo: o valor 6
na 3ª posição dentro do cromossomo, representaria que a rainha da 3ª posição está localizado
na 3ª linha e 6ª coluna no tabuleiro.
Outro fator de extrema importância no desenvolvimento, é a função para calcular o
fitness de cada agente da população, podendo ser calculados de formas diferentes para este
problema, buscando o maior número de espaços livres e não atacantes entre si ou buscar
menor número de rainhas se atacando. No desenvolvimento apresentado neste documento, foi
selecionada a utilização do menor número de rainhas atacando, sendo que aqueles agentes
que conseguirem chegar no fitness como zero (0) demonstra que conseguiram uma solução ao
problema, já que nenhuma rainha estará se atacando.
A fim de evitar que a população piore com o passar das gerações, foi utilizado o elitismo
como método de seleção, onde um determinado número de indivíduos é passado diretamente
para a próxima geração, para tal, foi utilizado 50% como percentual de elitismo, ou seja, serão
selecionados os 50% melhores e dentre esses serão aleatorizados casais capazes de gerar
dois filhos.
Durante a fase de cruzamento são definidos quais características serão passadas para
as próximas gerações após o cruzamento de dois pais aleatórios, optamos por utilizar o
cruzamento uniforme, onde ao invés de segmentar o cromossomo antes do cruzamento, cada
gene com probabilidade fixa é trocado entre os pais, dessa forma, através de um sorteio e uma
probabilidade estabelecida pelo usuário é estipulado qual dos pais irá ceder determinada
característica.
Para garantir variabilidade da população, é pego um cromossomo aleatório de um
indivíduo e seu valor é alterado por outro valor aleatório até N-1, sendo N a quantidade de
rainhas.
O maior problema em relação ao desafio das oito rainhas se dá por conta da dimensão
do tabuleiro, como o tamanho padrão sendo 8x8, porém basta a dimensão do quadrado ser
maior ou igual a 5. A mudança na dimensão do tabuleiro implica diretamente no número de
rainhas que poderão ser manipuladas, sendo elas igual a dimensão do tabuleiro; como NxN
sendo N a quantidade de rainhas que poderão ser postas no tabuleiro, sendo N>=5.
3. Resultados
Para compreender os resultados, abaixo uma definição de cada variável
necessária para a execução do algoritmo genético.
Nos testes com oito rainhas, foi buscado equilibrar novamente a velocidade de
execução com a taxa de acerto, como pode ser visto na Tabela 2. Onde o melhor resultado foi
obtido no teste 1, que teve a mesma taxa de acerto que o teste 0, porém foi mais rápido na
execução, após estes testes, foi buscado diminuir o número de gerações para verificar se
existia alguma possibilidade de conseguir manter a taxa de acerto com menor tempo de
execução, em que com estes testes foi mostrada a importância do número de gerações, já que
todos os testes posteriores ao teste 1 tiveram uma taxa de acerto mais baixa.
Teste Gerações Tamanho Tamanho do Taxa de Taxa de Taxa de
da cromossomo reprodução divisão do acertos
população cromossomo
Imagem 1: Fitness médio por geração com a melhor solução para 8 rainhas da Tabela
2.
Enquanto na Imagem 2, que apresenta os melhores fitness por geração, mostra que
não necessariamente o melhor fitness vai ser o mais baixo, já que as mutações podem
ocasionar uma alteração que vai implicar no melhor indivíduo um fitness maior (pior) ou
também pela geração aleatória de casais que pode formar um dos piores casais para gerar
filhos entre os melhores selecionados, porém em contraste a Imagem 1, mostra que a média de
fitness por geração tem como tendência ir diminuindo, já que as reproduções e mutações irão
fornecer novos caminhos para a solução da população como um todo.
Imagem 2: Melhor fitness por geração com a melhor solução para 8 rainhas da Tabela
2.
Imagem 3: Fitness médio por geração com a melhor solução para 10 rainhas da Tabela
1.
Imagem 4: Fitness médio por geração com a melhor solução para 10 rainhas da Tabela
1.
Após os dois tipos de testes apresentados, foi visto que quanto maior o número de
cromossomos (número de rainhas), maior será o tempo necessário para conseguir achar a
solução, dado que levará maior tempo para calcular o fitness de cada agente da população.
Além disso, foi possível notar que alguns parâmetros influenciam na taxa de acerto das
execuções, como por exemplo o aumento do número de gerações e aumento da taxa de
reprodução, tendo em vista que fornecerá melhores variações da população, também é
possível visualizar uma melhora considerável com o aumento da população, pois assim
aumentam-se as chances de serem gerados indivíduos melhores.
4. Referências
Seron Ruiz, Evandro Eduardo. O problema das oito rainhas. USP. São Paulo, 2006.
Disponível em:
<https://dcm.ffclrp.usp.br/~evandro/ibm1030/exemplos/eightqueens.html>.
Acesso em 05 de ago. 2022.