Sense and Navigability

Our environment will be a simple two-dimensional grid of patches1. Some patches on the grid will be empty, others will be walls that our agent cannot pass through. Our first task is to provide the agent with a means to move. The chosen method

1 I use the word “patch” to avoid confusion with the “cells” that make up the agent itself.

We need to define how our agent will move around the grid world. The simplest approach is give the agent a location in the grid, and a heading (North, East, South, or West). Then, at each time-step, it could optionally rotate to a new heading, then attempt to move forward. It would either go into the adjacent patch, or bump into a wall.

I am going to make our agent less Roomba-like, however, and more like an inchworm. (The reasons for this will become clear later). It will still start with a location and a heading, but it will move in a different way. It will move by stretching its head forward into an adjacent patch at one time-step, leaving its tail behind. In the next time, step it will contract its tail forward to occupy the same patch as its head. So it alternates between occupying one patch and two patches as it moves about.

An amoeba extends it pseudopodia. from here

Actions: Navigating the Environment

The AND program state consists of binary values. So our sensorimotor system must generate and respond to binary signals.

Given a cell with a particular orientation (facing up, down, left, or right), three binary motor commands are sufficient to control how it moves: Stretch, LeftPull, and RightPull.

Movement: If Stretch is on, and the worm currently occupies a single patch, it will attempt to stretch, putting its head into the patch in front of it and leaving its tail in the current patch. This will only succeed if that patch is empty (and not a wall). If Stretch is off, and the worm currently occupies two patches, then it will contract its tail, so that it occupies only the head patch.

Figure 1: A cell moves by stretching and contracting.

Turning: LeftPull rotates the cell 90° to the left, RightPull rotates it 90° to the right. Both commands together flip the cell to face the other way (rotating it 180°). If neither is active, the cell keeps its current orientation. If the cell is stretched (occupying two grid locations), it cannot turn left or right, it can only flip (swapping its head and tail).

Figure 2: Turning and flipping under the same control rules.

We can also drop the same genotype into a tiny hand-built world. In this 5x5 H-shaped tray, the cell replay, activity stripes, and network state all stay locked to the same slider.

Figure 3: The intro genotype embedded in a small H-shaped tray, with simulation, activity, and network state kept in sync.

Binding a Program to the Sensory-Motor System

Sensory Input: To begin, our agent will have just one sensory input: Stretched. This is proprioceptive input indicating whether it is currently stretched (over two-patches) or contracted. We will add further sensors later.

We can put this together in a simple AND program that does basic navigation. We can now produce a regulatory diagram with these labels.

 UNXb_+BNB__*XNBb_->B 
 QZQbb*BNB__+QZQac->C 
 BVBc_*BVB_b+XNU_c->D 
 UVB_b*BVUcb*UNU_a->E 
 BNBb_+BNUb_+BNB__->F 
Figure 4: network