Vita
example6.cc

Simple symbolic regression example (x^2+y^2-z^2).

Simple symbolic regression example (x^2+y^2-z^2).

#include <iostream>
#include <fstream>
#include "kernel/vita.h"
// This class models the first input.
class X : public vita::terminal
{
public:
X() : vita::terminal("X", 0) {}
bool input() const override { return true; }
vita::value_t eval(vita::symbol_params &) const override { return val; }
static double val;
};
class Y : public vita::terminal
{
public:
Y() : vita::terminal("Y", 0) {}
bool input() const override { return true; }
vita::value_t eval(vita::symbol_params &) const override { return val; }
static double val;
};
class Z : public vita::terminal
{
public:
Z() : vita::terminal("Z", 0) {}
bool input() const override { return true; }
vita::value_t eval(vita::symbol_params &) const override { return val; }
static double val;
};
double X::val;
double Y::val;
double Z::val;
class my_evaluator : public vita::evaluator<vita::i_mep>
{
vita::fitness_t operator()(const vita::i_mep &ind) override
{
vita::fitness_t::value_type fit(0.0);
for (double x(0); x < 10; ++x)
for (double y(0); y < 10; ++y)
for (double z(0); z < 10; ++z)
{
X::val = x;
Y::val = y;
Z::val = z;
const auto res(agent.run());
if (vita::has_value(res))
{
const auto dres(std::get<vita::D_DOUBLE>(res));
assert(std::isfinite(dres));
fit += std::exp(-std::fabs(dres - (x*x + y*y - z*z)));
}
}
return {fit};
}
};
int main(int argc, char *argv[])
{
using namespace vita;
problem p;
p.env.init();
p.env.individuals = static_cast<unsigned>(argc > 1
? std::atoi(argv[1])
: 100);
p.env.mep.code_length = static_cast<unsigned>(argc > 2
? std::atoi(argv[2])
: 100);
p.env.generations = static_cast<unsigned>(argc > 3
? std::atoi(argv[3])
: 100);
symbol_factory factory;
p.sset.insert<X>();
p.sset.insert<Y>();
p.sset.insert<Z>();
p.sset.insert(factory.make("FADD"));
p.sset.insert(factory.make("FSUB"));
p.sset.insert(factory.make("FMUL"));
p.sset.insert(factory.make("FIFL"));
p.sset.insert(factory.make("FIFE"));
auto eva(std::make_unique<my_evaluator>());
evolution<i_mep, std_es> evo(p, *eva);
evo.run(1);
}
Calculates the fitness of an individual.
Definition: evaluator.h:54
virtual fitness_t operator()(const T &)=0
A MEP (Multi Expression Programming) single member of a population.
Definition: i_mep.h:34
An interface for parameter passing to functions / terminals.
virtual bool input() const
An input variable is a feature from the learning domain.
Definition: symbol.h:128
virtual value_t eval(symbol_params &) const =0
Calculates the value of / performs the action associated with the symbol (it's implementation specifi...
A symbol with zero-arity.
Definition: terminal.h:27
The main namespace for the project.
bool has_value(const value_t &v)
Definition: value.h:51
std::variant< D_VOID, D_INT, D_DOUBLE, D_STRING > value_t
A variant containing the data types used by the interpreter for internal calculations / output value ...
Definition: value.h:45