ECF 1.5
SymbRegEvalOp - citanje_svih_funkcija_Tree.cpp
1#include <cmath>
2#include <ecf/ECF.h>
3#include "SymbRegEvalOp.h"
4
5
6// called only once, before the evolution – generates training data
7bool SymbRegEvalOp::initialize(StateP state)
8{
9 nSamples = 10;
10 double x = -10;
11 for(uint i = 0; i < nSamples; i++) {
12 domain.push_back(x);
13 codomain.push_back(x + sin(x));
14 x += 2;
15 }
16
17 // dohvati prvi genotip - nadamo se da je to Tree
18 Tree::Tree* tree = (Tree::Tree*) state->getGenotypes().at(0).get();
19
20 // izlistaj sve koristene funkcije
21 std::map<std::string, Tree::PrimitiveP>::iterator it = tree->primitiveSet_->mAllPrimitives_.begin();
22 while(it != tree->primitiveSet_->mAllPrimitives_.end()) {
23 Tree::PrimitiveP func;
24 if(func = tree->primitiveSet_->getFunctionByName(it->first)) {
25 cout << func->getName();
26 cout << "\t" << func->getNumberOfArguments() << endl;
27 }
28 it++;
29 }
30
31 // izracunaj rezultat izvodjenja neke funkcije nad konstantama
32 // konstante su navedene u parametrima (inace se nece niti pojaviti u stablu)
33 Tree::Tree* copyTree = tree->copy();
34 std::string izraz = "<Tree size=\"3\">+ D_1 D_2</Tree>";
35 XMLNode xTree = XMLNode::parseString(izraz.c_str());
36 tree->read(xTree);
37 double result;
38 tree->execute(&result);
39 cout << result << endl;
40
41 return true;
42}
43
44
45FitnessP SymbRegEvalOp::evaluate(IndividualP individual)
46{
47 // we try to minimize the function value, so we use FitnessMin fitness (for minimization problems)
48 FitnessP fitness (new FitnessMin);
49
50 // get the genotype we defined in the configuration file
51 Tree::Tree* tree = (Tree::Tree*) individual->getGenotype().get();
52 // (you can also use boost smart pointers:)
53 //TreeP tree = boost::static_pointer_cast<Tree::Tree> (individual->getGenotype());
54
55 double value = 0;
56 for(uint i = 0; i < nSamples; i++) {
57 // for each test data instance, the x value (domain) must be set
58 tree->setTerminalValue("X", &domain[i]);
59 // get the y value of the current tree
60 double result;
61 tree->execute(&result);
62 // add the difference
63 value += fabs(codomain[i] - result);
64 }
65 fitness->setValue(value);
66
67 return fitness;
68}
Fitness for minimization problems.
Definition: FitnessMin.h:12
FitnessP evaluate(IndividualP individual)
Evaluate a single individual. Method must create and return a Fitness object.
bool initialize(StateP)
Initialize the evaluator. Called before first evaluation occurs.
Tree class - implements genotype as a tree.
Definition: Tree_c.h:29
void setTerminalValue(std::string, void *)
Set a terminal's value.
Definition: Tree.cpp:504
Tree * copy()
Create an identical copy of the genotype object.
Definition: Tree.cpp:37
void execute(void *)
Execute current tree.
Definition: Tree.cpp:362
void read(XMLNode &)
Read genotype data from XMLNode.
Definition: Tree.cpp:550