package org.epochx.gp.model;
import org.epochx.core.Evolver;
import org.epochx.gp.op.crossover.KozaCrossover;
import org.epochx.gp.op.init.RampedHalfAndHalfInitialiser;
import org.epochx.life.*;
import org.epochx.op.selection.FitnessProportionateSelector;
import org.epochx.stats.*;
import org.epochx.test.*;
import org.junit.*;
public class SymbolicRegressionTest extends ModelTest {
private void setupModel(final Regression model) {
Evolver evolver = getEvolver();
model.setNoRuns(100);
model.setPopulationSize(500);
model.setNoGenerations(51);
model.setCrossoverProbability(0.9);
model.setMutationProbability(0.0);
model.setReproductionProbability(0.1);
model.setCrossover(new KozaCrossover(evolver));
model.setMaxDepth(16);
model.setMaxInitialDepth(5);
// TODO Start depth below should be 1 not 2, but insufficient programs.
model.setInitialiser(new RampedHalfAndHalfInitialiser(evolver, 1, false));
model.setPoolSelector(null);
model.setProgramSelector(new FitnessProportionateSelector(evolver));
model.setNoElites(0);
model.setTerminationFitness(0.01);
//setupRunPrinting(evolver.getStats(model));
//setupGenPrinting(evolver.getStats(model));
}
/**
* Tests quartic symbolic regression with standard setup.
*
* Koza's success rate: 23% (p586).
* OR 35% (p203).
*
* Expecting success rate between 45% and 55%.
*/
@Test
public void testQuartic() {
final int LOWER_SUCCESS = 45;
final int UPPER_SUCCESS = 55;
final QuarticRegression model = new QuarticRegression(getEvolver(), 20);
setupModel(model);
final int noSuccess = getNoSuccesses(model, false, false);
assertBetween("Unexpected success rate for quartic symbolic regression", LOWER_SUCCESS, UPPER_SUCCESS, noSuccess);
}
/**
* Tests symbolic regression on function 2.718x^2 +3.1416x with standard
* setup.
*
* Koza's success rate: 31% (p245).
*
* Expecting success rate between % and %.
*/
// @Test
// public void testEphemeral() {
// final int LOWER_SUCCESS = 45;
// final int UPPER_SUCCESS = 55;
//
// Regression model = new Regression(20) {
// @Override
// public double getCorrectResult(double x) {
// return (2.718 * Math.pow(x, 2)) + (3.1416 * x);
// }
// };
// setupModel(model);
// SuccessCounter counter = new SuccessCounter();
//
// evolver.getLife().addRunListener(counter);
//
// model.run();
//
// evolver.getLife().removeRunListener(counter);
//
// int noSuccess = counter.getNoSuccess();
// assertBetween("Unexpected success rate for quartic symbolic regression",
// LOWER_SUCCESS, UPPER_SUCCESS, noSuccess);
// }
}