https://slackermanz.com/understanding-m ... -automata/
Showcase: Expanding on the basic algorithms behind 2D Totalistic Cellular Automata like the well-known "Conway's Game of Life", I present a series of techniques that individually or in conjunction, can increase the complexity and diversity of the resulting patterns generated in these models.
- Multiple Neighborhoods
- Result-Potential Discrimination & Selection
- Cross-Layer Coupling
Of particular note is the tenancy for MNCA models to form soliton-like structures that exhibit individualized, unit-like local identities. These often resemble ball-like particles or worm-like structures of incredible resilience that can interact with each other and their surroundings in a robust and non-destructive manner. Mobile, yet solid-looking wave-like expressions are also common, and appear to 'bounce' along their full contact length when they collide with other waves or structures, doing so with the appearance of elasticity or compressibility.
These structures and expressions seem to be mostly unique to MNCA, and can sometimes be reasonably described using the terminology of agent-based models. Furthermore, their interactions are capable of producing a number of diverse second-order complex interactions and structures.
This second-order emergent complexity can express itself in many ways. These can include structures resembling the way atoms bind and interact to form molecules, predator-prey interactions, or as functional second-order structures with behaviors that do not exist in the isolated units or in alternate configurations of those units.
Due to the increased demand on computation resources required to simulate MNCA, I migrated my work from CPU-based render engine to methods utilizing GPU acceleration for the generation of patterns.
The MNCA technique involves the definition and assessment of more than one unique and separate local group of neighbors for use in a single set of conditional transitions. The terms and layout of such a structure are as follows:
Code: Select all
"ReferenceValue" : Value of this pixel from the reference/previous frame
"NewValue" : Final value that will be output to the next frame
"NeighborhoodAvg" : [Sum / Total] of values at the relative coordinates in the neighborhood
"TransitionCondition" : Specifies a valid range of values for the assessed input
"UpdateFunction" : The method used to change the final output value
Code: Select all
Single-neighborhood CA, such as Conway's Game of Life:
Using 1 neighborhood with 3 transitions:
Get ReferenceValue;
Get NeighborhoodAvg[0];
Set NewValue to ReferenceValue;
If NeighborhoodAvg[0] satisfies TransitionCondition[0]:
NewValue = UpdateFunction(NewValue);
If NeighborhoodAvg[0] satisfies TransitionCondition[1]:
NewValue = UpdateFunction(NewValue);
If NeighborhoodAvg[0] satisfies TransitionCondition[2]:
NewValue = UpdateFunction(NewValue);
Return NewValue;
Code: Select all
Mutiple Neighborhoods CA (MNCA):
Using 3 neighborhoods with 3, 5, and 2 transitions:
Get ReferenceValue;
Get NeighborhoodAvg[0];
Get NeighborhoodAvg[1];
Get NeighborhoodAvg[2];
Set NewValue to ReferenceValue;
If NeighborhoodAvg[0] satisfies TransitionCondition[0]:
NewValue = UpdateFunction(NewValue);
If NeighborhoodAvg[0] satisfies TransitionCondition[1]:
NewValue = UpdateFunction(NewValue);
If NeighborhoodAvg[0] satisfies TransitionCondition[2]:
NewValue = UpdateFunction(NewValue);
If NeighborhoodAvg[1] satisfies TransitionCondition[3]:
NewValue = UpdateFunction(NewValue);
If NeighborhoodAvg[1] satisfies TransitionCondition[4]:
NewValue = UpdateFunction(NewValue);
If NeighborhoodAvg[1] satisfies TransitionCondition[5]:
NewValue = UpdateFunction(NewValue);
If NeighborhoodAvg[1] satisfies TransitionCondition[6]:
NewValue = UpdateFunction(NewValue);
If NeighborhoodAvg[1] satisfies TransitionCondition[7]:
NewValue = UpdateFunction(NewValue);
If NeighborhoodAvg[2] satisfies TransitionCondition[8]:
NewValue = UpdateFunction(NewValue);
If NeighborhoodAvg[2] satisfies TransitionCondition[9]:
NewValue = UpdateFunction(NewValue);
Return NewValue;
Additional reading and alternate implementations:
Jason Rampe ( @Softology, https://softologyblog.wordpress.com ) has written multiple blog posts about my work at various stages of development, and has implemented thousands of provided MNCA and SMNCA patterns in his legendary application, Visions of Chaos. He has also documented a selection of patterns on his YouTube channel.