Changelog
Changes in version 0.7.1 ------------------------ * Added EvolutionStrategyEngine to provide both (mu+lambda) and (mu,lambda) evolution strategies. * Use final version of Google Collections 1.0. * Tweaked concurrency settings in IslandEvolution (no need for more than one thread per island). * Fixed look-and-feel issues in example applets (make sure all components are created after the look-and-feel is set. * Reverted 0.7.0 change to generation numbering in AbstractEvolutionEngine. Numbering is correct if the initial population is considered to be the first generation. Changes in version 0.7.0 ------------------------ * Refactored internals to make it easier for the framework to provide different evolutionary algorithm variants. Different types of evolutionary algorithm are supported by different sub-classes of AbstractEvolutionEngine, with different implementations of the nextEvolutionStep method. The main EvolutionEngine implementation is now called GenerationalEvolutionEngine. * Concurrency control is no longer supported through inheritance. Removed ConcurrentEvolutionEngine and SequentialEvolutionEngine and added the setSingleThreaded method to AbstractEvolutionEngine. * Added first-class support for steady-state evolution in the form of the new SteadyStateEvolutionEngine. * Added SigmaScaling selection strategy. * Added ListInversion evolutionary operator. Randomly reverses subsections of lists. * Added variable probability constructor to ListOrderCrossover. * Introduced support for island model evolution. * Added islands view to the evolution monitor so that the state of individual island populations can be tracked. * Fixed generation numbering in AbstractEvolutionEngine. It was supposed to be zero-based but was starting at 1, which would cause the GenerationCount termination condition to trigger prematurely. * Ugraded to Uncommons Maths 1.2.1 to take advantage of optimisations. * Optimised the implementation of BitStringCrossover to take advantage of faster bit swapping operation in Uncommons Maths 1.2.1. * Converted BitStringMutation to use a more efficient approach. The probability parameter is now for controlling whether an individual candidate gets mutated, not each separate bit as was the case previously (existing programs should now use higher probabilities accordingly). How many bits get flipped is now controlled via a secondary parameter. * Upgraded to Google Collections 1.0 RC5. * Introduced Swing renderer for example GP trees. Changes in version 0.6.2 ------------------------ * Fix for thread leak in ConcurrentEvolutionEngine (ISSUE#16). Added a finalizer to shutdown the thread pool in FitnessEvaluationWorker so that the active threads do not inhibit garbage collection. * Made the FitnessEvaluationWorker in ConcurrentEvolutionEngine static so that it can be shared by all instances avoiding the unnecessary creation of new thread pools (ISSUE#16). * Made fitness evaluation threads daemons again (as in 0.6.0). Only standalone (i.e. Terracotta) FitnessEvaluationWorkers now use non-daemon threads. This fixes the problem of the JVM not exiting when the program is finished (ISSUE#17). * Better thread naming for fitness evaluation worker threads. Changes in version 0.6.1 ------------------------ * Added getSatisfiedTerminationConditions() method to the EvolutionEngine interface. This makes it easier to determine which TerminationCondition caused the evolution to stop (ISSUE#13). * Improvements to the genetic programming example application. * Made StatusBar component public so that it can be used independently of the Evolution Monitor. * Converted applet-based examples so that they can also run as applications in JFrames. * Introduced Launcher class so that examples can be run easily from the command line. * Changed the Mona Lisa example to accept the URL of an alternate image when run from the command line. * Moved NullFitnessEvaluator from interactive package to framework package and made it package scope. This class is an implementation detail and should not be exposed by the API. * Refactored the ConcurrentEvolutionEngine by moving the code that actually executes FitnessEvaluationTasks into a new class (FitnessEvaluationWorker). This modified design makes it easy to distribute the fitness evaluations using Terracotta (http://www.terracotta.org). * Documented the restriction that fitness scores are not allowed to be negative. Made sure that the framework throws an appropriate, informative exception if a negative fitness is encountered (ISSUE#15). * Documented potential pitfall with using EvolutionObservers to update Swing GUIs (ISSUE#14). Changes in version 0.6.0 ------------------------ * Added the option to view only the most recent 200 generations on the population fitness graph of the evolution monitor. * Fixed a bug that prevented the population fitness view from being reset between runs. * Added more information to the evolution monitor status bar. * Added a boolean parameter to the evolution monitor showInFrame method so that you can specify whether closing the frame should terminate the program. * Enhancements to the Mona Lisa example application (it's now an applet). * Added methods to the EvolutionEngine interface to allow the entire population to be returned from an evolutionary algorithm rather than just the fittest candidate. * Introduced CachingFitnessEvaluator, a decorator for standard fitness functions that caches the results of its calculations. If the evaluator is invoked twice for the same candidate, the cached value is returned by the second invocation thus avoiding the expense of recalculating the fitness score. This is a useful optimisation in scenarios where some canidates survive from generation to generation unmodified (elitism is one example of this). * Introduced dependency on Google Collections (to support the CachingFitnessEvaluator). * Fixed ProbabilityParameterControl so that it allows the slider to move all the way to the maximum permitted value (ISSUE#10). * Moved classes from Uncommons Utils module into the main framework module and removed the util module. * Added SelectionStrategyControl to the Swing module. This control enables the user to change the selection strategy even while the evolution is running. * Upgraded to Uncommons Maths 1.2, which has its own Probability type, so we now use that and the Probability class in the framework package has been removed. * Removed call to System.out.println in ConcurrentEvolutionEngine (ISSUE#12). * Included source code in the release distribution in the form of source JARs for the framework and swing modules (source code for the examples module is already included) (ISSUE#11). * Modified cross-over implementation constructors to accept a number generator for the probability parameter. This allows variable probabilities to be used. Changes in version 0.5.1 ------------------------ * Simplified generics for EvolutionaryOperators. It's now slightly less flexible but the most common scenarios are less cumbersome since there are no 'super' wildcards to deal with when constructing pipelines and no need to deal with sub-types when implementing your own operators. * Added generic type parameters to ListCrossover, ListOrderCrossover and ListOrderMutation to be compatible with the above change. * Added evolutionary art example appliction inspired by Roger Alsing's evolution of the Mona Lisa, see http://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona-lisa/ * Added Replacement evolutionary operator that randomly replaces candidates with independent, newly-generated random candidates. Useful for introducing new genetic material into stagnating populations. * Improved ListCrossover operator so that it can work with parents of variable lengths. * Added higher-order evolutionary operator, ListOperator that converts an operator of a given type into a operator that works with lists of that type. * Enhancements to the Evolution Monitor component. Changes in version 0.5.0 ------------------------ * Added wildcard to generic parameter of Console select method. * Added check to ensure that there is always at least one termination condition specified. * Improved reflection in RendererAdapter and InteractiveSelection. Previously they tried to access classes that may not have been visible to them. * Introduced tree-based genetic programming example application. * Added Probability class. This immutatble value type encapsulates a probability value between zero and one. The class enforces the 0..1 bounds and provides convenient methods for working with probabilities. Using the Probability type is an improvement over the previous approach of using double values since there is now no need to duplicate bounds-checking and other logic throughout the code. * Introduced new Swing component (ProbabilityParameterControl) for manipulating Probability parameters from a GUI. * Javadoc improvements. * Relaxed generic constraints on EvolutionObservers (generic type can now be less specific than the EvolutionEngine type). Added wildcard to populationUpdate method of EvolutionObserver to support this. * Renamed StandaloneEvolutionEngine to ConcurrentEvolutionEngine. * Introduced SequentialEvolutionEngine, which performs all work synchronously on the request thread, making it suitable for use in restricted/managed environments that do not permit direct control over threading. * Use only integer labels for the generations axis on the Evolution Monitor's fitness view. Changes in version 0.4.3 ------------------------ * Introduced Utilities module. * Extracted Uncommons Maths module into separate project (see https://uncommons-maths.dev.java.net). * Added new constructor to BitString to simplify the creation of random bit strings. * Improved algorithm for countSetBits() in BitString. New version is significantly faster (10-15 times faster). * Moved BitString class from Framework module into Uncommons Maths. * Added new termination condition to detect when the evolution has stagnated (i.e. the fitness has not improved for a certain number of generations). * Moved the the Swing-specific classes from the framework module into what was the Uncommons GUI module, which is now the Watchmaker Swing module. * Introduced experimental Evolution Monitor Swing component. Changes in version 0.4.2 ------------------------ * Added a second parameter to the FitnessEvaluator interface to enable fitness calculations to take into account an individual's environment (the remainder of the population) when assigning a score. * Minor tweak to improve the distribution of fitness evaluations between threads on multi-processor machines. * Fix for ISSUE#3 (bad Throwable handling in InteractiveSelection and RendererAdapter) * Made AbstractEvolutionEngine interruptible. * Added new constructor to StandaloneEvolutionEngine to allow users to provide a custom ThreadFactory. * Fix for ISSUE#4 (unreliable final result with non-natural fitness function). Changes in version 0.4.1 ------------------------ * Added new constructors to NumberGenerator implementations to enable the parameters to be dynamic. * Several more unit tests for significantly improved coverage. Fixed 2 minor bugs detected by these new tests. * Added some GUI control components to assist in building Swing GUIs for evolutionary programs. * Moved the SwingConsole class into the new Swing components package (org.uncommons.watchmaker.swing) so that the core framework does not contain any dependencies on a particular presentation layer. * Added evolutionary Sudoku solver example application. * Included source code for the examples in the release archives. Changes in version 0.4.0 ------------------------ * Introduced framework support for interactive evolutionary algorithms. * New example application based on Richard Dawkins' biomorph experiment. Demonstrates the new interactive features of the framework. * Added new, extremely fast RNG - a Java port of Tony Pasqualoni's cellular automaton RNG (http://home.southernct.edu/~pasqualonia1/ca/report.html). * Added ordered cross-over evolutionary operator for lists. * Updated Travelling Salesman applet to optionally use cross-over as well as mutation. * Introduced TerminationCondition interface and useful default implementations. Changed evolve methods in EvolutionEngine to take one or more conditions instead of explicitly specifying parameters such as number of generations, target fitness and timeout. Changes in version 0.3.0 ------------------------ * Removed java.util.BitSet operators and candidate factory. BitSets are somewhat lacking as a generic bit string for genetic algorithms. * Introduced a new general-purpose BitString type with an associated candidate factory plus mutation and cross-over operators. * Added probabilities to cross-over implementations so that parents may sometimes pass through the operator unaltered. A similar effect could have been achieved previously by combining the cross-over operator with a SplitEvolution operator that processed some of the individuals with an IdentityOperator, but this is more straightforward. * Modified cross-over operators so that the cross-over index is always non-zero. This means all cross-overs are meaningful. With a zero index, each parent is split before the first position, making the cross-over effectively a no-op. This change was required in order to honour the new cross-over probability, and is also sensible in its own right. * Removed varargs constructor from EvolutionPipeline since it was impossible to invoke without generating a compiler warning about generic array creation. * Fixed very slightly skewed probability in StringMutation. * Fixed bug in RouletteWheelSelection. * Improved Travelling Salesman applet to allow different selection strategies to be applied. * More unit test cases and improved API documentation. Changes in version 0.2.2 ------------------------ * Renamed classes for generating random values from various probability distributions. Now called "generators" rather than "sequences" in order to avoid confusion with mathematical sequences. * Changed terminology for different fitness scoring schemes to be consistent with the literature (what was called 'normalised fitness' is now called 'natural fitness'). * Refactored fitness-proportionate selection strategies. * Fixed tournament selection bug. * Moved the compound evolutionary operators (SplitEvolution and EvolutionPipeline) introduced in the previous release into the operators package. * Introduced an IdentityOperator for use with SplitEvolution to enable some candidates to be preserved unchanged (this is different from elitism because it does not depend on fitness). Changes in version 0.2.1 ------------------------ * Reworked evolutionary operators to allow more flexibility. Specifically, evolution can now be split into separate streams, which enables common genetic programming techniques to be used. * Simplified the use of generics within the API. * Fixed bug with pre-seeding populations. Changes in version 0.2 ---------------------- * Added support for concurrent fitness evaluations to take advantage of multi-core and multi-processor machines. * Modified the way elitism is configured (the number of candidates to preserve is now specifed as an argument to the evolve method of the EvolutionEngine). * Converted the Travelling Salesman example program into an applet that allows parameters to be tweaked and performance to be compared to a brute force implementation. * Fixed RNG seeding to work in an untrusted applet environment (previously SecurityExceptions were thrown when attempting to access resources for seeding).
