It's been a long time since I looked in to it, but I believe that viruses get inserted anywhere in the genome between two other genes. I think there was (is?) a bug that prevented viruses from being inserted in either the very first or very last position, that made anti-virus especially useful.
This is correct. A quick inspection of the code shows that the intent at least is to insert the virus after a random selected stop statement. I have not walked through it lookign for bugs or to test the boundary conditions, but this is clearly the intent.
Either way, viruses just aren't a good way to totally mix two different genomes. It takes time to copy DNA in to a virus (I think it's 2 cycles per bp or 2 bps per cycle), viruses take a lot of energy to produce, relatively speaking, and there's too huge a chance of something going wrong to make it a viable reproductive strategy.
I agree. Viruses are a cumbersome way to sexually reproduce today. While I think it can be done today, it is fragile and time consuming as you say and I agree we need something better. This is why I am soliciting suggestions as to better methods for willign bots to share DNA, one's which perhaps do not have the same cost w.r.t cycles. And it's 2 cycles per bp.
Also, while I appreciate Eric's position on not implementing recombinant strategies explicitly, the process of properly lining up two DNA strands and performing cross-over events is just way outside the domain of DNA, and doesn't match the relatively high level tools involved in other places (want to reproduce? Store a positive number to .repro).
So here I disagree. Asexual reproduction through .repro is essentailly cell division. It can be simple because it is simple. You divide, the new cell gets the same DNA as the old. Simple. There's no real reason not have the simulator handle all the underlying mechanics for this because there isn't a lot of variation possible in how to do it other than what poercentage of your resources to give the offspring, which we allow the DNA to specify. There's no possiblity of time shifting cell division for example, no possibility of not being in physical proximity when it happens, no need for specieis recognition or mate selection, etc.
But there is a vast multitude of possibles ways to sexually reproduce, for two bots to coordinate in how, when and where to to produce an offspring that has DNA from both. One bot lays eggs, another comes along hundreds of cycles latter and fertilizes them. Another scatters pollen shots to the wind and reproduction only happens when a female gets polinated. A male and a female have sex through ties and the female carries the sperm DNA from the male around for awhile before giving birth. A female "kills" the male by injecting it with her DNA which casues it to recusively reproduce offsprign with DNA from both, etc.
We want evolution to be able to produce all of these ways of combining DNA, all these behaviours and all that goes with them, from species recognition to courtship and sexual selection to male-male competition for mates. In particular, we do not want to hard code only one way into the simulator.
I think there are some simple ways for bots to do crossover themselves if we gave them some low level basic primitives to enable it. It needs some fleshing out, but I might propose a model like the following:
We create a
crossover point base pair that does nothing other than decorate the DNA and define places to cut it for the purposes of crossover and recombination. There can be as many crossover points in the DNA as a bot likes, they can be anywhere in the genome, inside of genes or out. Then, we provide a .mkgamate sysvar which causes reproduction but with only half the bot's DNA. The "offspring" would contain every other alternating section of DNA between crossover points. Think of it as an egg. We could even just reuse .repro and use negative numbers. We could make an even value take the even sections and an odd value take the odd....
Then we could define a shot type that did the same thing I.e shot a "sperm" shot with the gamate DNA. The act of a gamate shot hitting an egg or vice versa would combine the two gamate DNA strands. Note how simple this is. If an odd sperm shot hits an even egg or vice versa, you get perfect alignment if the species are the same or close to it and you can expect the offspring to be largly functional. What we do in odd-odd cases is up to us. I assume we do nothing and you end up with a disfunctional mutant bot.
We could implement a .shareDNA that does the same thing using ties for syncronous sexual reproduction and so on.
We put no restrictions on sex between disimilar species - we do not want to get into the game of the simulator definign what is and is nto a species - but crossing over radically different DNA will likely naturally result in a disfunctional mutant, creating selection pressure towards better species recognition.
The point is that now everything is in the DNA, not the simulator. The number of cross over points, qwhere they are in the genome, species recognition mechnisims, the method of sex itself, whether it is time displaced involving eggs and sperm shots or syncronous with ties or some other means, etce. and it is all subject to mutation and evolution. All we did was provide a simple mechanism to facilitate it.
At the very least, I think that process needs to be implemented and made available to bots in some way. The number of cross over events can be controlled through DNA, and when and how to find two DNA strands and what to do with the new one can be controlled by the bots in some way, but the core process of mixing to DNAs is just way too complex and basic a task.
So maybe we are closer than we think. I agree with the above execpt for the last 17 words.