Skip to content

@jenetics jenetics released this Jun 23, 2019 · 4 commits to master since this release


  • #534: Generify Regression classes so it can be used for regression analysis of arbitrary types.
  • #529: Implementation of Hybridizing PSM and RSM mutation operator (HPRM)
  • #518: Implementation of Symbolic Regression classes. This makes it easier to solve such optimization problems.
  • #515: Rename Tree.getIndex(Tree) to Tree.indexOf(Tree).
  • #509: Allow to collect the nth best optimization results.
final ISeq<EvolutionResult<DoubleGene, Double>> best =
  • #504: Rename Tree.getChild(int) to Tree.childAt(int).
  • #500: Implementation of Reverse Sequence mutation operator (RSM).
  • #497: Implement Boolean operators for GP.
  • #496: Implement GT operator for GP.
  • #493: Add dotty tree formatter
  • #488: Implement new tree formatter TreeFormatter.LISP. This allows to create a Lisp string representation from a given Tree.
  • #487: Re-implementation of 'MathTreePruneAlterer'. The new implementation uses the newly introduced Tree Rewriting API, implemented in #442.
  • #486: Implement TreeRewriteAlterer, based on the new Tree Rewriting API.
  • #485: Cleanup of MathExpr class.
  • #484: The Tree.toString() now returns a parentheses string.
  • #481: The parentheses tree representation now only escapes "protected" characters.
  • #469: Implementation of additional Evaluator factory methods.
  • #465: Remove fitness scaler classes. The fitness scaler doesn't carry its weight.
  • #455: Implementation of CompletableFutureEvaluator.
  • #450: Improvement of FutureEvaluator class.
  • #449: The Engine.Builder constructor is now public and is the most generic way for creating engine builder instances. All other builder factory methods are calling this primary constructor.
  • #447: Remove evolution iterators. The whole evolution is no performed via streams.
  • #442: Introduce Tree Rewriting API, which allows to define own rewrite rules/system. This is very helpful when solving GP related problems.
final TRS<String> trs = TRS.parse(
    "add(0,$x) -> $x",
    "add(S($x),$y) -> S(add($x,$y))",
    "mul(0,$x) -> 0",
    "mul(S($x),$y) -> add(mul($x,$y),$y)"

// Converting the input tree into its normal form.
final TreeNode<String> tree = TreeNode.parse("add(S(0),S(mul(S(0),S(S(0)))))");
assert tree.equals(TreeNode.parse("S(S(S(S(0))))"));
  • #372: Allow to define the chromosome index an Alterer is allowed to change. This allows to define alterers for specific chromosomes in a genotype.
// The genotype prototype, consisting of 4 chromosomes
final Genotype<DoubleGene> gtf = Genotype.of(
    DoubleChromosome.of(0, 1),
    DoubleChromosome.of(1, 2),
    DoubleChromosome.of(2, 3),
    DoubleChromosome.of(3, 4)

// Define the GA engine.
final Engine<DoubleGene, Double> engine = Engine
    .builder(gt -> gt.getGene().doubleValue(), gtf)
    .selector(new RouletteWheelSelector<>())
        // The `Mutator` is used on chromosome with index 0 and 2.
        PartialAlterer.of(new Mutator<DoubleGene, Double>(), 0, 2),
        // The `MeanAlterer` is used on chromosome 3.
        PartialAlterer.of(new MeanAlterer<DoubleGene, Double>(), 3),
        // The `GaussianMutator` is used on all chromosomes.
        new GaussianMutator<>()
  • #368: Remove deprecated code.
  • #364: Clean implementation of async fitness functions.
  • #342: The Tree accessor names are no longer in a Java Bean style: getChild(int) -> childAt(int). This corresponds to the childAtPath(path) methods.
  • #331: Remove hashCode and equals method from Selector and Alterer.
  • #314: Add factory method for AdaptiveEngine, which simplifies its creation.
  • #308: General improvement of object serialization.
  • #50: Improve Genotype validation. The new Constraint interface, and its implementation RetryConstraint, now allows a finer control of the validation and recreation of individuals.


  • #520: Fix tree-rewriting for Const values. This leads to non-matching nodes when trying to simplify the GP tree.
  • #475: Level function returns different results depending on whether the iterator is iterating through a ProgramGene or TreeNode.
  • #473: DynamicGenotype example causes IllegalArgumentException.
Assets 3
You can’t perform that action at this time.