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

📄 eorealbounds.h

📁 这是linux下的进化计算的源代码。 === === === === === === === === === === === ===== check latest news at http:
💻 H
📖 第 1 页 / 共 2 页
字号:
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-//-----------------------------------------------------------------------------// eoRealBounds.h// (c) Marc Schoenauer 2001, Maarten Keijzer 2000, GeNeura Team, 1998/*     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@polytechnique.fr             mak@dhi.dk *///-----------------------------------------------------------------------------#ifndef _eoRealBounds_h#define _eoRealBounds_h#include <stdexcept>		   // std::exceptions!#include <utils/eoRNG.h>/**\defgroup EvolutionStrategies*//**\class eoRealBounds eoRealBounds.h es/eoRealBounds.h\ingroup EvolutionStrategies    Defines bound classes for real numbers.Scalar type:------------Basic class is eoRealBounds, a pure virtual.The following pure virtual methods are to be used in mutations:- void foldsInBounds(double &) that folds any value that falls out of   the bounds back into the bounds, by bouncing on the limit (if any)- bool isInBounds(double) that simply says whether or not the argument   is in the bounds- void truncate(double &) that set the argument to the bound value itit exceeds itSo mutation can choose - iterate trying until they fall in bounds, - only try once and "restd::pair" by using the foldsInBounds method- only try once and restd::pair using the truncate method (will create a  huge bias toward the bound if the soluiton is not far from the bounds)There is also a uniform() method that generates a uniform value (if possible, i.e. if bounded) in the interval.Derived class are eoRealInterval that holds a minimum and maximum value, eoRealNoBounds the "unbounded bounds" (-infinity, +infinity)eoRealBelowBound the half-bounded interval [min, +infinity)eoRealAboveBound the   half-bounded interval (-infinity, max]THis file also contains the declaration of *the* global object thatis the unbounded bound*/class eoRealBounds : public eoPersistent{ public:  virtual ~eoRealBounds(){}  /** Self-Test: true if ***both*** a min and a max   */  virtual bool isBounded(void) const  = 0;  /** Self-Test: true if no min ***and*** no max   *        hence no further need to test/truncate/fold anything   */  virtual bool hasNoBoundAtAll(void) const  = 0;  /** Self-Test: bounded from below???   */  virtual bool isMinBounded(void) const = 0;  /** Self-Test: bounded from above???   */  virtual bool isMaxBounded(void) const = 0;  /** Test on a value: is it in bounds?   */  virtual bool isInBounds(double)  const = 0;  /** Put value back into bounds - by folding back and forth   */  virtual void foldsInBounds(double &)  const = 0;  /** Put value back into bounds - by truncating to a boundary value   */  virtual void truncate(double &)  const = 0;  /** get minimum value    *  @std::exception if does not exist   */    virtual double minimum()  const = 0 ;  /** get maximum value   *  @std::exception if does not exist   */    virtual double maximum()  const = 0 ;  /** get range   *  @std::exception if unbounded   */    virtual double range()  const = 0;  /** random generator of uniform numbers in bounds   * @std::exception if unbounded   */  virtual double uniform(eoRng & _rng = eo::rng)  const = 0;  /** for memory managements - ugly */  virtual eoRealBounds * dup()  const = 0;};/** A default class for unbounded variables */class eoRealNoBounds : public eoRealBounds{public:  virtual ~eoRealNoBounds(){}  virtual bool isBounded(void)  const {return false;}  virtual bool hasNoBoundAtAll(void) const  {return true;}  virtual bool isMinBounded(void)  const {return false;}  virtual bool isMaxBounded(void)  const {return false;}  virtual void foldsInBounds(double &)  const {return;}  virtual void truncate(double &)  const {return;}  virtual bool isInBounds(double)  const {return true;}  virtual double minimum() const  {    throw std::logic_error("Trying to get minimum of unbounded eoRealBounds");  }  virtual double maximum() const   {    throw std::logic_error("Trying to get maximum of unbounded eoRealBounds");  }  virtual double range() const   {    throw std::logic_error("Trying to get range of unbounded eoRealBounds");  }  virtual double uniform(eoRng & _rng = eo::rng) const   {    throw std::logic_error("Trying to generate uniform values in unbounded eoRealBounds");  }  // methods from eoPersistent  /**   * Read object.   * @param _is A std::istream.   * but reading should not be done here, because of bound problems   * see eoRealVectorBounds   */  virtual void readFrom(std::istream& _is)   {    throw std::runtime_error("Should not use eoRealBounds::readFrom");  }  /**   * Write object. It's called printOn since it prints the object on a stream.   * @param _os A std::ostream.   */  virtual void printOn(std::ostream& _os) const  {    _os << "[-inf,+inf]";  }  /** for memory managements - ugly */  virtual eoRealBounds * dup() const   {    return new eoRealNoBounds(*this);  }};// one object for all - see eoRealBounds.cppextern eoRealNoBounds eoDummyRealNoBounds;/** * fully bounded eoRealBound == interval */class eoRealInterval : public eoRealBounds{public :  virtual ~eoRealInterval(){}    /**       Simple bounds = minimum and maximum (allowed)  */  eoRealInterval(double _min=0, double _max=1) :     repMinimum(_min), repMaximum(_max), repRange(_max-_min)   {    if (repRange<=0)      throw std::logic_error("Void range in eoRealBounds");  }  // accessors    virtual double minimum() const { return repMinimum; }  virtual double maximum() const { return repMaximum; }  virtual double range()  const { return repRange; }  // description  virtual bool isBounded(void)  const {return true;}  virtual bool hasNoBoundAtAll(void)  const {return false;}  virtual bool isMinBounded(void)  const {return true;}  virtual bool isMaxBounded(void)  const {return true;}  virtual double uniform(eoRng & _rng = eo::rng) const   {    return repMinimum + _rng.uniform(repRange);  }    // says if a given double is within the bounds  virtual bool isInBounds(double _r) const   {    if (_r < repMinimum)      return false;    if (_r > repMaximum)      return false;    return true;  }  // folds a value into bounds  virtual void foldsInBounds(double &  _r) const   {    long iloc;    double dlargloc = 2 * range() ;    if (fabs(_r) > 1.0E9)		// iloc too large!      {	_r = uniform();	return;      }    if ( (_r > maximum()) )      {	iloc = (long) ( (_r-minimum()) / dlargloc ) ;	_r -= dlargloc * iloc ;	if ( _r > maximum() )	  _r = 2*maximum() - _r ;      }        if (_r < minimum())       {	iloc = (long) ( (maximum()-_r) / dlargloc ) ;	_r += dlargloc * iloc ;	if (_r < minimum())	  _r = 2*minimum() - _r ;      }  }      // truncates to the bounds  virtual void truncate(double & _r) const   {    if (_r < repMinimum)      _r = repMinimum;    else if (_r > repMaximum)      _r = repMaximum;    return;  }  // methods from eoPersistent  /**   * Read object.   * @param _is A std::istream.   * but reading should not be done here, because of bound problems   * see eoRealVectorBounds   */  virtual void readFrom(std::istream& _is)   {    throw std::runtime_error("Should not use eoRealInterval::readFrom");  }  /**   * Write object. It's called printOn since it prints the object on a stream.   * @param _os A std::ostream.   */  virtual void printOn(std::ostream& _os) const  {    _os << "[" << repMinimum << "," << repMaximum << "]";  }  /** for memory managements - ugly */  virtual eoRealBounds * dup() const   {    return new eoRealInterval(*this);  }private :  double repMinimum;  double repMaximum;  double repRange;			   // to minimize operations ???};/** * an eoRealBound bounded from below only */class eoRealBelowBound : public eoRealBounds{public :  virtual ~eoRealBelowBound(){}    /**       Simple bounds = minimum  */  eoRealBelowBound(double _min=0) :     repMinimum(_min)  {}  // accessors    virtual double minimum() const { return repMinimum; }

⌨️ 快捷键说明

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