60 lines
1.7 KiB
Python
60 lines
1.7 KiB
Python
import jax.numpy as jnp
|
|
|
|
from tensorneat.pipeline import Pipeline
|
|
from tensorneat.algorithm.neat import NEAT
|
|
from tensorneat.genome import DefaultGenome, DefaultNode, DefaultMutation, BiasNode
|
|
from tensorneat.problem.func_fit import CustomFuncFit
|
|
from tensorneat.common import ACT, AGG
|
|
|
|
# define a custom function fit problem
|
|
def pagie_polynomial(inputs):
|
|
x, y = inputs
|
|
res = 1 / (1 + jnp.pow(x, -4)) + 1 / (1 + jnp.pow(y, -4))
|
|
|
|
# important! returns an array, NOT a scalar
|
|
return jnp.array([res])
|
|
|
|
# define custom activate function and register it
|
|
def square(x):
|
|
return x ** 2
|
|
ACT.add_func("square", square)
|
|
|
|
if __name__ == "__main__":
|
|
custom_problem = CustomFuncFit(
|
|
func=pagie_polynomial,
|
|
low_bounds=[-1, -1],
|
|
upper_bounds=[1, 1],
|
|
method="sample",
|
|
num_samples=100,
|
|
)
|
|
|
|
pipeline = Pipeline(
|
|
algorithm=NEAT(
|
|
pop_size=10000,
|
|
species_size=20,
|
|
survival_threshold=0.01,
|
|
genome=DefaultGenome(
|
|
num_inputs=2,
|
|
num_outputs=1,
|
|
init_hidden_layers=(),
|
|
node_gene=BiasNode(
|
|
activation_options=[ACT.identity, ACT.inv, ACT.square],
|
|
aggregation_options=[AGG.sum, AGG.product],
|
|
),
|
|
output_transform=ACT.identity,
|
|
),
|
|
),
|
|
problem=custom_problem,
|
|
generation_limit=50,
|
|
fitness_target=-1e-4,
|
|
seed=42,
|
|
)
|
|
|
|
# initialize state
|
|
state = pipeline.setup()
|
|
# run until terminate
|
|
state, best = pipeline.auto_run(state)
|
|
# show result
|
|
# pipeline.show(state, best)
|
|
print(pipeline.algorithm.genome.repr(state, *best))
|