270 CATALYZING INQUIRY
To illustrate, any computable function can in principle be built from the appropriate combination of
Boolean operators (AND, OR, and NOT). But these functions operate at too low a level to build the kind
of hierarchical structures needed to do anything complicated. It is for this reason that high-level pro-
gramming languages have emerged that are not based on these operators directly. Such languages
allow the creation of many other kinds of structure. For example, a program intended to undertake
financial analysis might benefit from an operator or function that would allow finding the average stock
price for the previous month. If its task were to evolve a program for financial analysis, such functions
might be included in the set of primitives from which an evolutionary process might draw.
One important aspect of the evolutionary approach is the ability to evolve new operators or new
functions that can be used subsequently. In some instances, new structures can emerge spontaneously
that are more or less stable; more frequently, it is possible to insert rules that will prevent such struc-
tures from changing. Alternatively, functions can be defined automatically—the environment provides
slots for function and the ability to call on those function (even if they are no-ops), and the subsequent
evolutionary process fills in those spaces with functions.^65
8.3.1.6 More Evolutionary Mechanisms,
The model described above is a very crude model of evolution, incorporating only a few bare
essential features. However, biologists have characterized other features of evolution. Two of the most
important with possible application to computing are coevolution and development; these are dis-
cussed below. Other aspects of evolution, such as diploid behavior and sexual selection, do not at this
stage provide obvious new approaches to computing.
8.3.1.6.1 Coevolution Coevolution refers to the biological phenomenon in which two or more species
interact as they evolve. For example, a host may be susceptible to infection by a parasite. The host
evolves some defenses against the parasite, which in turn stimulates the parasite to evolve ways in
which to penetrate or circumvent those defenses. In coevolution, other species—which are also evolv-
ing—constitute part of the environment in which a given species is embedded.
One application of coevolution to evolutionary programming is to allow the evolution of testing
data simultaneously with the solution. Doing so enables the program to account for a wider range of
input. In this case, one fitness function is required for the program to evaluate how well it performs
against a given set of test data, while a different fitness function is needed for the test data to evaluate
how well it breaks the program.^66
8.3.1.6.2 DevelopmentDevelopment refers to the phenomenon in which biological complexity is shaped
by growth within the organism (what might be called maturation) and the action of environmental
forces on the organism. It is very difficult to create significant complexity using genetic mechanisms
alone. Thus, one intellectual thrust in evolutionary computation focuses on the creation of developmen-
tal mechanisms that can be evolved to better create their own complexity. For example, evolutionary
techniques can be used to evolve neural networks (see Section 8.3.3.2). In designing neural networks,
the problems involve various issues related to the topology and configuration of the network. However,
a grammar can be used to generate structures of interest. (A grammar is a formal system of rules that
can be used to generate far larger structures.) Grammars can evolve as well, with the fitness function
being the complexity of the structures it can generate.
(^65) J.R. Koza, Genetic Programming, 11: Automatic Discovery of Reusable Programs, MIT Press, Cambridge, MA, 1994.
(^66) D. Hillis, “Co-evolving Parasites Improve Simulated Evolution as an Optimization Procedure,” Physica D 42(1-3):228-234,
1990.