Last updated: April 22, 2007
Evolve 4.0
VOLVE    4.0

History of Evolve

Timeline:

Version 1.0

In 1996 I read a wonderful book by Richard Dawkins, The Blind Watchmaker that in addition to providing a clear description of the workings of evolution it also described some interesting computer software called biomorphs. His biomorphs would evolve by mutating a small set of genes through successive generations. However the selection process was user controlled. The user selected organisms based on whatever criteria they wished.

I got to thinking that it would be more interesting to have a complete simulation of evolution, including a selection process that was based on only one criteria: Survival. I also wanted a more sophisticated mechanism for genes. In biomprphs the genetics were limited to four of five genes (which were just integers).

Richard Dawkins' description of the power of cummulative selection was so convincing that I imagined that a sufficiently good simulation of this process would eventually evolve some very "smart" creatures. And this was the inspiration for this software.

My idea was to create a simple 2-dimensional universe using finite elements. Conceptually the universe would consist of discrete locations (Such as (0,0), (5,4), etc...). There would not be any bounds to this universe (a feature that has since been dropped in version 4.0), and creatures could roam in virtually unlimited directions North, South, East and West. The entities that would inhabit this simple world consisted of organisms. Every organism would occupy one or more locations. The organism would be a series of cells that all had to be physically located next to each other.

Each organism would consist of a genetic program. Each instruction would encapsulate a very simple operation. For example the instruction "REPRODUCE NORTH(#10)" would cause the organism to spawn a copy (with possible mutations) 10 units north of the cell that executed the instruction. Other operations included: MOVE, CONSUME, NEW, DIE. To make the range of behaviors that could evolve more interesting I included GOTO and a few other instructions that were purely programmatic in nature.

In 1996, I had a spare Sun3 workstation that I hoped to run this simulator for months at a time, and periodically I would examine the current universe to see what "smart" creatures had evolved.

Version 2.0

The initial version was not very good. For one thing I didn't have any GUI. The only way to examine the universe was to dump the state of the universe to a text file. I had to use a perl script that converted my simulation files into postscript (which I could then view using Ghostscript). But the results and interactivity was lacking.

So two years later in 1998 I pulled to orginal code off of my Sun workstation (which was headed for a Sunnyvale landfill) and decided to port it to Borland Builder C++. It was very easy to get a simple GUI going and I was very excited to run a simulation and be able to see the simulation results.

During this time I enhanced the instruction set. I realized that in real-life organisms, each cell has a state seperate from the other cells. You nerve cells are different from your skin cells. I added registers and flags and a stack to each cell. The genetic program was shared by all cells in the organism (just like our DNA is common to cells, but each cell does different things based on state).

I continued to enhance this version. I added many nice GUI features like zoom, cut/paste. I would periodically revisit this program and run simulations for a couple of days but I never seemed to evolve anything very interesting.

One of the problems was the unbounded universe. The creatures would just move in a single direction and go off into inifinity. My model for rewarding organisms with energy if they consume other organisms had problems. It was unstable. Depending on the parameters I used, I either got an exponential growth of organisms (and the machine would run out of memory). Or the creatures would die off quickly.

I continued to tweak my universe model. I added a "crowded cells" parameter so that if the carrying capacity of the simulation reached a certain level, then it would become harder and harder for organisms to reproduce. The amount of energy needed to reproduce would dynamically change based on the total number of cells in the universe.

Anyway, after sufficient tweaking the simulation began to exhibit the characteristics of cummulative selection, and I was happy.

Version 3.0

In 2001, I decided to re-implement the entire simulator application in Eiffel. The main goal was to learn eiffel. But I made several improvements to the program during this time. One improvment was adding "barriers" to the universe. A BARRIER is a way to limit the universe to a enclosed region. When I ran the simulator with an enclosure, I began to see much more evolution of smart creatures. They moved around more, and they would change their direction and interact strangely with other creatures.

Unfortunately the Eiffel implementation was my first large scale Eiffel program. It suffered from many problems. Mostly it couldn't handle the constant creation/destruction of objects during the simulation. I love Eiffel, but damn if this app. was just too slow for my needs. Here's the old website for evolve 3.0.

Version 4.0

In 2006, I rewrote the whole thing in C/C++. I hate C++, but I guess over the years I have warmed up to it enough to use it. I do appreciate C++'s performance advantage over Eiffel. And with lots and lots of ASSERT()'s you can protect yourself from endless hours of debugging. This is the latest and greatest version.

Version 4.0 is much improved: