Skip to main content

Genetic Programming

Construct expression trees and evolve symbolic models using TreeSpace, PrimitiveSet, and GP.

Example Code​

import random
import numpy as np

from opytimizer import Opytimizer
from opytimizer.core.function import Function
from opytimizer.core.graph.primitive_set import PrimitiveSet
from opytimizer.core.stopping import MaxIterations
from opytimizer.optimizers.single_objective.evolutionary.gp import GP
from opytimizer.spaces.tree import TreeSpace
from opytimizer.visualization import plot_graph


class ArrayType:
pass


SEED = 100
np.random.seed(SEED)
random.seed(SEED)


def protected_exp(a):
return np.exp(np.clip(a, -10, 10))


def protected_log(a):
return np.log(np.abs(a) + 1e-5)


def custom_if_gt0(cond, val_if_pos, val_if_neg):
return np.where(cond > 0, val_if_pos, val_if_neg)


X_data = np.linspace(-3, 3, 100)
Y_target = np.cos(X_data) + protected_exp(-(X_data**2))

pset = PrimitiveSet(name="TrigRegression", root_type=ArrayType)

pset.add_primitive(np.sin, (ArrayType,), ArrayType, name="sin")
pset.add_primitive(protected_exp, (ArrayType,), ArrayType, name="exp")
pset.add_primitive(protected_log, (ArrayType,), ArrayType, name="log")

pset.add_primitive(np.add, (ArrayType, ArrayType), ArrayType, name="add")
pset.add_primitive(np.multiply, (ArrayType, ArrayType), ArrayType, name="mul")

pset.add_primitive(
custom_if_gt0, (ArrayType, ArrayType, ArrayType), ArrayType, name="if_gt0"
)

pset.add_terminal(value=X_data, output_type=ArrayType, name="X")
pset.add_terminal(value=np.ones_like(X_data), output_type=ArrayType, name="1.0")

pset.validate()


def evaluate_trig(tree):
try:
y_pred = tree.evaluate()

mae = np.mean(np.abs(y_pred - Y_target))
penalty = tree.depth * 0.01
return mae + penalty
except Exception:
return np.inf


function = Function(evaluate_trig)

space = TreeSpace(
n_agents=10,
n_objectives=1,
pset=pset,
min_depth=2,
max_depth=4,
method="half_and_half",
)

optimizer = GP()

opt = Opytimizer(space=space, function=function, optimizer=optimizer)

opt.start(MaxIterations(1000))

print(opt.space.best_agent.position)