I was experimenting with a lot of Genetic/Hill Climbing algorithms to generate Art. I started out by trying to approximate a Grayscale image with just lines of varying width and color intensity.
The genetic algorithm is roughly like this:
Algorithm: GA(n, χ, µ)
// Initialise generation 0:
k = 0;
Pk = a population of n randomly-generated individuals;
// Evaluate Pk:
Compute fitness(i) for each i ∈ Pk;
do
{
// Create generation k + 1:
// 1. Copy:
Select (1 − χ) × n members of Pk and insert into Pk+1;
// 2. Crossover:
Select χ × n members of Pk; pair them up; produce offspring;
insert the offspring into Pk+1;
// 3. Mutate:
Select µ × n members of Pk+1; invert a randomly-selected bit in each;
// Evaluate Pk+1:
Compute fitness(i) for each i ∈ Pk;
// Increment:
k = k + 1;
}
while fitness of fittest individual in Pk is not high enough;
return the fittest individual from Pk;
The first image after several geneartions..
I lost the original image I was trying to approximate.. but doesn’t that look like a deer? 🙄 I modified the algorithm several times to approximate my face. This is the original image..
FYI this is what I look like
First Attempt: Program too slow. Had to stop after 10 Hours.
Second Attempt: Rewrote the program to use Numpy arrays and Bezier Curves instead on just Lines. Also now in Technicolor!
Bugfixes & Third Attempt: Atleast it’s converging to something
But I didn’t look like this at all :/ . The problem here was that the fitness function was
\(\sum_{pixel=1}^{NPIXELS} abs(original[pixel] - Generated[pixel])\)
I tried squaring. squaring increases error distance. So fitter drawings would have a higher chance of being selected.
\(\sum_{pixel=1}^{NPIXELS} (original[pixel] - Generated[pixel])^2\)
and it worked (sort of. from an artistic point of view)!
I used this code to generate a lot of images, of different shapes.
My eventual plans were to create a bot which tweets these images. I even wrote a small program that gets a random Picassa image and bezierifies it. Unfortunately, someone else has already done it. And it’s much better than mine. But I learned a lot doing this project.