“So far, we have been able to study only one evolving system and we cannot wait for interstellar flight to provide us with a second. If we want to discover generalizations about evolving systems, we will have to look to artificial ones.” - John Maynard Smith.


My research resides somewhere at the intersection of artificial life, evolutionary biology, and evolutionary computation. I am broadly interested in how evolutionary processes remain open-ended, continuously generating increasingly complex organisms. My work is a mishmash of using digital evolution to study general properties of evolving systems and of drawing inspiration from natural evolution and its byproducts to develop new evolutionary computation techniques and representations. Below are some of my current research projects. If anything is of interest to you, feel free to contact me!

Evolving event-driven programs with SignalGP

Genetic programming (GP) is the application of natural principles to evolve computer programs rather than by writing them by hand. The types of programs that are easily evolvable depends on the underlying programming representation - i.e., the way we organize and interpet programs.

SignalGP is a new GP technique designed to give evolution direct access to the event-driven programming paradigm where computations are triggered response to signals from the environment, from other agents, or that are internally generated. I designed and developed the initial version of SignalGP in 2017, resulting in a paper and a talk at GECCO 2018 where I demonstrate the value of giving evolution direct access to the event-driven paradigm.

I am currently working on several extensions to the SignalGP representation, such as function regulation, multi-representation SignalGP, and multi-level/hierarchical SignalGP.

Card image cap

Major transitions in individuality

Major transitions in individuality redefine what it means to be an individual: formerly independent individuals unite to form a new, more complex lifeform. Examples include the evolution of eukaryotes, multicellularity, and eusocial insect colonies. From a computational perspective, major transitions in individuality result in distributed systems.

The goal of this research is to develop a digital model for studying biological evolutionary transitions, allowing us to ask general questions about their dynamics. In the context of evolutionary computation, a system capable of transitions in individuality would be useful for allowing evolution to incrementally build distributed solutions. I am currently working to extend the SignalGP represention to allow co-evolving programs to unite to form hiearchically organized programs.

Example heat map of the optimal SignalGP programs evolved using 50 replicates of MAP-Elites, showing that below a certain ‘similarity threhold’ (how closely signal tags must match function tags in order for the signal to trigger the function) this particular problem is unlikely to be solved with less than approximately 20 functions. See this paper for full figure context.

Exploring genetic programming systems with MAP-Elites

MAP-Elites is an evolutionary computation technique that has proven valuable for exploring and illuminating the genotype-phenotype space of a computational problem. In MAP-Elites, a population is structured based on phenotypic traits of prospective solutions; each cell represents a distinct combination of traits and maintains only the most fit organism found with those traits. The resulting map of trait combinations allows the user to develop a better understanding of how each trait relates to fitness and how traits interact.

If we define a MAP-Elites map with traits associated with different aspects of our genetic programming representation (e.g., functions, program length, etc.), we can use MAP-Elites as a tool to explore how different aspects of different representations interact across different problems. Are there trade-offs between different aspects of our representation? Are there parts of representation-space that are unlikely to yield solutions? Exploring our GP representations in this way may inform how we configure things such as variation/mutation or selection operators.

This project is an ongoing collaboration with fellow devolab student, Emily Dolson.

The evolution of phenotypic plasticity and gene regulation

Phenotypic plasticity is the capacity of a genotype to express different phenotypes (e.g., traits or characteristics) in response to different environmental conditions. Plasticity is often leveraged as a strategy to cope with heterogenous environments. In computer science, our computer programs are often plastic in the sense that they may perform different computations in response to different types of input. The programmatic underpinning of many types of computational plasticity are flow control statements (e.g., if or while). In biological organisms, the genetic underpinning of many types of phenotpyic plasticity is gene regulation.

The goal of this research is to study the step-by-step process by which gene regulation and phenotypic plasticity evolve. See this paper for work using Avida to observe the step-by-step process by which phenotypic plasticity evolves. Currently, I am working on extending SignalGP to allow for more biologically inspired forms of function regulation, making it a good model for studying the process by which gene regulation and any resulting phenotypic plasticity evolves.

This figure shows time slices of the ancestral lineages of dominant digital organisms from 100 independent replicates of evolution using the Avida Digital Evolution Platform. Each lineage is represented as a vertical sequence of states over time where states are defined by the phenotype of ancestral organisms on the lineage. State changes imply a change in phenotype along the lineage. In this particular condition, digital organisms must evolve a form of phenotypic plasticity: the ability to alter their phenotype depending on the current state of the environment. In this case, the environment cycles between two possible states at a regular interval. Time (updates) flows from top to bottom of the figure. The environment is given by the left-most vertical bar. Each lineage state sequence is represented by a single vertical bar, and states along the sequence are denoted by color. This type of visualization lets us see, at a glance, how lineages traversed phenotype space in route to the evolution of phenotypic plasticity. For full context on this experiment and visualization, see this paper.