From e9e3cbb62305520773e8e10d353dda9659e57c83 Mon Sep 17 00:00:00 2001 From: evomarc Date: Mon, 17 Jun 2002 04:13:45 +0000 Subject: [PATCH] Adding the truncation selectors. 2 versions: eoTruncatedSelectOne is an eoSelectOne, and eoTruncatedSelectMany works like an eoSelectMany (but is NOT) --- eo/src/eoTruncatedSelectMany.h | 117 +++++++++++++++++++++++++++++++++ eo/src/eoTruncatedSelectOne.h | 110 +++++++++++++++++++++++++++++++ 2 files changed, 227 insertions(+) create mode 100644 eo/src/eoTruncatedSelectMany.h create mode 100644 eo/src/eoTruncatedSelectOne.h diff --git a/eo/src/eoTruncatedSelectMany.h b/eo/src/eoTruncatedSelectMany.h new file mode 100644 index 00000000..24dbc47a --- /dev/null +++ b/eo/src/eoTruncatedSelectMany.h @@ -0,0 +1,117 @@ +/** -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + + ----------------------------------------------------------------------------- + eoTruncatedSelectMany.h + (c) Maarten Keijzer, Marc Schoenauer, GeNeura Team, 2002 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Contact: todos@geneura.ugr.es, http://geneura.ugr.es + Marc.Schoenauer@inria.fr + mkeijzer@dhi.dk + */ +//----------------------------------------------------------------------------- + +#ifndef _eoTruncatedSelectMany_h +#define _eoTruncatedSelectMany_h + + +//----------------------------------------------------------------------------- +#include +#include +#include +#include +//----------------------------------------------------------------------------- + +/** eoTruncatedSelectMany selects many individuals using eoSelectOne as it's + mechanism. Therefore eoSelectMany needs an eoSelectOne in its ctor + + It will use an eoHowMnay to determine the number of guys to select, + and push them to the back of the destination population. + + And it will only perform selection from the top guys in the population. + + It is NOT a special case of eoSelectMany because it needs to SORT + the population to discard the worst guys before doing the selection + + However, the same result can be obtained by embedding an + eoTruncatedSelectOne into an eoSelectMany ... +*/ +template +class eoTruncatedSelectMany : public eoSelect +{ + public: + /// Ctor + eoTruncatedSelectMany(eoSelectOne& _select, + double _rateGenitors, double _rateFertile, + bool _interpret_as_rateG = true, + bool _interpret_as_rateF = true) + : select(_select), + howManyGenitors(_rateGenitors, _interpret_as_rateG), + howManyFertile(_rateFertile, _interpret_as_rateF) {} + + // Ctor with eoHowManys + eoTruncatedSelectMany(eoSelectOne& _select, + eoHowMany _howManyGenitors, eoHowMany _howManyFertile) + : select(_select), howManyGenitors(_howManyGenitors), + howManyFertile(_howManyFertile) {} + + /** + The implementation repeatidly selects an individual + + @param _source the source population + @param _dest the resulting population (size of this population is the number of times eoSelectOne is called. It empties the destination and adds the selection into it) + */ + virtual void operator()(const eoPop& _source, eoPop& _dest) + { + unsigned target = howManyGenitors(_source.size()); + + _dest.resize(target); + + unsigned nbFertile = howManyFertile(_source.size()); + + //revert to standard selection (see eoSelectMany) if no truncation + if (nbFertile == _source.size()) + { + select.setup(_source); + + for (size_t i = 0; i < _dest.size(); ++i) + _dest[i] = select(_source); + } + else + { + // at the moment, brute force (rush rush, no good) + // what we would need otherwise is a vector class + // and selectors that act on such a thing + eoPop tmpPop = _source; // hum hum, could be a pain in the ass + + tmpPop.sort(); // maybe we could only do partial sort? + tmpPop.resize(nbFertile); // only the best guys here now + tmpPop.shuffle(); // as some selectors are order-sensitive + + select.setup(tmpPop); + + for (size_t i = 0; i < _dest.size(); ++i) + _dest[i] = select(tmpPop); + } + } + +private : + eoSelectOne& select; // selector for one guy + eoHowMany howManyGenitors; // number of guys to select + eoHowMany howManyFertile; // number of fertile guys +}; + +#endif diff --git a/eo/src/eoTruncatedSelectOne.h b/eo/src/eoTruncatedSelectOne.h new file mode 100644 index 00000000..8cc4db1b --- /dev/null +++ b/eo/src/eoTruncatedSelectOne.h @@ -0,0 +1,110 @@ +/** -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + + ----------------------------------------------------------------------------- + eoTruncatedSelectOne.h + (c) Maarten Keijzer, Marc Schoenauer, GeNeura Team, 2002 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Contact: todos@geneura.ugr.es, http://geneura.ugr.es + Marc.Schoenauer@inria.fr + mkeijzer@dhi.dk + */ +//----------------------------------------------------------------------------- + +#ifndef _eoTruncatedSelectOne_h +#define _eoTruncatedSelectOne_h + + +//----------------------------------------------------------------------------- +#include +#include +#include +//----------------------------------------------------------------------------- + +/** eoTruncatedSelectOne selects one individual using eoSelectOne as it's + mechanism. Therefore eoTruncatedSelectOne needs an eoSelectOne in its ctor + + It will perform selection only from the top guys in the population. + +*/ +template +class eoTruncatedSelectOne : public eoSelectOne +{ +public: + /** Ctor from rate and bool */ + eoTruncatedSelectOne(eoSelectOne& _select, + double _rateFertile, + bool _interpret_as_rateF = true) + : select(_select), + howManyFertile(_rateFertile, _interpret_as_rateF), + tmpPop(), actualPop(tmpPop) + {} + + /** Ctor with eoHowMany */ + eoTruncatedSelectOne(eoSelectOne& _select, + eoHowMany _howManyFertile) + : select(_select), howManyFertile(_howManyFertile), + tmpPop(), actualPop(tmpPop) + {} + + + /** setup procedures: fills the temporary population with the fertile guys */ + void setup(const eoPop& _source) + { + unsigned fertile = howManyFertile(_source.size()); + if (fertile == _source.size()) // noting to do, all are fertile + { + actualPop = _source; + } + else + { + // copy only best ferile to actualPop + tmpPop.resize(fertile); + std::vector result; + _source.nth_element(fertile, result); + for (unsigned i=0; i& _pop) + { + return select(actualPop); + } + + +private : + eoSelectOne& select; // selector for one guy + eoHowMany howManyFertile; // number of fertile guys + eoPop tmpPop; // intermediate population - fertile guys + eoPop & actualPop; // to avoid copies when 100% fertility +}; + +#endif