Added symbolic regression, which tests combined ops as well
This commit is contained in:
parent
04bc4ecde8
commit
8ae796ab28
14 changed files with 161 additions and 199 deletions
|
|
@ -17,19 +17,12 @@ template <class FType, class Node>
|
|||
class eoParseTree : public EO<FType>, public parse_tree<Node>
|
||||
{
|
||||
public :
|
||||
|
||||
typedef parse_tree<Node>::subtree Subtree;
|
||||
|
||||
eoParseTree(void) {}
|
||||
eoParseTree(const parse_tree<Node>& tree) : parse_tree<Node>(tree) {}
|
||||
|
||||
typedef typename parse_tree<Node>::subtree Type;
|
||||
|
||||
eoParseTree(void) : EO<FType>(), parse_tree<Node>() {}
|
||||
eoParseTree(unsigned _size, eoRnd<Type>& _rnd)
|
||||
: EO<FType>(), parse_tree<Node>(_rnd())
|
||||
{
|
||||
pruneTree(_size);
|
||||
}
|
||||
eoParseTree(eoRnd<Type>& _rnd)
|
||||
: EO<FType>(), parse_tree<Node>(_rnd())
|
||||
{}
|
||||
|
||||
virtual void pruneTree(unsigned _size)
|
||||
{
|
||||
if (_size < 1)
|
||||
|
|
@ -37,7 +30,7 @@ public :
|
|||
|
||||
if (size() > _size)
|
||||
{
|
||||
Type* sub = &operator[](size() - 2); // prune tree
|
||||
Subtree* sub = &operator[](size() - 2); // prune tree
|
||||
|
||||
while (sub->size() > _size)
|
||||
{
|
||||
|
|
@ -101,7 +94,7 @@ class eoGpDepthInitializer : public eoInit< eoParseTree<FType, Node> >
|
|||
const vector<Node>& _initializor,
|
||||
bool _grow = true)
|
||||
:
|
||||
eoRnd<EoType::Type>(),
|
||||
eoInit<EoType>(),
|
||||
max_depth(_max_depth),
|
||||
initializor(_initializor),
|
||||
grow(_grow)
|
||||
|
|
@ -115,7 +108,8 @@ class eoGpDepthInitializer : public eoInit< eoParseTree<FType, Node> >
|
|||
|
||||
generate(sequence, max_depth);
|
||||
|
||||
_tree = parse_tree<Node>(sequence.begin(), sequence.end());
|
||||
parse_tree<Node> tmp(sequence.begin(), sequence.end());
|
||||
_tree.swap(tmp);
|
||||
}
|
||||
|
||||
void generate(list<Node>& sequence, int the_max, int last_terminal = -1)
|
||||
|
|
@ -180,10 +174,10 @@ public:
|
|||
/// Dtor
|
||||
virtual ~eoSubtreeXOver () {};
|
||||
|
||||
void operator()(eoIndiSelector<EoType>& _source, eoInserter<EoType>& _sink ) const
|
||||
void operator()(eoIndiSelector<EoType>& _select, eoInserter<EoType>& _insert )
|
||||
{
|
||||
EoType eo1 = _source.select();
|
||||
const EoType& eo2 = _source.select();
|
||||
EoType eo1 = _select();
|
||||
const EoType& eo2 = _select();
|
||||
|
||||
int i = rng.random(eo1.size());
|
||||
int j = rng.random(eo2.size());
|
||||
|
|
@ -193,7 +187,7 @@ public:
|
|||
eo1.pruneTree(max_length);
|
||||
|
||||
eo1.invalidate();
|
||||
_sink.insert(eo1);
|
||||
_insert(eo1);
|
||||
}
|
||||
|
||||
unsigned max_length;
|
||||
|
|
@ -206,7 +200,7 @@ public:
|
|||
|
||||
typedef eoParseTree<FType, Node> EoType;
|
||||
|
||||
eoBranchMutation(eoRnd<EoType::Type>& _init, unsigned _max_length)
|
||||
eoBranchMutation(eoInit<EoType>& _init, unsigned _max_length)
|
||||
: eoGeneralOp<EoType>(), max_length(_max_length), initializer(_init)
|
||||
{};
|
||||
|
||||
|
|
@ -215,25 +209,28 @@ public:
|
|||
/// Dtor
|
||||
virtual ~eoBranchMutation() {};
|
||||
|
||||
void operator()(eoIndiSelector<EoType>& _source, eoInserter<EoType>& _sink ) const
|
||||
void operator()(eoIndiSelector<EoType>& _select, eoInserter<EoType>& _insert )
|
||||
{
|
||||
EoType eo1 = _source.select();
|
||||
EoType eo1 = _select();
|
||||
int i = rng.random(eo1.size());
|
||||
|
||||
EoType eo2(eo1[i].size(), initializer); // create random other to cross with
|
||||
EoType eo2;
|
||||
initializer(eo2);
|
||||
|
||||
eo1[i] = eo2.back(); // insert subtree
|
||||
int j = rng.random(eo2.size());
|
||||
|
||||
eo1[i] = eo2[j]; // insert subtree
|
||||
|
||||
eo1.pruneTree(max_length);
|
||||
|
||||
|
||||
eo1.invalidate();
|
||||
_sink.insert(eo1);
|
||||
_insert(eo1);
|
||||
}
|
||||
|
||||
private :
|
||||
|
||||
unsigned max_length;
|
||||
eoRnd<EoType::Type>& initializer;
|
||||
eoInit<EoType>& initializer;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -148,7 +148,7 @@ public :
|
|||
if (arity == 0)
|
||||
return 0;
|
||||
|
||||
T* t new T [arity];
|
||||
T* t = new T [arity];
|
||||
|
||||
for (int i = 0; i < arity; ++i)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -16,15 +16,6 @@
|
|||
* modified is included with the above copyright notice.
|
||||
|
||||
|
||||
* Special disclaimer and political statement:
|
||||
|
||||
* In contrast with the rest of the EO package where you might have found this code, this software
|
||||
* does NOT fall under the GNU Lesser Public License or the GNU Public License, nor is anyone allowed
|
||||
* by the copyright holder (that's me) to put it under either license.
|
||||
* Doing this would limit my and your freedom to use this software in any way
|
||||
* you or I see fit, including but not limited to closed-source software.
|
||||
|
||||
|
||||
|
||||
Usage information.
|
||||
|
||||
|
|
@ -173,7 +164,7 @@ namespace gp_parse_tree
|
|||
|
||||
#include "node_pool.h"
|
||||
|
||||
|
||||
/// This ones defined because gcc does not always implement namespaces
|
||||
template <class T>
|
||||
inline void do_the_swap(T& a, T& b)
|
||||
{
|
||||
|
|
@ -371,21 +362,20 @@ public :
|
|||
|
||||
void swap(subtree& y)
|
||||
{
|
||||
do_the_swap(content, y.content);
|
||||
do_the_swap(args, y.args);
|
||||
do_the_swap(parent, y.parent);
|
||||
do_the_swap(content, y.content);
|
||||
do_the_swap(args, y.args);
|
||||
|
||||
adopt();
|
||||
y.adopt();
|
||||
|
||||
do_the_swap(_cumulative_size, y._cumulative_size);
|
||||
do_the_swap(_depth, y._depth);
|
||||
do_the_swap(_size, y._size);
|
||||
do_the_swap(parent, y.parent);
|
||||
|
||||
do_the_swap(_cumulative_size, y._cumulative_size);
|
||||
do_the_swap(_depth, y._depth);
|
||||
do_the_swap(_size, y._size);
|
||||
updateAfterInsert();
|
||||
}
|
||||
|
||||
friend void swap(subtree& x, subtree& y)
|
||||
{
|
||||
x.swap(y);
|
||||
}
|
||||
|
||||
protected :
|
||||
|
||||
virtual void updateAfterInsert(void)
|
||||
|
|
@ -973,7 +963,7 @@ ptrdiff_t* distance_type(gp_parse_tree::parse_tree<T>::iterator)
|
|||
return 0;
|
||||
}
|
||||
|
||||
// Put customized swaps also in std...
|
||||
/* Put customized swaps also in std...
|
||||
|
||||
template<class T> inline
|
||||
void swap(gp_parse_tree::parse_tree<T>& a, gp_parse_tree::parse_tree<T>& b)
|
||||
|
|
@ -985,7 +975,7 @@ template<class T> inline
|
|||
void iter_swap(vector<gp_parse_tree::parse_tree<T> >::iterator a, vector<gp_parse_tree::parse_tree<T> > b)
|
||||
{
|
||||
a->swap(*b);
|
||||
}
|
||||
}*/
|
||||
|
||||
|
||||
} // namespace std
|
||||
|
|
|
|||
Reference in a new issue