eoSequentialSelect.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
00002 
00003 //-----------------------------------------------------------------------------
00004 // eoSequential.h
00005 // (c) GeNeura Team, 1998 - Maarten Keijzer 2000, Marc Schoenauer, 2002
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: todos@geneura.ugr.es, http://geneura.ugr.es
00022              Marc.Schoenauer@polytechnique.fr
00023              mak@dhi.dk
00024  */
00025 //-----------------------------------------------------------------------------
00026 
00027 #ifndef eoSequential_h
00028 #define eoSequential_h
00029 
00030 #include <limits>
00031 
00032 #include "utils/eoData.h"
00033 #include "utils/eoRNG.h"
00034 #include "eoSelectOne.h"
00035 
00052 template <class EOT> class eoSequentialSelect: public eoSelectOne<EOT>
00053 {
00054  public:
00058   eoSequentialSelect(bool _ordered = true)
00059         : ordered(_ordered), current(std::numeric_limits<unsigned>::max()) {}
00060 
00061   void setup(const eoPop<EOT>& _pop)
00062   {
00063     eoPters.resize(_pop.size());
00064     if (ordered)    // probably we could have a marker to avoid re-sorting
00065             _pop.sort(eoPters);
00066     else
00067       _pop.shuffle(eoPters);
00068     current=0;
00069   }
00070 
00071   virtual const EOT& operator()(const eoPop<EOT>& _pop)
00072   {
00073     if (current >= _pop.size())
00074       setup(_pop);
00075 
00076     unsigned eoN = current;
00077     current++;
00078     return *eoPters[eoN] ;
00079   }
00080 private:
00081   bool ordered;
00082   unsigned current;
00083   std::vector<const EOT*> eoPters;
00084 };
00085 
00086 
00087 
00097 template <class EOT> class eoEliteSequentialSelect: public eoSelectOne<EOT>
00098 {
00099  public:
00100 
00104   eoEliteSequentialSelect(): current(std::numeric_limits<unsigned>::max()) {}
00105 
00106   void setup(const eoPop<EOT>& _pop)
00107   {
00108     eoPters.resize(_pop.size());
00109     _pop.shuffle(eoPters);
00110     // now get the best
00111     unsigned int ibest = 0;
00112     const EOT * best = eoPters[0];
00113     if (_pop.size() == 1)
00114       throw std::runtime_error("Trying eoEliteSequentialSelect with only one individual!");
00115     for (unsigned i=1; i<_pop.size(); i++)
00116       if (*eoPters[i]>*best)
00117         {
00118           ibest = i;
00119           best = eoPters[ibest];
00120         }
00121     // and put it upfront
00122     const EOT *ptmp = eoPters[0];
00123     eoPters[0]=best;
00124     eoPters[ibest] = ptmp;
00125     // exit after setting current
00126     current=0;
00127   }
00128 
00129   virtual const EOT& operator()(const eoPop<EOT>& _pop)
00130   {
00131     if (current >= _pop.size())
00132       setup(_pop);
00133 
00134     unsigned eoN = current;
00135     current++;
00136     return *eoPters[eoN] ;
00137   }
00138 private:
00139   unsigned current;
00140   std::vector<const EOT*> eoPters;
00141 };
00142 
00143 
00144 #endif

Generated on Thu Oct 19 05:06:38 2006 for EO by  doxygen 1.3.9.1