import static java.lang.Math.PI; import static java.lang.Math.cos; import static org.jenetics.engine.EvolutionResult.toBestPhenotype; import static org.jenetics.engine.limit.bySteadyFitness; import org.jenetics.DoubleGene; import org.jenetics.MeanAlterer; import org.jenetics.Mutator; import org.jenetics.Optimize; import org.jenetics.Phenotype; import org.jenetics.engine.Engine; import org.jenetics.engine.EvolutionStatistics; import org.jenetics.engine.codecs; import org.jenetics.util.DoubleRange; public class RastriginFunction { private static final double A = 10; private static final double R = 5.12; private static final int N = 2; private static double fitness(final double[] x) { double value = A*N; for (int i = 0; i < N; ++i) { value += x[i]*x[i] - A*cos(2.0*PI*x[i]); } return value; } public static void main(final String[] args) { final Engine<DoubleGene, Double> engine = Engine .builder( RastriginFunction::fitness, // Codec for 'x' vector. codecs.ofVector(DoubleRange.of(-R, R), N)) .populationSize(500) .optimize(Optimize.MINIMUM) .alterers( new Mutator<>(0.03), new MeanAlterer<>(0.6)) .build(); final EvolutionStatistics<Double, ?> statistics = EvolutionStatistics.ofNumber(); final Phenotype<DoubleGene, Double> best = engine.stream() .limit(bySteadyFitness(7)) .peek(statistics) .collect(toBestPhenotype()); System.out.println(statistics); System.out.println(best); } }