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

📄 eoproportionalcombinedop.h

📁 这是linux下的进化计算的源代码。 === === === === === === === === === === === ===== check latest news at http:
💻 H
字号:
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-//-----------------------------------------------------------------------------// eoCombinedOp.h// (c) GeNeura Team, 1998, Marc Schoenauer, 2000/*     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 *///-----------------------------------------------------------------------------#ifndef _eoCombinedOp_H#define _eoCombinedOp_H#include <eoObject.h>#include <eoPrintable.h>#include <eoFunctor.h>#include <eoOp.h>#include <utils/eoRNG.h>/**\defgroup PropCombinedOperatorsCombination of same-type Genetic Operators - Proportional choice*//** @name PropCombined Genetic operatorsThis files contains the classes eoPropCombinedXXXOp (XXX in {Mon, Bin, Quad})that allow to use more than a single operator of a specific classinto an algorithm, chosing by a roulette wheel based on user-defined rates@author Marc Schoenauer@version 0.1*/////////////////////////////////////////////////////////// combined MonOp///////////////////////////////////////////////////////** eoMonOp is the monary operator: genetic operator that takes only one EO * now accepts generic operators*/template <class EOT>class eoPropCombinedMonOp: public eoMonOp<EOT>{public:  /// Ctor from a "true" operator  eoPropCombinedMonOp(eoMonOp<EOT> & _first, const double _rate)  {    ops.push_back(&_first);    rates.push_back(_rate);  }  virtual std::string className() const { return "eoPropCombinedMonOp"; }  virtual void add(eoMonOp<EOT> & _op, const double _rate, bool _verbose=false)  {    ops.push_back(&_op);    rates.push_back(_rate);    // compute the relative rates in percent - to warn the user!    if (_verbose)      printOn(std::cout);  }  // outputs the operators and percentages  virtual void printOn(std::ostream & _os)  {    double total = 0;    unsigned i;    for (i=0; i<ops.size(); i++)      total += rates[i];    _os << "In " << className() << "\n" ;    for (i=0; i<ops.size(); i++)      _os << ops[i]->className() << " with rate " << 100*rates[i]/total << " %\n";  }  virtual bool operator()(EOT & _indi)  {    unsigned what = rng.roulette_wheel(rates); // choose one op    return (*ops[what])(_indi);		   // apply it  }protected:std::vector<eoMonOp<EOT>*> ops;std::vector<double> rates;};////////////////////////////////////////////////////////// combined BinOp///////////////////////////////////////////////////////** COmbined Binary genetic operator: *  operator() has two operands, only the first one can be modified */template <class EOT>class eoPropCombinedBinOp: public eoBinOp<EOT>{public:  /// Ctor  eoPropCombinedBinOp(eoBinOp<EOT> & _first, const double _rate)  {    ops.push_back(&_first);    rates.push_back(_rate);  }virtual std::string className() const { return "eoPropCombinedBinOp"; }virtual void add(eoBinOp<EOT> & _op, const double _rate, bool _verbose=false)  {    ops.push_back(&_op);    rates.push_back(_rate);    // compute the relative rates in percent - to warn the user!    if (_verbose)      {	double total = 0;	unsigned i;	for (i=0; i<ops.size(); i++)	  total += rates[i];	std::cout << "In " << className() << "\n" ;	for (i=0; i<ops.size(); i++)	  std::cout << ops[i]->className() << " with rate " << 100*rates[i]/total << " %\n";      }  }  virtual void operator()(EOT & _indi1, const EOT & _indi2)  {    unsigned what = rng.roulette_wheel(rates); // choose one op index    return (*ops[what])(_indi1, _indi2);		   // apply it  }private:std::vector<eoBinOp<EOT>*> ops;std::vector<double> rates;};////////////////////////////////////////////////////////// combined QuadOp///////////////////////////////////////////////////////** Quad genetic operator: subclasses eoOp, and defines basically the    operator() with two operands, both can be modified.*//** Combined quad genetic operator: *  operator() has two operands, both can be modified * generic operators are now allowed: there are imbedded into * the corresponding "true" operator */template <class EOT>class eoPropCombinedQuadOp: public eoQuadOp<EOT>{public:  /// Ctor from a true operator  eoPropCombinedQuadOp(eoQuadOp<EOT> & _first, const double _rate)  {    ops.push_back(&_first);    rates.push_back(_rate);  }virtual std::string className() const { return "eoPropCombinedQuadOp"; }  // addition of a true operatorvirtual void add(eoQuadOp<EOT> & _op, const double _rate, bool _verbose=false)  {    ops.push_back(&_op);    rates.push_back(_rate);    // compute the relative rates in percent - to warn the user!    if (_verbose)      printOn(std::cout);  }  // outputs the operators and percentages  virtual void printOn(std::ostream & _os)  {    double total = 0;    unsigned i;    for (i=0; i<ops.size(); i++)      total += rates[i];    _os << "In " << className() << "\n" ;    for (i=0; i<ops.size(); i++)      _os << ops[i]->className() << " with rate " << 100*rates[i]/total << " %\n";  }  virtual bool operator()(EOT & _indi1, EOT & _indi2)  {    unsigned what = rng.roulette_wheel(rates); // choose one op index    return (*ops[what])(_indi1, _indi2);		   // apply it  }private:std::vector<eoQuadOp<EOT>*> ops;std::vector<double> rates;};// for General Ops, it's another story - see eoOpCOntainer#endif

⌨️ 快捷键说明

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