Aspect-Oriented Genetic Search
In this demo, I use two techniques (mix-in classes and parameterized construction) to create an aspect-oriented implementation of a genetic search (or as aspect-oriented as C++ is capable of, at least). Source code as well as an executable are included.

This approach is a good compromise between fast iteration and code complexity: Finer grained functional decomposition makes it cheap to experiment, easy to test. Mix-ins make it easier to assemble various cross-cutting behaviors without deep (and exponentially many) inheritance chains. Particles is a good example of the sorts of systems that can benefit from this approach. The result is exponentially more behaviors for linearly more code. Examples of both techniques can
be found in MutationGeneticSearch.h

I'm using mix-ins and parameterized construction for AI in my framework, i.e., A* and Genetic Search. I want to mix and match stages of the algorithms and various definitions of my search space, roll in logging and testing services, etc, without defining exponentially many classes. With this scheme, each new policy requires only one new class. Another advantage is that inconsistencies between policies can usually be caught at compile time.

The drawbacks are the ugly syntax of templates and increased compile time. Also, the structure seen here relies on virtual functions, which can be avoided at a slight cost of flexibility (see "Improving Freelists with Policy Based Design" in GPG 5). Finally, this system could be enhanced with compile-time asserts to test whether base classes provide the required services.

An aspect-oriented approach could have been used for the genes and chromosomes in this example, but is an exercise for another day. Chromosomes in this example are arrays of random unsigned ints. Fitness is determined by how correctly the values are sorted. Though you'd never really sort numbers with a genetic search, this Chromosome makes a good test bed because it is easy to visualize and debug. But at the expense of some genuinely ugly template parameters, I was able to put together this experiment very quickly. As it is, this example is already overkill for the small number of behaviors presented, but would "pseudo-aspect" approach will be useful as the number of possible policies grew.


Back to Main Page