In this thesis, I use analytical and computational techniques to study the development of codes in evolutionary systems. We only know of one instance of such a genetic code in the natural world: our own DNA. However, the results from my work are expected to be universally true for all evolving systems. I use mathematical models and conduct experiments with avida, a software-based research platform for the study of evolution in "digital organisms." This allows me to collect statistically powerful data over evolutionary timescales infeasible in a biological system.
In the avida system, Darwinian evolution is implemented on populations of self-replicating computer programs. A typical experiment is seeded with a single ancestor program capable only of reproduction. This ancestor gives rise to an entire population of programs, which adapt to interact with a complex environment, while developing entirely new computational capabilities. I study the process of evolution in this system, taking exact measurements on the underlying genetic codes, and performing tests that would be prohibitively difficult in biological systems.
I have focused on the following areas in studying the evolution of genetic codes:
Information Theory: I treat the process of reproduction as a noisy channel in which codes are transmitted from the parent's genome to the child. Unlike most channels, however, evolution actively selects for codes received with a higher information content, even if this increased information was introduced via noise. A genetic code consists of information about the environment surrounding the organism. As a population adapts, this information increases, and can be approximated through measuring the reduction of per-nucleotide entropy - in effect sites freeze in place as they code for useful functionality. In the avida system, we know the sequence of all genomes in the population, and new computational genes can be identified as they are formed.
The Evolution of Genetic Organization: Organisms incapable of error correction (such as viruses) develop strong code compaction techniques to minimize their target area for mutations, the most prominent of which is overlapping genes. Higher organisms, however, are capable of reducing their mutational load and will explicitly spread out their code, cleanly segregating their genes. I investigate the pressures behind overlapping or segregation of genes, and demonstrate that overlaps have a side effect of drastically reducing the probability of neutral mutations within a gene, and hence hindering continued adaptation. Further, in a changing environment, overlapping genes have a significantly reduced ability to adapt independently. I compare overlapping and singly expressed sections of code in avida, and show a significant (two-fold) difference in the average per-site variation. I also demonstrate the evolutionary pressure for organisms to segregate their genes in a fluctuating environment to improve their adaptive abilities.
Evolving Computer Programs: I explore evolution in digital genetic codes, and isolate some of those features of a programming language that promote continuous adaptation. In the biological world evolution gives rise to complex organisms robust to changing situations in their environment. This increase in complexity and "functionality" of the organisms typically generates more stable systems. On the other hand, as computer programs gain complexity, they only become more fragile. If two programs interact in a way not explicitly designed, the results are neither predictable nor reliable. In fact, computer programs often fail even when put to the use for which they were explicitly intended. Computational organisms, however, have a level of robustness more akin to their biological counterparts, not only performing computations, but often doing so in a manner beyond the efficiency that a human programmer could produce.
Finally, all of this work is tied together, and future directions for its continuation are explored