summaryrefslogtreecommitdiffstats
path: root/watchmaker/book/src/xml/islands.xml
diff options
context:
space:
mode:
Diffstat (limited to 'watchmaker/book/src/xml/islands.xml')
-rw-r--r--watchmaker/book/src/xml/islands.xml175
1 files changed, 175 insertions, 0 deletions
diff --git a/watchmaker/book/src/xml/islands.xml b/watchmaker/book/src/xml/islands.xml
new file mode 100644
index 0000000..e7943f8
--- /dev/null
+++ b/watchmaker/book/src/xml/islands.xml
@@ -0,0 +1,175 @@
+<chapter xmlns="http://docbook.org/ns/docbook"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://docbook.org/ns/docbook http://www.docbook.org/xml/5.0/xsd/docbook.xsd">
+ <title>Island Models</title>
+ <indexterm><primary>island models</primary></indexterm>
+ <indexterm><primary>Australia</primary></indexterm>
+ <para>
+ In the natural world, populations of organisms might be separated by geography. Left to evolve in isolation
+ over millions of years, vastly different species will occur in different locations. Consider Australia,
+ an island continent protected by its seas. With little opportunity for outside organisms to
+ interfere, and few opportunities for its land-based organisms to migrate to other land masses, Australian
+ wildlife evolved to be distinctly different from that of other continents and countries. The majority of
+ Australia's plant and animal species, including 84% of its mammals, are endemic. They occur nowhere else
+ in the world.
+ </para>
+ <indexterm><primary>Darwin, Charles</primary></indexterm>
+ <indexterm><primary>Galápagos Islands</primary></indexterm>
+ <para>
+ Australia is not the only island to exhibit such levels of endemism. It was a visit to the Galápagos
+ Islands in 1835 that started Charles Darwin on the path to formulating his theory of evolution. Darwin
+ noticed the pronounced differences between the species of mocking birds and tortoises present on the
+ different islands of the archipelago and began to speculate on how such variations might have occurred.
+ </para>
+ <para>
+ In the world of evolutionary computation we can mimic this idea of having multiple isolated populations
+ evolving in parallel. Having additional populations would increase the likelihood of finding a solution that
+ is close to the global optimum. However, it is not just a question of having a larger global population.
+ A system of 10 islands each with a population of 50 individuals is not equivalent to a single island with a
+ population of 500. The reason for this is that the island system partitions the search. If one island
+ prematurely converges on a sub-optimal solution it does not affect the evolution happening on the other
+ islands; they are following their own paths. A single large population does not have this in-built
+ resilience.
+ </para>
+ <section>
+ <title>Migration</title>
+ <indexterm><primary>migration</primary></indexterm>
+ <indexterm><primary>island models</primary><secondary>migration</secondary></indexterm>
+ <para>
+ There is of course no real difference between evolving 10 completely separate islands in parallel and running
+ the same single-population evolution 10 times in a row, other than how the computing resources are utilised.
+ In practice the populations are not kept permanently isolated from each other and there are occasional
+ opportunities for individuals to migrate between islands.
+ </para>
+ <para>
+ In nature external species have been introduced to foreign ecosystems in several ways. In an ice age the waters
+ that previously separated two land masses might freeze providing a route for land animals to migrate to
+ previously unreachable places. Microorganisms and insects have often strayed beyond their usual environment by
+ hitching a ride with larger species.
+ </para>
+ <indexterm><primary>rabbits</primary></indexterm>
+ <indexterm><primary>Austin, Thomas</primary></indexterm>
+ <para>
+ The effect of introducing a foreign species to a new environment can vary. The new species might be
+ ill-adapted to its new surroundings and quickly perish. Alternatively, a lack of natural predators
+ may cause it to flourish, often to the detriment of indigenous species. One such example is the
+ introduction of rabbits to Australia. Australia was a land without rabbits until the arrival of European
+ settlers. An Englishman named Thomas Austin released 24 rabbits into the wild of Victoria in October 1859
+ with the intention of hunting them. If rabbits are famous for one thing it is for reproducing prodigiously.
+ The mild winters allowed year-round breeding and the absence of any natural rabbit predators, such as foxes,
+ allowed the Australian rabbit population to explode unchecked. Within 10 years an annual cull of two million
+ rabbits was having no noticeable effect on rabbit numbers and the habitats of some native animals were being
+ destroyed by the floppy-eared pests. Today there are hundreds of millions of rabbits in Australia, despite
+ efforts to reduce the population, and the name of Thomas Austin is widely cursed for his catastrophic lack
+ of foresight.
+ </para>
+ <para>
+ While such invasions of separate species provide a useful analogy for what can happen when we introduce migration
+ into island model evolutionary algorithms, we are specifically interested in the effects of migration involving
+ genetically different members of the same species. This is because, in our simplified model of evolution,
+ all individuals are compatible and can reproduce. The island model of evolution provides the isolation necessary
+ for diversity to thrive while still providing opportunities for diverse individuals to be combined to produce
+ potentially fitter offspring.
+ </para>
+ <para>
+ In an island model, the isolation of the separate populations often leads to different traits originating on
+ different islands. Migration brings these diverse individuals together occasionally to see what happens when
+ they are combined. Remember that, even if the immigrants are weak, cross-over can result in offspring that are
+ fitter than either of their parents. In this way, the introduction to the population of new genetic building
+ blocks may result in evolutionary progress even if the immigrants themselves are not viable in the new
+ population.
+ </para>
+ </section>
+ <section>
+ <title>Islands in the Watchmaker Framework</title>
+ <indexterm><primary><classname>IslandEvolution</classname></primary></indexterm>
+ <para>
+ The Watchmaker Framework for Evolutionary Computation supports islands models via the
+ <classname>IslandEvolution</classname> class. Each island is a self-contained
+ <classname>EvolutionEngine</classname> just like those we have been using previously for single-population
+ evolutionary algorithms. The evolution is divided into <emphasis>epochs</emphasis>. Each epoch consists
+ of a fixed number of generations that each island completes in isolation. At the end of an epoch migration
+ occurs. Then, if the termination conditions are not yet satisfied, a new epoch begins.
+ </para>
+ <para>
+ The <classname>IslandEvolution</classname> supports pluggable migration strategies via different implementations
+ of the <interfacename>Migration</interfacename> interface. An island version of the string evolution example
+ from <xref linkend="watchmaker_chapter" /> might look something like this:
+ </para>
+ <indexterm><primary><interfacename>Migration</interfacename></primary></indexterm>
+ <indexterm><primary><classname>RingMigration</classname></primary></indexterm>
+ <informalexample>
+ <programlisting language="java">
+<![CDATA[IslandEvolution<String> engine
+ = new IslandEvolution<String>(5, // Number of islands.
+ new RingMigration(),
+ candidateFactory,
+ evolutionaryOperator,
+ fitnessEvaluator,
+ selectionStrategy,
+ rng);
+
+engine.evolve(100, // Population size per island.
+ 5, // Elitism for each island.
+ 50, // Epoch length (no. generations).
+ 3, // Migrations from each island at each epoch.
+ new TargetFitness(0, false));]]>
+ </programlisting>
+ </informalexample>
+ <indexterm><primary><interfacename>IslandEvolutionObserver</interfacename></primary></indexterm>
+ <indexterm><primary><methodname>populationUpdate</methodname></primary></indexterm>
+ <indexterm><primary><methodname>islandPopulationUpdate</methodname></primary></indexterm>
+ <para>
+ We can add listeners to an <classname>IslandEvolution</classname> object, just as we can with individual
+ <interfacename>EvolutionEngine</interfacename>s. We use a different interface for this though,
+ <interfacename>IslandEvolutionObserver</interfacename>, which provides two call-backs.
+ The <methodname>populationUpdate</methodname> method reports the global state of the combined population
+ of all islands at the end of each epoch. The <methodname>islandPopulationUpdate</methodname> method reports
+ the state of individual island populations at the end of each generation.
+ </para>
+ <section>
+ <title>Advanced Usage</title>
+ <indexterm><primary><classname>GenerationalEvolutionEngine</classname></primary><secondary>island evolution</secondary></indexterm>
+ <para>
+ In the example code above we specified how many islands we wanted to use and the
+ <classname>IslandEvolution</classname> class created one <classname>GenerationalEvolutionEngine</classname>
+ for each island. Using this approach all of the islands have the same configuration; they use the same
+ candidate factory, evolutionary operator(s) and selection strategy. This is the easiest way to create an
+ island system but it is also possible to construct each island individually for ultimate flexibility.
+ </para>
+ <informalexample>
+ <programlisting language="java">
+<![CDATA[List<EvolutionEngine<String>> islands
+ = new ArrayList<EvolutionEngine<String>>();
+
+// Create individual islands here and add them to the list.
+// ...
+
+IslandEvolution<String> engine
+ = new IslandEvolution<String>(islands,
+ new RingMigration(),
+ false, // Natural fitness?
+ rng);]]>
+ </programlisting>
+ </informalexample>
+ <para>
+ One reason you might choose to construct the islands explicitly is that it makes it possible to configure
+ individual islands differently. You may choose to have different islands use different parameters
+ for evolutionary operators, or even to use different evolutionary operators all together. Alternatively,
+ you could use the same evolutionary operators and parameters but have different selection strategies so that
+ some islands have stronger selection pressure than others. You should generally use the same fitness function
+ for all islands though, otherwise you might get some strange results.
+ </para>
+ <indexterm><primary><classname>SteadyStateEvolutionEngine</classname></primary><secondary>island evolution</secondary></indexterm>
+ <indexterm><primary><classname>EvolutionStrategyEngine</classname></primary><secondary>island evolution</secondary></indexterm>
+ <para>
+ Another possible reason for creating the islands explicitly is so you don't have to use the standard
+ <classname>GenerationalEvolutionEngine</classname> for the islands. You can choose to use any implementation
+ of the <interfacename>EvolutionEngine</interfacename> interface, such as the
+ <classname>SteadyStateEvolutionEngine</classname> class or the <classname>EvolutionStrategyEngine</classname>
+ class. You can even use a mixture of different island types with the same
+ <classname>IslandEvolution</classname> object.
+ </para>
+ </section>
+ </section>
+</chapter>