O projeto tem como objetivo desenvolver um algoritmo genético capaz de reproduzir uma imagem que lhe foi dada.
A imagem utilizada é do formato .pgm
no padrão P5
. Este formato é um arquivo binário que descreve uma imagem em escalas de cinza, com cada byte variando de 0 a 255.
Este projeto foi desenvolvido na disciplina SCC0713 e possui apenas fins educacionais.
Link da apresentação: clique aqui.
Geração de imagens procedurais através de algoritmos evolutivos. Um bom artigo que introduz a ideia é o apresentado no link.
O algoritmo foi desenvolvido utilizando a linguagem C++
, juntamente com a biblioteca OpenGL
.
No algoritmo evolutivo, foram implementados métodos que avaliavam diferentes combinações de seleção e rearranjo da população, o que permitiu uma comparação entre os métodos para o problema proposto. Tais implementações envolviam:
- Elitismo:
- juntamente com mutação variável e genocídio.
- juntamente com mutação variável e predação randômica.
- juntamente com mutação variável e predação sintética.
- juntamente com mutação variável e uma combinação qualquer entre os 3 métodos de rearranjo propostos.
- Torneio:
- juntamente com mutação variável e genocídio.
- juntamente com mutação variável e predação randômica.
- juntamente com mutação variável e predação sintética.
- juntamente com mutação variável e uma combinação qualquer entre os 3 métodos de rearranjo propostos.
Com a execução do algoritmo, imagens similares a este:
Imagem Original | Imagem Construída |
---|---|
Para cada estratégia diferente de Elitismo, tem-se que:
elitismo0
: Elitismo + mutação variável + genocídio.elitismo1
: Elitismo + mutação variável + predação randômica.elitismo2
: Elitismo + mutação variável + predação randômica + genocídio.elitismo3
: Elitismo + mutação variável + predação sintética.elitismo4
: Elitismo + mutação variável + predação sintética + genocídio.elitismo5
: Elitismo + mutação variável + predação randômica + predação sintética.elitismo6
: Elitismo + mutação variável + predação randômica + predação sintética + genocídio.
As comparações entre os melhores de todos foram construídas em um gráfico de gerações por fitness:
Os gráficos contendo a comparação entre o melhor de todos e a média populacional para cada estratégia podem ser observados na pasta Gráficos.
Para cada estratégia diferente de Torneio, tem-se que:
torneio0
: Torneio + mutação variável + genocídio.torneio1
: Torneio + mutação variável + predação randômica.torneio2
: Torneio + mutação variável + predação randômica + genocídio.torneio3
: Torneio + mutação variável + predação sintética.torneio4
: Torneio + mutação variável + predação sintética + genocídio.torneio5
: Torneio + mutação variável + predação randômica + predação sintética.torneio6
: Torneio + mutação variável + predação randômica + predação sintética + genocídio.
As comparações entre os melhores de todos foram construídas em um gráfico de gerações por fitness:
Os gráficos contendo a comparação entre o melhor de todos e a média populacional para cada estratégia podem ser observados na pasta Gráficos.
Pode-se comparar as estratégias utilizadas por meio de um gráfico comparativo entre o melhor de todos para cada estratégia. O gráfico de gerações por fitness é:
O algoritmo rodou por 1 hora e meia, utilizando a estratégia do torneio3, em uma imagem de 100x100 pixels atingindo um fitness satisfatório de 8985.7/10000.
Imagem Original | Imagem Construída |
---|---|
Para reproduzir o programa é necessário ter instalado:
- Make
- C11++
- Glut/OpenGL
Para executar, basta executar os comandos abaixo na pasta do projeto:
make all
make run