alien was especially designed to investigate evolutionary processes. We will explore these processes not by means of evolutionary algorithms, which require a special fitness function, but in a natural way by means of self-replicating machines. To this end, we will use machines that are capable of scanning and rebuilding their own structure. Through various simulation parameters, we can control the mutation rates and thus observe the development and adaptation effects in a real-time session. Some suggestions for further experiments are also given here.
What you will see
1. Setting up
The basic idea is as follows. We start with a relatively small world and put the two crucial ingredients in there: self-replicating machines and food.
Whereby both the machines and the food are in the end only cell clusters, which differ in the composition and the internal programming (cell functions). This is a foundational principle in alien: Everything is based on the same basic building blocks!
The approach of starting with a small world has the advantage that we can see the first results of the initial evolutionary adaptation phase relatively quickly. Once the replicators have adapted to the world, we may scale up the size of the world and exploit the full power of our GPU. Scaling up is also important for another reason: It may happen that small populations die out abruptly due to a spontaneous event or unfavorable mutations.
To proceed, let us first create a small simulation with a world size of 500 x 500 and choose the CUDA parameters as follows (if this make trouble please reduce the number of blocks):
The simulation parameters are absolutely crucial for the evolution of our individuals: we can determine whether we want to create a hostile or friendly world. We choose the default parameters, which are relatively balanced, by clicking on default (see below). Nevertheless, we would like to make a change on cell function properties → constructor → offspring token suppress memory copy:
This is a parameter intended for the constructor cell function. Cell functions are specific to cells and are triggered by tokens. The constructor cell function creates a new cell with or without token by using internal energy. If this parameter is set to true, then it is ensured that when a new cell with token is created, the token memory is empty and not a copy. We set this value to true. As a result, we will make it harder for machines to replicate themselves because the offspring will not get the information transferred into the token of the creator machine. In this way, we are forcing a greater complexity of the machines that will be able to survive.
After creating a new simulation, we first add cell clusters as food. To do this, we create a disc structure (Add disc in Collection menu) with outer radius of 10 and inner radius of 5 and, subsequently, generate 200 copies (Random multiplier in Collection). As replicator we load the collection
./examples/collections/replicator - complex - inspecting.col.
This is a machine that can create offspring without the need to copy its token memory to them. Finally, we generate 20 copies of it.
2. Conducting the simulation
It is best to save the simulation to a file before we start it. The replicators used are somewhat inefficient and have a reproduction rate of only slightly above 1 under the present conditions. Nevertheless, sooner or later they will dominate the entire world. When the initial food has been used up, they begin to fight each other. After a million time steps (this can be read at the bottom left of the info bar) our world could look like this:
This world looks like a merciless battlefield where only the survival of the fittest counts. You can still clearly see the similarity to the initial replicators. If you examine the structures in the editor, you can already see structural and programming differences.
We will now enlarge the world as the next step. This will significantly increase the workload on the graphics card. For example, an enlargement by a factor of 4 causes a reduction of the time steps per seconds by only 50% (of course, this depends on the power of the graphics card). You are invited to experiment a little bit, but to start with you can scale up to 1000 x 1000 units in the General settings dialog (do not forget to check scale content!).
3. Changing crucial simulation parameters
After a longer simulation time, our little machines increasingly accumulate mutations and also become much more efficient than at the beginning. Some may develop a different internal topology and interesting movement patterns. Be curious! Below is a screenshot after 6 million time steps. The machines have gained multi-token capability, which can be seen in the many bright spots.
There are some simulation parameters with which we can bring our world out of balance and increase the pressure on the machines to adapt.
A few relevant ones are mentioned below:
- cell function properties → constructor → cell data mutation probability: Specifies the probability (value between 0 and 1) that a byte in the memory of a newly constructed cell taking a random value. This means that a higher value may lead to mutations that exhibit different behaviors.
- cell function properties → constructor → cell property mutation probability: This is the probability of mutations that vary the spatial position of newly constructed cells. These types of mutations are easily recognized by the appearance of the mutants.
- cell function properties → constructor → cell structure mutation probability: This is used to control mutations that change internal properties such as cell functions, connectivity, or even color.
- cell function properties → weapon → energy cost: You may have noticed that the replicators actively seek energy by attacking other cell clusters. This value controls how much energy such an attack costs. The energy for the attack is emitted by additional radiation. If we choose a higher value here, our individuals will have a more difficult struggle to survive. They have to manage their resources more carefully. One can try to set this value gradually upwards in the hope that more intelligent behavior patterns will form.
Independently from above, lower density worlds are more challenging to survive. To this end, we need to increase the world size without scaling the content.
Have a lot of fun experimenting!
Created with the Personal Edition of HelpNDoc: Qt Help documentation made easy