An Evolutionary Approach to Generative Art

Background

I am a generative artist, creating digital visual art with hand-coded algorithms. For an introduction and general statement about my work, please see my About page.

Over the past year, I’ve been developing several visual ideas in parallel, always with the idea in the back of my head that one day I would bring them all together into one holistic system. The E__ series is my formal attempt to do just that. This text explains my process and conceptual grounding.


Features

Color

I start with color because it deserves far more attention from generative artists than it often gets. When surveying the world of published generative art, you’ll often find that shapes, patterns, and structures are the only stars of the show. When color is considered by the artist, I’m surprised when color palettes are hand-chosen, rather than generated through code. My work typically generates randomized color palettes, using shifting rule sets to help maintain both variety and cohesiveness of color palettes across a series.

Examples of generative color palettes

Canvas Background

All images begin with a very basic gradient of randomly chosen colors. Most of the time, this gradient is covered by all of the other elements drawn to canvas, but sometimes you will see it poking through.

Ribbons

My ribbons are descendants of a very basic generative visual concept: the random walk. Pick a starting point, a direction to face, and a distance to move. Draw a line as you move in that direction. When you get to your destination, start again by choosing a new direction and distance to move. Manfred Mohr created some great early examplars in 1969 using FORTRAN. Here’s a quick animated example modified from my code base:

A basic random walk

The ribbons in this series are given many more variables in addition to those basics: width, color, transparency, etc. In fact, any one ribbon has at least 22 variables assigned to it that govern how it is drawn. Ribbons also sample the underlying image to help determine the color that it draws, similar to a loaded paintbrush moving through a wet canvas.

Examples of colored ribbons sampling an underlying image

After seeing many different iterations of ribbons being drawn with random variables, I settled on several curated “styles” to include in this series. Some thin, some fat, some chaotic, some gentle.

Examples of curated ribbon styles

Shapes

The E__ series uses several different types of shapes that are chosen and placed randomly on the canvas. Their properties are randomized within a shifting set of constraints. Most of the shapes are quite basic, including circles, rectangles, and lozenges. There is one additional custom shape type I’ve developed that allows for several randomized variables defining its structure. These shapes help give the series an organic feel, like looking at eukaryotes under a microscope.

Some examples of organic shapes

Organization

Containers and shape packing

All of the shapes drawn to screen are further constrained by their inclusion within a larger container. The container itself may be visible or invisible, and can take the form of any of the defined shapes. The shapes inside the container may be spaced regularly or they may be random. They may be allowed to overlap each other, or they may not touch each other, as in shape packing. They may be packed tightly or loosely. If there is more than one container, it may be allowed to overlap another container, or not. Some containers are allowed to overlap, but the shapes within are not. 

Early experiments with overlapping containers packed with shapes

Fields and style probability

A field is a collection of either containers or ribbons. A finished image may have multiple fields of containers, each with its own set of rules for the shapes within, and multiple fields of ribbons, each with its own set of ribbon styles and parameters. Every field type, shape type, and ribbon type has an assigned probability for being drawn in any given image. When many fields are combined, I end up with a rich, detailed image filled with layered patterns and shapes.

An image from Series EEA with many layered fields of ribbons and shapes

Environmental bounds

The overall image dimensions are defined dynamically in code, and all variables related to distance are defined as a percentage of the overall dimensions, so output can easily be scaled to different resolutions. All of the variables that define the shapes, ribbons, containers, fields, and background are governed by environmental minimum and maximum values appropriate to their purpose. Some min/max pairs are obvious and remain static across series, while others can be tuned per series to adapt to different needs like rendering performance, detail density, or overall randomness. 

Genetics

Lastly, all variables that define each image are saved to a corresponding XML file. This file serves as the image’s genetic material. In genetic terms, the .PNG output is the phenotype, and the .XML file is the genotype. Each genotype is saved with a random seed number which allows me to reproduce the work exactly again in the future. 


Nurture

Reproduction

When creating a new image, I can choose to either start a new random genotype from scratch, or use an existing genotype to copy from as the “parent”. When creating a child image from a parent, all of the genetic variables are loaded and then mutated to create a new unique genotype for the child image. I can adjust the rate of mutation with each generation to create offspring that are nearly identical, completely different, or somewhere in between. I’m currently using asexual reproduction (one parent), but this could be easily adapted to sexual reproduction (2 parents), or any other combinatorial mingling of genetic material. 

Images bred over several generations, with a variation rate and variation amount of 0.3

Curation & Breeding

As I’m coding a particular series, I’ll usually render 4-8 images per generation to get an idea of how the code is working. Once I like the direction of the output, I’ll run a large trial, producing up to 100 random parent images. From there, I choose a few of my favorites and continue breeding offspring over several generations until I’m consistently happy with the results. From these multiple generations of descendants, I then curate a final group to publish. The grouping may be curated to demonstrate a progression within the family, or to show the variety across a single generation. The grouping may also highlight completely unrelated images that coincidentally share a convergent feature, such as color. 

A curated group of images from the same family and generation
A curated group of unrelated images chosen for their convergent features

Leaving the Nest

In my curated groups, I practice selective breeding, whereby an individual’s fitness is determined by my own aesthetic interests. My next planned step is to broaden the selective forces to include a wider diversity of aesthetic tastes. The blockchain-based non-fungible token (NFT) marketplace looks to me like an ideal environment to test this experiment, allowing anyone to directly influence which phenotypes are fit enough to survive. Purchased tokens will produce more offspring, while unsold tokens will be burned and not pass down their genetic material. Ultimately, my hope is that we will soon be able to directly observe and measure the evolution of art wrought by market forces. 

Follow me on Twitter or Instagram to see what I’m currently working on, and visit MakersPlace to help participate in this evolutionary experiment through your NFT purchase.