📄 eointbounds.h
字号:
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-//-----------------------------------------------------------------------------// eoIntBounds.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 _eoIntBounds_h#define _eoIntBounds_h#include <stdexcept> // std::exceptions!#include <utils/eoRNG.h>/**\defgroup EvolutionStrategies*//**\class eoIntBounds eoIntBounds.h es/eoIntBounds.h\ingroup EvolutionStrategies Defines bound classes for real numbers.Scalar type:------------Basic class is eoIntBounds, a pure virtual.The following pure virtual methods are to be used in mutations:- void foldsInBounds(long int &) that folds any value that falls out of the bounds back into the bounds, by bouncing on the limit (if any)- bool isInBounds(long int) that simply says whether or not the argument is in the bounds- void truncate(long int &) 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 eoIntInterval that holds a minimum and maximum value, eoIntNoBounds the "unbounded bounds" (-infinity, +infinity)eoIntBelowBound the half-bounded interval [min, +infinity)eoIntAboveBound the half-bounded interval (-infinity, max]THis file also contains the declaration of *the* global object thatis the unbounded bound*/class eoIntBounds : public eoPersistent{ public: virtual ~eoIntBounds(){} /** 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; /** foldsInBounds for ints: * call the method for double and convert back */ virtual void foldsInBounds(long int & i) const { double r = double(i); foldsInBounds(r); i = (long int)(r); } /** Put value back into bounds - by truncating to a boundary value */ virtual void truncate(double &) const = 0; /** truncate for ints: call the method for double and convert back */ virtual void truncate(long int & i) const { double r = double(i); truncate(r); i = (long int)(r); } /** get minimum value * @std::exception if does not exist */ virtual long int minimum() const = 0 ; /** get maximum value * @std::exception if does not exist */ virtual long int maximum() const = 0 ; /** get range * @std::exception if unbounded */ virtual long int range() const = 0; /** random generator of uniform numbers in bounds * uses same naming convention than eo::rng * @std::exception if unbounded */ virtual double uniform(eoRng & _rng = eo::rng) const = 0; virtual long int random(eoRng & _rng = eo::rng) const = 0; /** for memory managements - ugly */ virtual eoIntBounds * dup() const = 0;};/** A default class for unbounded variables */class eoIntNoBounds : public eoIntBounds{public: virtual ~eoIntNoBounds(){} 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 long int minimum() const { throw std::logic_error("Trying to get minimum of unbounded eoIntBounds"); } virtual long int maximum() const { throw std::logic_error("Trying to get maximum of unbounded eoIntBounds"); } virtual long int range() const { throw std::logic_error("Trying to get range of unbounded eoIntBounds"); } virtual double uniform(eoRng & _rng = eo::rng) const { throw std::logic_error("Trying to generate uniform values in unbounded eoIntBounds"); } virtual long int random(eoRng & _rng = eo::rng) const { throw std::logic_error("Trying to generate uniform values in unbounded eoIntBounds"); } // methods from eoPersistent /** * Read object. * @param _is A std::istream. * but reading should not be done here, because of bound problems * see eoIntVectorBounds */ virtual void readFrom(std::istream& _is) { throw std::runtime_error("Should not use eoIntBounds::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 eoIntBounds * dup() const { return new eoIntNoBounds(*this); }};// one object for all - see eoIntBounds.cppextern eoIntNoBounds eoDummyIntNoBounds;/** * fully bounded eoIntBound == interval */class eoIntInterval : public eoIntBounds{public : virtual ~eoIntInterval(){} /** Simple bounds = minimum and maximum (allowed) */ eoIntInterval(long int _min=0, long int _max=1) : repMinimum(_min), repMaximum(_max), repRange(_max-_min) { if (repRange<=0) throw std::logic_error("Void range in eoIntBounds"); } // accessors virtual long int minimum() const { return repMinimum; } virtual long int maximum() const { return repMaximum; } virtual long int 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); } virtual long int random(eoRng & _rng = eo::rng) const { return repMinimum + _rng.random(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 eoIntVectorBounds */ virtual void readFrom(std::istream& _is) { throw std::runtime_error("Should not use eoIntInterval::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 eoIntBounds * dup() const { return new eoIntInterval(*this); }private : long int repMinimum; long int repMaximum; long int repRange; // to minimize operations ???};/** * an eoIntBound bounded from below only */class eoIntBelowBound : public eoIntBounds{public : virtual ~eoIntBelowBound(){}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -