Ben Burdette showed Namaste and me a remarkable lifesim program called Nanopond. This program, in relatively few lines of C, gets closer than I ever have to something that I have been trying to do for some time. It is behavioral evolution, by evolving not a neural network on a continuous plane (as I have tried), but by evolving virtual machine code on a discrete grid.
I think I can use almost exactly this genome for my bacteria game. I would like to change a few things here and there. For example, an organism can “eat” a neighboring organism if the value in the register at the end of execution matches the first four bits of the genome of the target. However, the only operations available for changing the value of the register are INC and DEC. So an organism that starts with instruction 0 (RESET) is much more susceptible to attack than one whose first instruction is b (KILL, maybe?). That is, the code for an organism that eats the former kind can be just KILL, where as the latter kind you’d need something like DEC DEC DEC DEC DEC KILL. There’s no reason the latter kind should be harder to eat, and that’s why I don’t think you see many predators in this simulation.
Instead, I’d like to replace INC and DEC with an ADD instruction that takes its next instruction as an argument. So that way everything but instruction 0 is equally easy to eat: ADD n KILL, where n is the signature (first four bits) of the target.
I’d also like to try to add more support for multicellular organisms. I’m not quite sure how to do that, but I’m not sure nanopond’s genome is capable of that. If I’m going to make this a massively parallel simulation a la ElectricSheep (which is my current intent), then I want the genome to be capable of multicellular organisms because we might just get one, which would be amazing. My current idea is to allow cells to trigger execution of neighboring cells.
I’m pretty sure I can code up a proof of concept by GameDev (Tuesday).