Making Stripes[draft]
Conway’s Life showed how simple local rules can produce a rich set of global dynamic patterns. We emulated this behaviour with an AND program by wiring up the input and output registers of neighbouring cells using a threshold sensor. These threshold sensors played the same role as our single-celled models, transducing an environmental state into a binary input that our program can work with.
Having an AND program embedded in the cellular automaton changes the game. Instead of playing with a fixed set of rules and exploring the patterns produced, we can evolve the rules to produce a particular pattern. Let’s start with trying to produce a simple set of stripes.
Targets, Topology, and Plasticity
TODO: Actually we should have discussed topology before this back and the initial rumba and food animations.
The aim is to produce a set of vertical stripes.
There are a few other decisions to make. As well as the size and separation of the stripes, Life is played on an infinite grid. However, we want to constrain ourselves to something much smaller. So we need to decide on the grid size. A finite grid has edges, so we now need to decide what happens on those edges.
This design uses a ST.rows by ST.cols tube and asks for ST.stripe_count vertical stripes, each ST.stripe_width cells wide, separated by ST.internal_gap blank columns.
In fact, we can do more than that. We can evolve a set of rules to produce different patterns given different initial stimuli.
But we do not want stripes for their own sake. If nothing happens, the grid should stay blank. Only when a stimulus arrives should the pattern appear. Pattern production must be a response to stimulation, not an unconditional habit.
Register Architecture
Unlike Life, where each cell holds a single bit, a cell running an AND program holds one bit for every element in its architecture. Here we use one stimulus input, marking where the signal arrives. One output is pigment, and that is what we select on.
We also need the thresholding we introduced for Life, since a cell must respond to how many neighbours are active rather than merely whether one is. So each cell emits two signals into its Moore neighbourhood, and each signal is read back through its own threshold, one at two neighbours and one at three. Think of these as juxtacrine contacts, signalling that reaches no further than a cell’s immediate neighbours. Two outputs, two inputs. Memory registers supply the internal regulatory layer.
| TypeRegister | Variable | Annotation | |
|---|---|---|---|
| Stimulus | A | ξ | One-step cue applied along the left edge |
| B | |σ₁|≥2 | Receptor for neighbouring σ₁ signals | |
| C | |σ₂|≥3 | Receptor for neighbouring σ₂ signals | |
| Memory | DEFGH | μ₁…μ₅ | Internal state |
| Response | I | σ₁ | Signal σ₁ sent to neighbouring cells |
| J | σ₂ | Signal σ₂ sent to neighbouring cells | |
| K | φ | Pigment scored against the stripe target | |
Measuring fitness
Measuring fitness here asks something new of us. Until now we have scored a single program in one of two ways: as a mapping from a sequence of inputs to a sequence of outputs, or as a controller for a single cell acting in a world. Either way, one cell.
Now the phenotype is spread across a sheet of cells, and it is not there at the outset. It has to develop. So fitness must be measured in two extents at once. Across space, because what matters is the arrangement of pigment over the whole grid, not the state of any single cell. And across developmental time, because the pattern must be reached and then kept.
So we allow a development window, a run of time steps in which activity can propagate outward from the stimulus, as the puffer propagated across the grid. Only after that do we begin scoring, and we score across several successive time steps rather than one. A genome must hold the stripes in place, not merely pass through them.
What we get
The target is not hard to reach, though it takes a good many generations to find.
What is more interesting is that the solutions differ. The same stable stripe pattern is arrived at by quite different developmental routes. Watch several runs side by side and the terminal state is the same while the process that reaches it is not.
Varying the Environment
What happens if we take a rule set evolved on one grid and run it on a larger one? Sometimes the stripes continue, repeating regularly across the whole sheet. Sometimes they do not: a genome that held a stable pattern at the original size produces something irregular at the larger one.
This is worth pausing on, because it puts the evolved rules well outside the conditions they were selected under. Those conditions were narrow by design. No noise, two challenges, one grid size. Nothing asked these rules to work anywhere else.
That some of them do is less surprising than it first appears. We saw repetition arise in Life from local rules alone. Once cells are passing signals to their neighbours, a repeating pattern is close to the natural output of the arrangement, and that capacity seems to come with the shift from a single cell to a collective.
Regeneration
Then something less expected.
We can damage a developed pattern. By ablation here I do not mean removing cells, since the sheet of cells is fixed; I mean resetting them, wiping the state of every cell in some region back to blank. Take a grid with its stripes established and reset the left half.
In many cases, though not all, the stripes regrow. And note the direction. The pattern originally propagated from left to right, from where the stimulus arrived. The repair runs the other way, reforming from right to left across the cleared ground.
So what the rules encode is not simply an ability to extend a pattern outward from a starting point. It is the beginnings of something regenerative: a capacity to restore the pattern from whatever state the sheet happens to be in.
The contrast with Life is sharp. Life gives repetition readily, but not restoration. Wipe half a Life pattern and it does not come back; you get different activity, going somewhere else. Here we get a stability that Life simply does not have, and one that nothing in the fitness function ever asked for.
Noise
We can also introduce noise. Here noise means a burst: on a single time step, every register in every cell has some probability of flipping, set by a biased coin toss whose bias we can vary.
The interesting case starts from nothing. Rather than seeding the sheet with a stimulus on the left, we begin with a blank grid, widen it, and simply apply noise.
Some of those flips act as seeds, and a pattern grows from them. What settles is not the vertical banding we selected for. It is a Turing-like stripe pattern that propagates in two dimensions rather than one.
Once you see it, the mechanism is not mysterious. But it is not what you would expect from a system selected only ever to produce perfectly vertical bands.
What self-organisation gives us
Two things follow. First, the reversal works. We can fix the pattern we want and evolve a rule set that produces it, at least under simple conditions.
Second, and more interesting: because the pattern had to be built by local rules alone, with each cell propagating signals no further than its neighbours, we get capacities we never selected for. Regeneration after ablation. Extension onto larger grids. Pattern formation from noise. None of these were in the fitness function.
That is what self-organisation gives us free. Global pattern from local rules, and rather more besides.
It is worth setting this beside Dawkins’ Biomorphs, which opened this site. There the genotype-phenotype map was a drawing procedure: nine numbers in, a figure out, and nothing between them. Here, for the first time, the map runs through self-organisation, and the self-organising layer is itself evolvable.
That changes what the map can do. And notice where the new capacities come from. They are not encoded in the genotype. They appear because the pattern answers to conditions the genotype says nothing about: how large the sheet is, what shape it is, whether a stimulus arrives and where. A Biomorph has no such conditions to answer to, which is exactly why it has none of these properties.
If we want a map capable of producing multicellular form, self-organisation is not decoration on it. It is what gives the map these properties in the first place.