As we indicated in the section entitled "What's in this book" (page ix ), the book is divided up into four parts. In this section, we will have a closer look at their content.
Part I is mainly for the benefit of beginners, so notions are introduced at a relaxed pace. In the next chapter we provide a description of the key elements in GP. These include how programs are stored (Section 2.1 ), the initialisation of the population (Section 2.2 ), the selection of individuals (Section 2.3 ) and the genetic operations of crossover and mutation (Section 2.4 ). A discussion of the decisions that are needed before running GP is given in Chapter 3 . These preparatory steps include the specification of the set of instructions that GP can use to construct programs (Sections 3.1 and 3.2 ), the definition of a fitness measure that can guide GP towards good solutions (Section 3.3 ), setting GP parameters (Section 3.4 ) and, finally, the rule used to decide when to stop a GP run (Section 3.5 ). To help the reader understand these, Chapter 4 presents a step-by-step application of the preparatory steps (Section 4.1 ) and a detailed explanation of a sample GP run (Section 4.2 ).
After these introductory chapters, we go up a gear in Part II where we describe a variety of more advanced GP techniques. Chapter 5 considers additional initialisation strategies and genetic operators for the main GP representation--syntax trees. In Chapter 6 we look at techniques for the evolution of structured and grammatically-constrained programs. In particular, we consider: modular and hierarchical structures including automatically defined functions and architecture-altering operations (Section 6.1 ), systems that constrain the syntax of evolved programs using grammars or type systems (Section 6.2 ), and developmental GP (Section 6.3 ). In Chapter 7 we discuss alternative program representations, namely linear GP (Section 7.1 ) and graph-based GP (Section 7.2 ).
In Chapter 8 we review systems where, instead of using mutation and recombination to create new programs, they are simply generated randomly according to a probability distribution which itself evolves. These are known as estimation of distribution algorithms, cf. Sections 8.1 and 8.2 . Section 8.3 reviews hybrids between GP and probabilistic grammars, where probability distributions are associated with the elements of a grammar.
Many, if not most, real-world problems are multi-objective, in the sense that their solutions are required to satisfy more than one criterion at the same time. In Chapter 9 , we review different techniques that allow GP to solve multi-objective problems. These include the aggregation of multiple objectives into a scalar fitness measure (Section 9.1 ), the use of the notion of Pareto dominance (Section 9.2 ), the definition of dynamic or staged fitness functions (Section 9.3 ), and the reliance on special biases on the genetic operators to aid the optimisation of multiple objectives (Section 9.4 ).
A variety of methods to speed up, parallelise and distribute genetic programming runs are described in Chapter 10 . We start by looking at ways to reduce the number of fitness evaluations or increase their effectiveness (Section 10.1 ) and ways to speed up their execution (Section 10.2 ). We then point out (Section 10.3 ) that faster evaluation is not the only reason for running GP in parallel, as geographic distribution has advantages in its own right. In Section 10.4 , we consider the first approach and describe master-slave parallel architectures (Section 10.4.1 ), running GP on graphics hardware (Section 10.4.2 ) and FPGAs (Section 10.4.3 ), and a fast method to exploit the parallelism available on every computer (Section 10.4.4 ). Finally, Section 10.5 looks at the second approach discussing the geographically distributed evolution of programs. We then give an overview of some of the considerable work that has been done on GP's theory and its practical uses (Chapter 11 ).
After this review of techniques, Part III provides information for people interested in using GP in practical applications. We survey the enormous variety of applications of GP in Chapter 12 . We start with a discussion of the general kinds of problems where GP has proved successful (Section 12.1 ) and then describe a variety of GP applications, including: curve fitting, data modelling and symbolic regression (Section 12.2 ); human competitive results (Section 12.3 ); image analysis and signal processing (Section 12.4 ); financial trading, time series prediction and economic modelling (Section 12.5 ); industrial process control (Section 12.6 ); medicine, biology and bioinformatics (Section 12.7 ); the evolution of search algorithms and optimisers (Section 12.8 ); computer games and entertainment applications (Section 12.9 ); artistic applications ( 12.10 ); and GP-based data compression (Section 12.11 ). This is followed by a chapter providing a collection of troubleshooting techniques used by experienced GP practitioners (Chapter 13 ) and by our conclusions (Chapter 14 ).
In Part IV , we provide a resources appendix that reviews the many sources of further information on GP, on its applications, and on related problem solving systems (Appendix A ). This is followed by a description and the source code for a simple GP system in Java (Appendix B ). The results of a sample run with the system are also described in the appendix and further illustrated via a Flip-O-Rama animation2 (see Section B.4 ).
The book ends with a large bibliography containing around 650 references. Of these, around 420 contain pointers to on-line versions of the corresponding papers. While this is very useful on its own, the users of the PDF version of this book will be able to do more if they use a PDF viewer that supports hyperlinks: they will be able to click on the URLs and retrieve the cited articles. Around 550 of the papers in the bibliography are included in the GP bibliography (Langdon, Gustafson, and Koza, 1995-2008). 3 We have linked those references to the corresponding BIBTEXentries in the bibliography. Just click on the GPBiB symbols to retrieve them instantaneously. Entries in the bibliography typically include keywords, abstracts and often further URLs.
With a slight self-referential violation of bibliographic etiquette, we have also included in the bibliography the excellent (Poli et al., 2008) to clarify how to cite this book. LATEX users can find the BibTEX entry for this book at http://www.cs.bham.ac.uk/~wbl/biblio/gp-html/poli08_fieldguide.html.