Pretty cool, Percy.
I played around with developing something like this a while back. I wasn’t too keen on my early attempts, because, like your program here, the selection pressure was driving the organism to a particular solution, rather than presenting a problem and letting random mutations develop their own solution(s). How to program that, though?
The best I was able to come up with was a picture that mutated. I started with a grid of 20x20 squares, each with a random color. Its offspring would mutate by having a random number of squares change its color to a new random color. The human operator would choose a child picture to be the new parent, all other children died away. The selection pressure then became whatever the human wanted it to be. I was hoping that the random picture itself would suggest something. Hey, that kind of looks like an apple/fork/lightning bolt/whatever. The human would then select that child, and as he kept making selections, a nice picture of an apple/whatever would appear.
In practice, it was a flop. At 6 children per generation (the most I could fit on the screen without scrolling), and roughly 15 seconds per generation minimum, it looked to take much longer than my attention span to generate any picture of note. I tried upping the mutation rate, but that caused any pattern that started to emerge to disintegrate. I tried altering the number of squares in the grid, the number of colors available, how far a random mutation could jump along the color scale (e.g. red to orange allowed, red to blue not); nothing seemed to help much. Only by simplifying tremendously — 4x4 grid, 4 colors, selection pressure: blue=good, not blue=bad — did I get anywhere, but that wasn’t very satisfying.