Genetic/Evolutionary algorithm - Painter

Viewed 490

My task:

Create a program to copy a picture (given as input) using primitives only (like triangle or something). The program should use evolutionary algorithm to create output picture.


My question:

I need to invent an algorithm to create populations and check them (how much - in % - they match the input picture). I have an idea; you can find it below.

So what I want from you: advice (if you find my idea not so bad) or inspiration (maybe you have a better idea?)


My idea:

Let's say that I'll use only triangles to build the output picture.

My first population is P pictures (generated by using T randomly generated triangles - called Elements).

I check by my fitness function every pictures in population and choose E of them as elite and rest of population just remove:

    To compare 2 pictures we check every pixel in picture A and compare his R,G,B with
    the same pixel (the same coordinates) in picture B.
    I use this: 
           SingleDif = sqrt[ (Ar - Br)^2 + (Ag - Bg)^2 + (Ab - Bb)^2]
    then i sum all differences (from all pixels) - lets call it SumDif
    and use:
           PictureDif = (DifMax - SumDif)/DifMax
    where
           DifMax = pictureHeight * pictureWidth * 255*3

The best are used to create the next population in this way:

    picture MakeChild(picture Mother, picture Father)
    {
             picture child;
             for( int i = 0; i < T; ++i )
             {
                      j //this is a random number from 0 to 1 - created now
                      if( j < 0.5 ) child.element(i) = Mother.element(i);
                      else child.element(i) = Father.element(i)
                      if( j < some small % ) mutate( child.element(i) );
             }
             return child;
    }

So it's quite simple. Only the mutation needs a comment: So there is always some small probability that element X in child will be different than X in his parent. To do this we make random changes in element in child (change his colour by random number, or add random number to his (x,y) coordinate - or his node).

So this is my idea... I didn't test it, didn't code it. Please check my idea - what do you think about it?

1 Answers
Related