Petrowski and Ben-Hamid provide a veritable cookbook of evolutionary algorithm (EA) recipes for a wide range of problem domains, while formally characterizing those domains and persuasively motivating the different EAs used in each area. In a mere 216 pages, they manage to convey a general understanding of problem classes and their EAs, the critical algorithmic details of each EA, and sufficient literature reviews to jump-start research or development in these areas.

Briefly “Evolutionary Algorithms” (a) introduces EAs, (b) examines four popular optimization problem classes and the EAs commonly deployed in each, and (c) includes a final chapter on genetic programming (GP). The four optimization classes (continuous, constrained continuous, combinatorial, and multi-objective) represent a very significant chunk of all EA applications, so the book’s scope seems sufficient for programmers tasked with solving real-world problems. Though somewhat orthogonal to the book’s dominant themes, the GP chapter illustrates that EAs can also apply to problems that lack the formal constraints and rigid solution structure (e.g., a fixed-length vector of variable values) common to optimization scenarios: EAs can problem-solve outside the box to display profound creativity.

Although reasonably well balanced, the book seems strongly devoted to continuous optimization, with 100 pages covering the combination of continuous and constrained-continuous methods. In contrast, combinatorial and multi-objective EAs together merit only 46 pages. Each optimization chapter follows a similar layout that succinctly covers the conceptual underpinnings of both the problem class and the appropriate EAs, and offers clear pseudocode for implementing generic versions of each method. In most cases, the text provides interesting explanations and insights, and perhaps most impressively, forms solid chains of motivation that link one method to its successor. That is, often the next technique is motivated by the deficiencies of the previous one. Many of the chapters include method comparisons, but these vary in quality and rigor. In general, Petrowski and Ben-Hamid give programmers sage (though somewhat indirect) advice as to which of many possible EA variants best match their specific problem.

Despite the book’s (short but engaging) introduction to EAs, it cannot be recommended as a starting or stand-alone source for an EA practitioner. As a textbook, it could serve as useful supplementary material in any artificial intelligence course that focuses heavily on hands-on EA coding. However, in a post-graduate course or research seminar—again, with a coding focus—the book could easily function as a primary text. In addition, researchers who use evolutionary algorithms but do not follow the field closely would surely benefit from consulting the four comprehensive optimization chapters as reference material. Basically, researchers, developers, teachers and students who need to implement EAs (in any programming language) to solve optimization problems should find this book useful, whereas people with a more theoretical or surface interest in the field are better served with other materials.

The book does provide theoretical and empirical wrapping for some of the EAs, but neither is a strongpoint compared to some of the more prominent EA textbooks. The majority of example applications (on standard EA benchmarks) would hardly pique the interest of the average student; these myriad runs do little more than generate large tables that seem more appropriate for conference or journal papers. In the GP chapter, Petrowski and Ben-Hamid go to the other extreme and select a complex network security intrusion-detection example, provide only coarse details of the problem domain, show none of the actual solutions found by genetic programming, and generate a few comparison diagrams of deep relevance to their own research but of minimal general interest to anyone hoping to learn more about GP. This indicates an unnatural “stretch” to integrate some of the authors’ published research into the book, when the GP applications of others might have been more appropriate and enlightening. This example ends the genetic programming chapter, and the book, which disappointingly lacks a final summarizing and concluding chapter.

The strength of this book clearly lies in the algorithms, their classifications, and the explanations surrounding them. These classifications (of everything from continuous optimization mutation methods to GP genotypes) provide essential assistance for readers struggling to make sense of the field’s imposing breadth. In this respect, “Evolutionary Algorithms” follows the same spirit as “How to Solve It: Modern Heuristics” (Michalewicz and Fogel 2000), a personal favorite. The explanations include well-written prose and highly informative diagrams, not only of standard classics such as crossed-over genomes and EA flowcharts, but illuminating renderings of processes such as genetic drift, selection pressure, the dynamics of feasible domains, and shifting Pareto fronts.

In general, Petrowski and Ben-Hamid display an in-depth understanding of several optimization classes and their corresponding evolutionary algorithms, along with an impressive ability to explain, illustrate, motivate, classify and codify. Although nobody can “do it all” in a field as deep and wide as evolutionary computation, they have chosen a pertinent subset and done a fine job with it. My own copy of “Evolutionary Algorithms” became an instant go-to reference as I prepare for another semester of teaching.