package com.lagodiuk.gp.symbolic;
import java.util.LinkedList;
import java.util.List;
import com.lagodiuk.gp.symbolic.SymbolicRegressionEngine;
import com.lagodiuk.gp.symbolic.SymbolicRegressionIterationListener;
import com.lagodiuk.gp.symbolic.TabulatedFunctionFitness;
import com.lagodiuk.gp.symbolic.Target;
import com.lagodiuk.gp.symbolic.interpreter.Expression;
import com.lagodiuk.gp.symbolic.interpreter.Functions;
/**
* f(x) - ?
*
* f(0) = 0
* f(1) = 11
* f(2) = 24
* f(3) = 39
* f(4) = 56
* f(5) = 75
* f(6) = 96
*
* (target function is f(x) = x^2 + 10*x)
*/
public class HelloSymbolicRegression {
public static void main(String[] args) {
// define training set
TabulatedFunctionFitness fitness =
new TabulatedFunctionFitness(
new Target().when("x", 0).targetIs(0),
new Target().when("x", 1).targetIs(11),
new Target().when("x", 2).targetIs(24),
new Target().when("x", 3).targetIs(39),
new Target().when("x", 4).targetIs(56),
new Target().when("x", 5).targetIs(75),
new Target().when("x", 6).targetIs(96));
SymbolicRegressionEngine engine =
new SymbolicRegressionEngine(
fitness,
// define variables
list("x"),
// define base functions
list(Functions.ADD, Functions.SUB, Functions.MUL, Functions.VARIABLE, Functions.CONSTANT));
addListener(engine);
// 200 iterations
engine.evolve(200);
}
/**
* Track each iteration
*/
private static void addListener(SymbolicRegressionEngine engine) {
engine.addIterationListener(new SymbolicRegressionIterationListener() {
@Override
public void update(SymbolicRegressionEngine engine) {
Expression bestSyntaxTree = engine.getBestSyntaxTree();
double currFitValue = engine.fitness(bestSyntaxTree);
// log to console
System.out.println(
String.format("iter = %s \t fit = %s \t func = %s",
engine.getIteration(), currFitValue, bestSyntaxTree.print()));
// halt condition
if (currFitValue < 5) {
engine.terminate();
}
}
});
}
private static List list(T... items) {
List list = new LinkedList();
for (T item : items) {
list.add(item);
}
return list;
}
}
Ads help maintain this website.