evox-a: types of interaction

Erwin Driessens
6 min readOct 19, 2022

--

We have seen that growth is possible just by making random choices of where to add new cells to a body. Thousands of different bodies can be grown that way and each will be unique. Some smaller, some larger, some flatter, some longer, some more dense, some more open, but still… basically all of them are like specks of dust. Members of the same 'family of forms', sharing the same origins, a common process of development.

The main quest of the evox software is to explore many different processes of growth, and see if and how they lead to different types of form.

(this article builds on the foundations of the previous one: https://notnot.medium.com/evox-a-a-first-implementation-f52b0e27875e)

Let’s consider the current minimalistic setup: a number of body-bots that move along the body randomly, while adding cells to that body. Instead of the ‘uninformed’ random choice of their next position, they could use an ‘informed’ choice. The body-bots could be equipped with sensors with which they can probe their environment and then make choices based on that information.

Two obvious sources of contextual information in the minimalistic environment:

  1. The local configuration of cells around a body-bot. A bot could scan the nearby cells and process that information in some way. If could for instance compute the local density, the surface area, orientation and what not. Once multiple cell types are supported, a bot could of course sense these are well, and incorporate this refinement as additional information.
  2. The configuration of the body-bots relative to each other. A bot could scan the environment and detect the other bots. Direction and distance to each of the other bots can be processed as contextual information. Richer data would be available if the bot could also sense the ‘type’ of the other bots. It could then potentially respond differently depending on the type.
Figure illustrating the two kinds of context information for the body-bots (yellow) moving along a body (gray): the local cell configuration (green) and the relative body-bot positioning (blue).

If bots have traits that can be observed by other bots, and take these traits into account while making choices, the variety of interactions will increase. As a thought experiment, consider 'affinity': attraction (positive variant) and repulsion (negative variant) between a pair of body-bots. Note that affinity need not be symmetrical: bot A can like bot B but bot B might not like bot A. In addition to positive and negative affinity, there is also the neutral case, where a bot doesn't care about the other.

A simple and straightforward mechanism that uses single bits to indicate the presence of specific traits, the affinity with each of those traits, and the their polarity, could work as follows:

0110  # trait bits of bot B (0: absent, 1:present)
1100 # affinity mask of bot A (0: don't-care, 1: care)
---- bitwise AND operator
0100 # effective traits of bot B for bot A (0: no, 1: yes)
# we now know which traits of bot B are important to bot A
# next we will determine whether they lead to a positive or to a
# negative response.
$ firstly we count the number of positive responses:
0100 # effective traits of bot B for bot A (0: no, 1: yes)
1010 # polarity mask of bot A (0: negative, 1: positive)
---- [bitwise AND operator]
0000 # count bits: 0 positive traits
# to find the number of negative responses we need to work with
# the inverted polarity mask:
0100 # effective traits of bot B for bot A (0: no, 1: yes)
0101 # inverted polarity mask of bot A (0: positive, 1: negative)
---- [bitwise AND operator]
0100 # count bits: 1 negative traits
# finally the total affinity is computed by subtracting the negative # counts from the positive: 0 positive
1 negative
-- [minus operator]
-1 # final affinity 'strength': -1 = A is slightly repelled by B

In this example 4 traits were used. Depending on the settings of the trait bits, the affinity and polarity mask, the final strength will be somewhere in the range [-4 .. 4]. Negative strength means that the bot is repelled by the other, positive strength means it is attracted to it.

The traits as used here are totally abstract qualities, they only serve the purpose of establishing a variety in possible responses. In a biological setting, examples of traits could be ‘dangerous’, ‘slow’, ‘smart’, ‘tasty’ etc. A bot could then have a positive affinity with ‘slow’ and ‘tasty’ and a negative affinity with ‘dangerous’ and ‘smart’. Just an example! While running evox-a experiments, trait bits, affinity and polarity masks will initially be set to random values and later be subject to evolution.

Once evox will work with several cell types, a similar mechanism can be used to implement cell type affinity. A bot could then be drawn to certain types of cells and avoid others, or be neutral. This could lead to the formation of paths and barriers, further differentiating the body-bot behaviors with just a little extra complexity in the code.

Random sample: single cell type, 4 body-bots, zero bot-bot forces. 2 bots stepping towards a surface cell with the highest local density, 2 bots stepping towards a surface cell with the highest local surface area.
Random sample: single cell type, 4 body-bots, zero bot forces. All bots stepping towards a surface cell with the lowest local density. The grid boundaries become evident here!
Random sample: single cell type, 4 body-bots, specifics not documented, but using a variety of destination step finding functions and bob-bot forces.

An elegant mechanism to tie the bot-cell and bot-bot affinities together would be to treat affinities as force vectors. Each bot can then undergo the forces exerted by the cells in its local neighborhood, plus the forces exerted by the other bots. All these partial forces can be added together to find the resultant force vector. The force vector approach makes it easy to add even more sources of influence, if needed.

64 curves of how force could be related to distance. X-axis: distance, Y-axis: attenuation.

Forces usually vary with distance. Two common examples: a force that gets weaker the larger the distance is (a pulling magnet); a force that gets stronger the larger the distance is (a pulling spring). We can also imagine weirder cases where the push/pull responses are more complex, but still vary with distance. For our experiments 64 different curves were designed that describe a distance — force attenuation relationship.
Similar to the bot-bot affinity, the bot-bot force curves need not be symmetrical. Each body-bot can in principle apply a different curve for each other body-bot. Bot A might use curve 15 for bot B, and bot B might use curve 41 for bot A. For the time being, these curves will not change during the lifetime of a bot.

Random sample: single cell type, 4 body-bots, specifics not documented, but using a variety of destination step finding functions and bob-bot forces.

Now that forces act on the body-bots, it makes sense to add a concept of ‘friction’. A bot will not move if the force acting on it has a magnitude below a certain threshold. This threshold will be one of the bot hyperparameters, subject to evolution.
Adding this quality will result in more bots that stand still. These stationary bots will continue to influence the other bots, via the bot-bot forces. Stationary attractors/repellers could lead to more regularity in the growths, which at this point of time is a welcome feature!

(next: https://medium.com/@notnot/evox-b-a-next-iteration-9d86c0b635d)

This is a work in progress… to be continued…

--

--