You are on page 1of 9

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.

Parâmetro Valor Descrição

Tamanho da população >2 e ser divisível por 2 O número de indivíduos em


uma simulação será dada
pelo usuário, onde deve ser
maior que 2 e ser divisível
por dois, para garantir o
cruzamento.

População fixa ou variável Fixa A ideia de que no


cruzamento cada casal possa
gerar dois filhos é para
manter a população sempre
com a quantidade fixa, sendo
assim, ao longo das
gerações o número de
indivíduos permanece o
mesmo.

Taxa de cruzamento Dada pelo usuário É um valor de 0 até 1, que


indica a probabilidade de
cruzamento entre os pais
solucionados.

Taxa de mutação Ocorre todas as vezes em Determina probabilidade de


que ocorre o cruzamento ocorrência nos cromossomos
gerados.

Número de gerações >10 O número de gerações tem


que ser maior que 10, pois
valores menores que esse
podem ser irrelevantes já que
raramente as soluções
podem ser encontradas com
poucas gerações.

Tamanho dos cromossomos >=8 Para cada rainha é dada uma


posição dentro do
cromossomo, com isso deve
ter no mínimo 8 posições no
cromossomo.

Critério de parada Encontrar uma solução ou Ao obter fitness 0 significa


atingir o valor de gerações que a solução foi encontrada,
estipulado pelo usuário logo, o programa para, caso
o fitness não chegue a 0,
mas a execução atingir o
número de gerações dado
pelo usuário, o programa
também se encerra.

Forma de substituição de Cruzamento uniforme e Para poder realizar a


população mutação em um cromossomo variação dos cromossomos é
de forma aleatória realizada a mutação de todos
os filhos gerados em um
cruzamento, onde apenas um
cromossomo será mudado
para um valor aleatório.

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.

● Geração: A geração consiste em fases de populações, em que essa população ao


decorrer das gerações podem realizar o cruzamento, passando as melhores soluções
da geração para a geração posterior. Lembrando que em todas as vezes que acontecer
o cruzamento em uma geração, os filhos gerados pelo cruzamento sofrerão a mutação
dos genes e substituirão a população na próxima geração.
● Reprodução: Metade da população é selecionada para reproduzir e gerar a próxima
população, acasalam-se aleatoriamente e mais de uma vez entre si até que o número
de população gerado seja igual ao número estipulado para a antiga geração
● População: Quantos indivíduos deverá possuir em todas gerações.
● Tamanho do cromossomo: Quantas rainhas vão estar no tabuleiro, o que gera
também a dimensão do tabuleiro.
● Taxa de divisão dos cromossomos entre os pais: A porcentagem de cromossomos
de partição entre os pais que irá ficar para os filhos.

Para os testes de resultados, foram realizadas 10 execuções por testes, como é


apresentado na Tabela 1. Como pode ser visto na Tabela 1, no teste 1 apresentou uma taxa de
100%, porém ele demandou muito tempo para a execução total, com isso foram realizados
novos testes buscando equilibrar o tempo de execução com a taxa de acertos, onde o valor
ideal foi atingido no teste 4, que apresentou 100% de acertos e um tempo consideravelmente
rápido.
Teste Gerações Tamanho Tamanho do Taxa de Taxa de Taxa de
da cromossomo reprodução divisão do acertos
população cromossomo

0 1000 500 10 0.7 0.5 90%

1 1000 1000 10 0.7 0.5 100%

2 100 1000 10 0.7 0.5 0%

3 800 1000 10 0.75 0.5 90%

4 800 500 10 0.85 0.5 100%

5 800 50 10 0.85 0.5 70%


Tabela 1: Resultados dos testes com 10 rainhas.

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

0 1000 50 8 0.7 0.5 100%

1 500 100 8 0.5 0.5 100%

2 100 100 8 0.5 0.5 40%

3 100 100 8 0.8 0.5 70%

4 200 100 8 0.8 0.5 80%

5 100 100 8 0.99 0.5 70%


Tabela 2: Resultados dos testes com 8 rainhas.

É possível verificar no gráfico da execução na Imagem 1 de um teste unitário que o


gráfico do fitness médio, ou seja, a média do fitness de acordo com a população diminui com o
passar das gerações, o que é de se esperar, já que o valor do fitness ao chegar em 0 identifica
que foi encontrada uma solução, logo os valores convergem a 0.

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.

Na Imagem 3 e na Imagem 4 são apresentados os gráficos que correspondem


respectivamente ao fitness médio em todas as gerações e o melhor fitness em cada geração,
porém com 10 rainhas.

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

Linden, Ricardo 2008. Algoritmos Genéticos - uma importante ferramenta da


inteligência computacional - 2ª Edição. 2008.

Darrel Whitley, "A Genetic Algorithm Tutorial", Computer Science Department,


Colorado State University.

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.

USP. Problema das oito rainhas. Disponível em:


<http://www.vision.ime.usp.br/~pmiranda/mac122_2s14/aulas/aula20/aula20.html
>. Acesso em 05 de ago. 2022.

You might also like