Trusses are triangulated structures, who’s members, by virtue of the triangle and tetrahedron, are in either pure tension or compression. Inspired by the beauty and ubiquitous nature of trusses in the built environment, and a mechanical engineering project at CMU, I created an optimization algorithm for altering the geometry of a truss. The algorithm attempts to find the lightest and stiffest geometric configuration of a truss.
GENETIC ALGORITHMS (GA)
Genetic algorithms are optimization algorithms which mimic the process of evolution to search for optimal solutions to a given problem. This involves making a set of ‘genomes’ or variables which describe an individual solution. The genomes are evaluated for ‘fitness’. The fittest genomes make it to the next round, and the weaker genomes are replaced by the offspring of the fittest genomes. In the process of ‘mating’ , mutations, or random changes to the genome’s variables, are made. This allows for the algorithm to search a wide area in the parameter space. After repeating this process many times the average fitness of a population can increase dramatically, thus finding a better set of solutions than than the initial set.
In the case of my truss genetic algorithm (coded in matlab) the variables of an individuals genome were the coordinates of each node. Individuals were evaluated for fitness using a weighted sum of the individuals stiffness relative to an applied load and the total mass of the individual. (remember individuals are representations of trusses).
Because of my interest in the process of genetic algorithm optimization and the properties of trusses, it was important for me to see the GA running realtime. To do this I incorporated a user interface and display for the genetic algorithm (see first image).
Using this algorithm I input simple trusses and observed the various solutions that the genetic algorithm came across. I made physical models of the input and output of an optimization run (see below images). The output of the GA was converted to a 3d mesh, which was then unfolded using rhinoUnfolder.