⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eoreducemergereduce.h

📁 这是linux下的进化计算的源代码。 === === === === === === === === === === === ===== check latest news at http:
💻 H
字号:
/** -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-   -----------------------------------------------------------------------------   eoReduceMergeReduce.h    (c) Maarten Keijzer, Marc Schoenauer, 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: Marc.Schoenauer@inria.fr             mkeijzer@dhi.dk *///-----------------------------------------------------------------------------#ifndef _eoReduceMergeReduce_h#define _eoReduceMergeReduce_h//-----------------------------------------------------------------------------#include <eoPop.h>#include <eoFunctor.h>#include <eoMerge.h>#include <eoReduce.h>#include <utils/eoHowMany.h>//-----------------------------------------------------------------------------/**eoReduceMergeReduce is an eoReplacement:- saves possible elite parents- reduces rest of parents- reduces offspring- merges reduced populations- reduces resulting merged pop if necessary*/template <class EOT>class eoReduceMergeReduce : public eoReplacement<EOT>{public:  eoReduceMergeReduce(eoHowMany _howManyElite, 		      bool _strongElitism, 		      eoHowMany _howManyReducedParents,		      eoReduce<EOT> & _reduceParents,		      eoHowMany _howManyReducedOffspring, 		      eoReduce<EOT> & _reduceOffspring,		      eoReduce<EOT> & _reduceFinal) :    howManyElite(_howManyElite),    strongElitism(_strongElitism),    howManyReducedParents(_howManyReducedParents),    howManyReducedOffspring (_howManyReducedOffspring),    reduceParents(_reduceParents),    reduceOffspring(_reduceOffspring),    reduceFinal(_reduceFinal)  {}        void operator()(eoPop<EOT> & _parents, eoPop<EOT> & _offspring)    {      eoPop<EOT> temp;      unsigned int finalPopSize = _parents.size();      unsigned int offSize = _offspring.size();      unsigned int elite = howManyElite(finalPopSize);      if (elite)		   // some parents MUST be saved somewhere	{	  temp.resize(elite);	  _parents.nth_element(elite);	  std::copy(_parents.begin(), _parents.begin()+elite, temp.begin());	  _parents.erase(_parents.begin(), _parents.begin()+elite);	}      // the reduce steps. First the parents      unsigned reducedParentSize = howManyReducedParents(_parents.size());      if (!reducedParentSize)	_parents.clear();      else if (reducedParentSize != _parents.size())	reduceParents(_parents, reducedParentSize);      // then the offspring      unsigned reducedOffspringSize = howManyReducedOffspring(offSize);      if (!reducedOffspringSize)	throw std::runtime_error("No offspring left after reduction!");      if (reducedOffspringSize != offSize) // need reduction	reduceOffspring(_offspring, reducedOffspringSize);      // now merge reduced populations      _parents.resize(reducedParentSize + _offspring.size());      std::copy(_offspring.begin(), _offspring.end(), 		_parents.begin()+reducedParentSize);       // reduce the resulting population      // size depstd::ends on elitism      if (elite && strongElitism)	{	  if (_parents.size() != finalPopSize-elite)	    reduceFinal(_parents, finalPopSize-elite);	  // and put back the elite	  unsigned oldPSize = _parents.size();	  _parents.resize(_parents.size()+elite);	  std::copy(temp.begin(), temp.end(), _parents.begin()+oldPSize);	}      else		{                   // only reduce final pop to right size	  if (_parents.size() != finalPopSize)	    reduceFinal(_parents, finalPopSize);	  if (elite)	   // then treat weak elitism	    {	      unsigned toSave = 0;	      _parents.sort();	      EOT & eoLimit = _parents[elite-1];	      unsigned index=0;	      while ( (temp[index++] > eoLimit) && (index < temp.size()) )		toSave++;	      if (toSave)		for (unsigned i=0; i<toSave; i++)		  _parents[finalPopSize-1-i] = temp[i];	    }	}    }private:  eoHowMany howManyElite;	   // if 0, no elitism at all  bool strongElitism;		   // if false -> weak estd::listism  eoHowMany howManyReducedParents; // if 0, no parent in final replacement  eoHowMany howManyReducedOffspring; // if 0, std::runtime_error  // the reducers  eoReduce<EOT> & reduceParents;  eoReduce<EOT> & reduceOffspring;  eoReduce<EOT> & reduceFinal;};#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -