Skip to content

Commit

Permalink
Finishing touches, added GEP.
Browse files Browse the repository at this point in the history
  • Loading branch information
Josipmrden committed Sep 26, 2020
1 parent 4b87cbf commit 94053b8
Show file tree
Hide file tree
Showing 29 changed files with 2,155 additions and 154 deletions.
23 changes: 22 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,29 @@ set(SOURCE_FILES
implicit_functions/cross_validation/CrossValUtil.h
implicit_functions/cross_validation/ParameterSet.cpp
implicit_functions/cross_validation/ParameterSet.h
utils/SymbRegLibrary.h
implicit_functions/cross_validation/DatasetInfo.cpp
implicit_functions/cross_validation/DatasetInfo.h
gep/AlgGEP.cpp
gep/AlgGEP.h
gep/GEPChromosome.cpp
gep/GEPChromosome.h
gep/GEPChromosomeCrsOnePoint.h
gep/GEPChromosomeCrsOnePoint.cpp
gep/GEPChromosomeCrsTwoPoint.cpp
gep/GEPChromosomeCrsTwoPoint.h
gep/GEPChromosomeMutGauss.cpp
gep/GEPChromosomeMutGauss.h
gep/GEPChromosomeMutOp.h
gep/GEPChromosomeMutOp.cpp
gep/GEPChromosomeCrsGene.h
gep/GEPChromosomeCrsGene.cpp
executables/BenchmarkTesting.cpp
utils/SymbRegLibrary.h implicit_functions/cross_validation/DatasetInfo.cpp implicit_functions/cross_validation/DatasetInfo.h)
implicit_functions/unordered/GepEvaluation.cpp
implicit_functions/unordered/GepEvaluation.h
ap/APEvalOp.cpp
ap/APEvalOp.h
)

find_package(Boost)
if(Boost_FOUND)
Expand Down
192 changes: 98 additions & 94 deletions direct_methods/MultipleTreeEvaluator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,24 +56,6 @@ AbstractEvaluateOp *MultipleTreeEvaluator::createNew() {

bool MultipleTreeEvaluator::containsAllVariables(IndividualP individual)
{
//"<Tree size=\"3\">* 4 4</Tree>" -> circle
//"<Tree size=\"7\"> + * Y Y * X X</Tree>" -> circle

//"<Tree size=\"7\">+ * Y Y * X X</Tree>" -> sphere
//"<Tree size=\"7\">- * 5 5 * Z Z</Tree>" -> sphere

//"<Tree size=\"7\">+ * * X X X X</Tree>" -> hyperbola
//"<Tree size=\"5\">+ * Y Y 1.5</Tree>" -> hyperbola

//"<Tree size=\"11\">/ * - X 1 - X 1 * 3 3</Tree>" -> ellipse
//"<Tree size=\"13\">- / * - Y 2 - Y 2 * 4 4 1</Tree>" -> ellipse

//"<Tree size=\"5\">- Z * 0.1 Y</Tree>" -> harmonic oscillator
//"<Tree size=\"3\">* 3 X</Tree>" -> harmonic oscillator

//"<Tree size=\"5\">- Z * 0.1 Y</Tree>" -> nonlinear harmonic oscillator
//"<Tree size=\"4\">* 9.8 sin X</Tree>" -> nonlinear harmonic oscillator

Tree::Tree* first = (Tree::Tree*) individual->getGenotype(0).get();
Tree::Tree* second = (Tree::Tree*) individual->getGenotype(1).get();

Expand Down Expand Up @@ -119,7 +101,7 @@ void MultipleTreeEvaluator::initializeVariables(IndividualP individual)
}
}

bool MultipleTreeEvaluator::isLowStdevOnRandomValues(IndividualP individual)
bool MultipleTreeEvaluator::isLowStdevOnRandomValues(IndividualP individual, string op)
{
vector<Point> randomPoints;
for (int i = 0; i < 10; i++)
Expand All @@ -135,112 +117,125 @@ bool MultipleTreeEvaluator::isLowStdevOnRandomValues(IndividualP individual)
}


double stdev = getFitnessFromPoints(individual, randomPoints);
double stdev = getFitnessFromPoints(individual, randomPoints, op);

return stdev < 10E-2;

}

double MultipleTreeEvaluator::getFitnessFromPoints(IndividualP individual, vector<Point> points)
{
vector<double> additionResults;
vector<double> subtractionResults;
vector<double> multiplicationResults;
vector<double> divisionResults;
Tree::Tree* first = getTreeAtIndex(individual, "", 0);
Tree::Tree* second = getTreeAtIndex(individual, "", 1);

map<string, vector<double>> results;
for (string op : _operations)
{
vector<double> emptyResults;
results[op] = emptyResults;
}

for (int i = 0; i < points.size(); i++)
{
Point p = points[i];
double result1 = getResult(individual, p, "+");
double result2 = getResult(individual, p, "-");
double result3 = getResult(individual, p, "*");
double result4 = getResult(individual, p, "/");

additionResults.push_back(result1);
subtractionResults.push_back(result2);
multiplicationResults.push_back(result3);
divisionResults.push_back(result4);
}

double stdev1 = getStdev(additionResults);
double stdev2 = getStdev(subtractionResults);
double stdev3 = getStdev(multiplicationResults);
double stdev4 = getStdev(divisionResults);
for (int j = 0; j < this->_variables.size(); j++)
{
double value = p.coordinates[j];
first->setTerminalValue(this->_variables[j], &value);
second->setTerminalValue(this->_variables[j], &value);
}
double firstResult;
double secondResult;


double minimalStdev = stdev1;
if (stdev2 < minimalStdev)
{
minimalStdev = stdev2;
}
if (stdev3 < minimalStdev)
{
minimalStdev = stdev3;
first->execute(&firstResult);
second->execute(&secondResult);

for (string op : _operations)
{
if (op == "+")
{
results[op].push_back(firstResult + secondResult);
}
else if (op == "-")
{
results[op].push_back(firstResult - secondResult);
}
else if (op == "*")
{
results[op].push_back(firstResult * secondResult);
}
else if (op == "/")
{
results[op].push_back(firstResult / secondResult);
}
}
}
if (stdev4 < minimalStdev)

double stdev = getStdev(results[_operations[0]]);

for (string op : _operations)
{
minimalStdev = stdev4;
double potentialStdev = getStdev(results[op]);
if (potentialStdev < stdev)
{
stdev = potentialStdev;
}
}

return minimalStdev;
return stdev;
}


double MultipleTreeEvaluator::getResult(IndividualP individual, Point p, string op)
double MultipleTreeEvaluator::getFitnessFromPoints(IndividualP individual, vector<Point> points, string op)
{
//"<Tree size=\"3\">* 4 4</Tree>" -> circle
//"<Tree size=\"7\"> + * Y Y * X X</Tree>" -> circle

//"<Tree size=\"7\">+ * Y Y * X X</Tree>" -> sphere
//"<Tree size=\"7\">- * 5 5 * Z Z</Tree>" -> sphere
Tree::Tree* first = getTreeAtIndex(individual, "", 0);
Tree::Tree* second = getTreeAtIndex(individual, "", 1);

//"<Tree size=\"7\">+ * * X X X X</Tree>" -> hyperbola
//"<Tree size=\"5\">+ * Y Y 1.5</Tree>" -> hyperbola
vector<double> results;

//"<Tree size=\"11\">/ * - X 1 - X 1 * 3 3</Tree>" -> ellipse
//"<Tree size=\"13\">- / * - Y 2 - Y 2 * 4 4 1</Tree>" -> ellipse
for (int i = 0; i < points.size(); i++)
{
Point p = points[i];

//"<Tree size=\"5\">- Z * 0.1 Y</Tree>" -> harmonic oscillator
//"<Tree size=\"3\">* 3 X</Tree>" -> harmonic oscillator
for (int j = 0; j < this->_variables.size(); j++)
{
double value = p.coordinates[j];
first->setTerminalValue(this->_variables[j], &value);
second->setTerminalValue(this->_variables[j], &value);
}
double firstResult;
double secondResult;

//"<Tree size=\"5\">- Z * 0.1 Y</Tree>" -> nonlinear harmonic oscillator
//"<Tree size=\"4\">* 9.8 sin X</Tree>" -> nonlinear harmonic oscillator
Tree::Tree* first = getTreeAtIndex(individual, "", 0);
Tree::Tree* second = getTreeAtIndex(individual, "", 1);
first->execute(&firstResult);
second->execute(&secondResult);

for (int j = 0; j < this->_variables.size(); j++)
{
double value = p.coordinates[j];
first->setTerminalValue(this->_variables[j], &value);
second->setTerminalValue(this->_variables[j], &value);
if (op == "+")
{
results.push_back(firstResult + secondResult);
}
else if (op == "-")
{
results.push_back(firstResult - secondResult);
}
else if (op == "*")
{
results.push_back(firstResult * secondResult);
}
else if (op == "/")
{
results.push_back(firstResult / secondResult);
}
}
double firstResult;
double secondResult;

first->execute(&firstResult);
second->execute(&secondResult);
double stdev = getStdev(results);

if (op == "+")
{
return firstResult + secondResult;
}
else if (op == "-")
{
return firstResult - secondResult;
}
else if (op == "*")
{
return firstResult * secondResult;
}
else if (op == "/")
{
return firstResult / secondResult;
}
else return 0;
return stdev;
}
//figure out which is the best

FitnessP MultipleTreeEvaluator::evaluate(IndividualP individual)
{
this->_operations = {"+", "-" ,"*", "/"};
Tree::Tree* first = getTreeAtIndex(individual, "", 0);
Tree::Tree* second = getTreeAtIndex(individual, "", 1);
vector<Tree::Tree*> allTrees = { first, second };
Expand All @@ -261,12 +256,21 @@ FitnessP MultipleTreeEvaluator::evaluate(IndividualP individual)
return fitness;
}

if (isLowStdevOnRandomValues(individual))
vector<string> leftoverOperators;
for (string op : _operations) {
if (!isLowStdevOnRandomValues(individual, op)) {
leftoverOperators.push_back(op);
}
}

if (leftoverOperators.empty())
{
fitness->setValue(domainSize * domainSize * domainSize);
return fitness;
}

_operations = leftoverOperators;

double minimalStdev = getFitnessFromPoints(individual, this->_points);
if (isnan(minimalStdev) || fabs(minimalStdev) > punishment)
{
Expand Down
5 changes: 3 additions & 2 deletions direct_methods/MultipleTreeEvaluator.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class MultipleTreeEvaluator : public AbstractEvaluateOp
vector<Point> _points;
vector<string> _variables;
bool _initializedVariables;
vector<string> _operations;
StateP _state;
public:
bool initialize(StateP state) override;
Expand All @@ -30,10 +31,10 @@ class MultipleTreeEvaluator : public AbstractEvaluateOp
MultipleTreeEvaluator(StateP state, string datasetFileName, ParetoFrontier* paretoFrontier);

bool containsAllVariables(IndividualP individual);
bool isLowStdevOnRandomValues(IndividualP individual);
bool isLowStdevOnRandomValues(IndividualP individual, string op);
void initializeVariables(IndividualP individual);
double getResult(IndividualP individual, Point p, string op);
double getFitnessFromPoints(IndividualP individual, vector<Point> points);
double getFitnessFromPoints(IndividualP individual, vector<Point> points, string op);

string getName() override
{
Expand Down
Loading

0 comments on commit 94053b8

Please sign in to comment.