eoVariableLengthMutation.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
00002 
00003 //-----------------------------------------------------------------------------
00004 // eoVariableLengthMutation.h
00005 // (c) Marc Schoenauer 1999 - Maarten Keijzer 2000
00006 /*
00007     This library is free software; you can redistribute it and/or
00008     modify it under the terms of the GNU Lesser General Public
00009     License as published by the Free Software Foundation; either
00010     version 2 of the License, or (at your option) any later version.
00011 
00012     This library is distributed in the hope that it will be useful,
00013     but WITHOUT ANY WARRANTY; without even the implied warranty of
00014     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015     Lesser General Public License for more details.
00016 
00017     You should have received a copy of the GNU Lesser General Public
00018     License along with this library; if not, write to the Free Software
00019     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00020 
00021     Contact: Marc.Schoenauer@polytechnique.fr
00022              mkeijzer@cs.vu.nl
00023  */
00024 //-----------------------------------------------------------------------------
00025 
00026 #ifndef _eoVariableLengthMutation_h
00027 #define _eoVariableLengthMutation_h
00028 
00029 #include <eoFunctor.h>
00030 #include <eoOp.h>
00031 #include <eoInit.h>
00032 
00047 template <class EOT>
00048 class eoVlAddMutation : public eoMonOp<EOT>
00049 {
00050 public :
00051 
00052   typedef typename EOT::AtomType AtomType;
00053 
00059   eoVlAddMutation(unsigned _nMax, eoInit<AtomType> & _atomInit) :
00060     nMax(_nMax), atomInit(_atomInit) {}
00061 
00063   bool operator()(EOT & _eo)
00064   {
00065     if (_eo.size() >= nMax)
00066       return false;                // unmodifed
00067     AtomType atom;
00068     atomInit(atom);
00069     unsigned pos = rng.random(_eo.size()+1);
00070     _eo.insert(_eo.begin()+pos, atom);
00071     return true;
00072   }
00073 
00075   virtual std::string className() const { return "eoVlAddMutation"; }
00076 
00077 private:
00078   unsigned nMax;
00079   eoInit<AtomType> & atomInit;
00080 };
00081 
00082 
00084 template <class EOT>
00085 class eoGeneDelChooser : public eoUF<EOT &, unsigned int>
00086 {
00087 public:
00088   virtual std::string className() const =0;
00089 
00090 };
00091 
00093 template <class EOT>
00094 class eoUniformGeneChooser: public eoGeneDelChooser<EOT>
00095 {
00096 public:
00097     eoUniformGeneChooser(){}
00098     unsigned operator()(EOT & _eo)
00099     {
00100         return eo::rng.random(_eo.size());
00101     }
00102   virtual std::string className() const { return "eoUniformGeneChooser"; }
00103 };
00104 
00109 template <class EOT>
00110 class eoVlDelMutation : public eoMonOp<EOT>
00111 {
00112 public :
00113 
00114   typedef typename EOT::AtomType AtomType;
00115 
00121   eoVlDelMutation(unsigned _nMin, eoGeneDelChooser<EOT> & _chooser) :
00122     nMin(_nMin), uChooser(), chooser(_chooser) {}
00123 
00128   eoVlDelMutation(unsigned _nMin) :
00129     nMin(_nMin), uChooser(), chooser(uChooser) {}
00130 
00134   bool operator()(EOT & _eo)
00135   {
00136     if (_eo.size() <= nMin)
00137       return false;                // unmodifed
00138     unsigned pos = chooser(_eo);
00139     _eo.erase(_eo.begin()+pos);
00140     return true;
00141   }
00142 
00143   virtual std::string className() const
00144   {
00145     std::ostringstream os;
00146     os << "eoVlDelMutation("<<chooser.className() << ")";
00147     return os.str();
00148   }
00149 
00150 private:
00151     unsigned nMin;
00152     eoUniformGeneChooser<EOT> uChooser;
00153     eoGeneDelChooser<EOT> & chooser;
00154 };
00155 
00156 
00157 
00158 #endif

Generated on Thu Apr 19 11:02:28 2007 for EO by  doxygen 1.4.7