The evolution prize got me thinking about my personal goal for Darwinbots, emergence of proper multibots in Darwinbots. This is what I want to start working on in Darwinbots to mark the end of my programming sabatical.
There are 13 areas I think Darwinbots needs to be expanded in order to allow for naturally arising multibots that are more than algae carpets. Before I get the these, though, I'd like to list the multibot "archetypes". Each of these forms needs to be well supported in the system IMO. More importantly, these forms need to be fairly evolutionarily stable for some given environment. That means my ant bot shouldn't "devolve" into a bunch of solitary cannibots.
- Ant colony - A single reproductive "parent" that is cared for by sterile children. Only the parent reproduces.
- Squid Bot - A simple multibot that moves by using fluid dynamics and "jet" propulsion. This is primarily a test of the physics engine.
- Slime Mold - A sort of long distance multibot. A colony of organisms that can coordinate large scale actions across large distances. Like how a slime mold coallesces into a "slug" from millions of free living individuals.
- Worm bot - Any multicellular creature that has a clear morphology. A large colony of plants that tie to everything doesn't count. The simplest way to imagine this is a 2 bot multibot that produces babies that grow into 2 bot multibots.
Below are the 13 features. None of these are really new, the idea is that I'm listing specific features that I'd like to implement before all others, and simplifying a number of them into "first iterations" that can be expanded later as desired.
1.
Codules - Codules are excellent at allowing for iterative development (in theory anyway).
2.
3D - Although probably not strictly required, if the bots lived in true 3D, it would increase the number of dimensions the bots need to worry about. Ideally this would mean that sneak attacks and evasion are more practical.
Most sysvars can be easily expanded with a 3rd dimension. Eyes are the only real conceptual issue. I was imagining projecting the existing eyes into 9 squished pyramids, and adding another set that runs perpindicular.
The only difficulty as I see it is visualization. But I've played around with OpenGL and I don't think it should be that hard.
3.
Membranes - Tied into the implementation of 3D. Membranes would provide the surface area that fluid dynamics would act against, relieving ties of this conceptual burden (allowing them to strictly be joint connectors), and allowing the concept to work equally well in 3D and 2D. The membrane follows the countours of the bots that make it up. I'm still working on the details.
4.
Pheremones - Signals that bots leave on the environment. Bots can "ping" their environment for a certain signal, and receive both a magnitude (how strong the signal is) and a gradient (in which direction is the signal increases the strongest). Pheremones can be either "sticky" (they don't diffuse very quickly) or diffuse (spreads quickly). Would allow for modelling of chemical communication, or "smell". For instance, if every bot pumps out a constant pheremone strength every cycle, "grouping" behavior like that seen in locusts and slime molds is easy enough to implement. Another example, ant bots could leave pheremone trails for navigation ("sticky" of course), allowing us to get rid of the xpos/ypos pair.
5.
Specialization - In the past I've probably overdesigned this, which has led to "programmer's block". The idea here is to build something simple that will obviously encourage specialization. Basically there are "roles" that bots can have. These would be:
- plant - can spin light into gold (or nrg anyway), allows the building of chloroplasts
- animal - can build muscle
- vision - can see
- movement - can us .up, .dn. and any turning commands
- shooter - can fire shots
- tie feeder - can use non hard ties to feed
- tie communicator - can use hardened ties to communicate
- constructor - can build substances (shell, slime, body, etc.)
- digestor - can digest substances (see metabolism)
- some other roles I haven't thought about yet.
Turnging on roles costs nrg, but turning roles off does not. The more roles a bot has, the more nrg it has to pay every time it uses the associated skills or as an upkeep every cycle. I'm still working on the specifics. There's a quadratically better efficiency as you have fewer and fewer roles. That is, 10 specialized bots are going to use less nrg than 1 generalized bot. Very simple. Should allow people to expand in the future if necessary, while providing for a concrete implementation in the here and now.
6.
Sexual reproduction - Pretty obvious that this is necessary. I'll implement the method I've been pushing (crossing over across "zipped" up regions). I'll also try to implement some form of diploidity, by crossing over the DNA when the two DNAs come into the same bot, and setting one of the resulting DNA strands as "dominant", meaning it runs all the time.
7.
Desctructable shapes - Shapes that are destructable. A shape is hit by a -6 shot gets a small chuck taken out, and returns a shot made up of a substance I'll arbitrarily name "Hard". When a "Hard" shot hits a bot, the bot "ingests" some Hard, and increases in mass and volume. Bots can defecate Hard like they can waste. When a Hard shot runs out of nrg, it turns back into a small chunk of a shape.
Hard could also be tied into substances. Probably you could use hard to make shell. When your shell starts breaking down during a fight, you'd leave little drifting pieces of Hard (drifting miniscule shapes).
Realistically, Hard should stick to other Hard to prevent the complete breakdown of all shapes. If two chunks of a shape drift into each other, they'd fuse. There are a few other details to work out, but I think the idea is solid. Could be computationally expensive unless some collision complexity reduction algorithms are used.
Primarily the reason for this is to create 1) Ant nests and 2) ant lions. If a bot can hide in a small hole it's made, it can attack a bot that can't see it until it's too late. A heavily shelled bot might also be hard to distinguish from a floating shape.
8.
Realistic physics, esp. for ties and membranes. If done right, a bot should be able to build a large tower made up of other tied bots that's relatively stable. Like a tree. This is where integrating a 3rd party physics library is important.
Membranes should allow the creation of squid bots, wings, parachutes, and other structures.
9.
Tie communication - Bots need to be able to manipulate data across multiple ties in a single cycle. The primary purpose of this is to allow for "brain cells" that can communicate between themselves and other "cells" efficiently.
10.
Phylogenic tree with event finder - If you store all simulation data (total nrg, average nrg, number of individuals, etc.) and compare it with a phylogenic tree, the program should be able to isolate significant evolutionary jumps.
This is important for understanding the primary order of new phenotypes that develop.
11.
Body divided into fat, chloroplasts (or maybe cellulose?), and muscle. I've mentioned this recently.
12.
Metabolism. Like Pheremones, I think I overthought this and built up a system that was fundamentally more complex than needed. This is my attempt at an attainable simplification:
- Bots primarily battle to attempt to kill each other with -1 shots. When a bot is killed, it becomes a corpse and is available for consumption.
- Corpses are composed of either chloroplasts, muscle, fat, or waste (venom and poison become waste).
Body shots return a homogenic "bite" out of the corpse (they can still be used on living bots. The effect is the same). - Body shots return a shot composed of protochloroplasts, protomuscle, protofat, and waste. Proto substances need to be digested into their core components (primarily nrg at the moment, but in the future we could have them decompose into more substances). Anything the bot can't digest, along with waste, needs to be expelled as waste. Proto substances are worthless otherwise except as ballast (they do have mass and volume)
- When a bot digests a substance, it has an attrition rate. The attrition rate is the amount of the digestion that creates waste instead of nrg or whatever else.
- The more specialized a bot is between Protochloroplasts, Protomuscle, and Protofat digestion, the lower its attrition rate. This is non linear (meaning the more specialized you are the increasingly more efficient you are).
The idea for this is that we should be able to create stable ecosystems of at least 3 species (one plant, one herbivore, one carnivore), possibly greater. Evolution won't break it. Also, multibots will have an advantage in that different "cells" can digest different compounds, allowing them to specialize while still being part of the same organism.
Specialization of digestion might be Lamarckian in nature. That is, entirely automatic as the bot feeds. You'll become more efficient as you gain more nrg from a particular source. Eat more muscle, and you'll automatically become better at digesting muscle.
13.
Tie controls. - Highly dependant on how ties actually end up working, but bots need a way to control the physics of multiple ties (and membranes) in a single cycle.
------------------------------------------------------------------------------------------------------------
I'll also probably try to bring some of the changes I made in the C++ source into the VB source. At the moment, I'm also playing with the idea of moving everything into C#. The primary thing that caused me problems in C++ was GUI maintenance.
VB into C# should be a fairly straight port.
Please leave thoughts/rants.