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

📄 eoscalarfitnessassembled.h

📁 这是linux下的进化计算的源代码。 === === === === === === === === === === === ===== check latest news at http:
💻 H
字号:
 /* -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- *///-----------------------------------------------------------------------------// eoScalarFitnessAssembled.h// Marc Wintermantel & Oliver Koenig// IMES-ST@ETHZ.CH// March 2003/*    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@inria.fr             mak@dhi.dk*///-----------------------------------------------------------------------------#ifndef eoScalarFitnessAssembled_h#define eoScalarFitnessAssembled_h#include <functional>#include <iostream>#include <stdexcept>#include <vector>#include <string>//! Defines properties of eoScalarFitnessAssembled./*! Properties that are hold in this traits class:    - std::vector<std::string> to hold descriptions of the different fitness terms*/class eoScalarFitnessAssembledTraits{public:  typedef std::vector<std::string>::size_type size_type;  static void setDescription( size_type _idx, std::string _descr ) {    if ( _idx < TermDescriptions.size() )      TermDescriptions[_idx] = _descr;    else{      TermDescriptions.resize(_idx, "Unnamed variable" );      TermDescriptions[_idx] = _descr;    }  }  static std::string getDescription( size_type _idx) {    if ( _idx < TermDescriptions.size() )      return TermDescriptions[_idx ];    else      return "Unnamed Variable";  }  static void resize( size_type _n, const std::string& _descr) {    TermDescriptions.resize(_n, _descr);  }  static size_type size() { return TermDescriptions.size(); }  static std::vector<std::string> getDescriptionVector() { return TermDescriptions; }private:  static std::vector<std::string> TermDescriptions;};//! Implements fitness as std::vector, storing all values that might occur during fitness assembly/*! Properties:    - Wraps a scalar fitness values such as a double or int, with the option of      maximizing (using less<ScalarType>) or minimizing (using greater<ScalarType>).    - Stores all kinda different values met during fitness assembly, to be defined in eoEvalFunc.    - It overrides operator<() to use the Compare template argument.    - Suitable constructors and assignments and casts are defined to work      with this quantity as if it were a ScalarType.    - Global fitness value is stored as first element in the vector*/template <class ScalarType, class Compare, class FitnessTraits >class eoScalarFitnessAssembled : public std::vector<ScalarType> {public:    using std::vector< ScalarType >::empty;    using std::vector< ScalarType >::front;    using std::vector< ScalarType >::size;  typedef typename std::vector<ScalarType> baseVector;  typedef typename baseVector::size_type size_type;  // Basic constructors and assignments  eoScalarFitnessAssembled()    : baseVector( FitnessTraits::size() ),      feasible(true), failed(false), msg("")  {}  eoScalarFitnessAssembled( size_type _n,			    const ScalarType& _val,			    const std::string& _descr="Unnamed variable" )    : baseVector(_n, _val),      feasible(true), failed(false), msg("")  {    if ( _n > FitnessTraits::size() )    FitnessTraits::resize(_n, _descr);  }  eoScalarFitnessAssembled( const eoScalarFitnessAssembled& other)    : baseVector( other ),      feasible(other.feasible),      failed(other.failed),      msg(other.msg)  {}  eoScalarFitnessAssembled& operator=( const eoScalarFitnessAssembled& other) {    baseVector::operator=( other );    feasible = other.feasible;    failed = other.failed;    msg = other.msg;    return *this;  }  // Constructors and assignments to work with scalar type  eoScalarFitnessAssembled( const ScalarType& v )    : baseVector( 1, v ),      feasible(true), failed(false), msg("")  {}  eoScalarFitnessAssembled& operator=( const ScalarType& v ) {      if( empty() )          push_back( v );      else          front() = v;      return *this;  }  //! Overload push_back()  void push_back(const ScalarType& _val ){    baseVector::push_back( _val );    if ( size() > FitnessTraits::size() )      FitnessTraits::setDescription( size()-1, "Unnamed variable");  }  //! Overload push_back()  void push_back(const ScalarType& _val, const std::string& _descr ){    baseVector::push_back( _val );    FitnessTraits::setDescription( size()-1, _descr );  }  //! Overload resize()  void resize( size_type _n, const ScalarType& _val = ScalarType(), const std::string& _descr = "Unnamed variable" ){    baseVector::resize(_n, _val);    FitnessTraits::resize(_n, _descr);  }  //! Set description  void setDescription( size_type _idx, std::string _descr ) {    FitnessTraits::setDescription( _idx, _descr );  }  //! Get description  std::string getDescription( size_type _idx ){ return FitnessTraits::getDescription( _idx ); }  //! Get vector with descriptions  std::vector<std::string> getDescriptionVector() { return FitnessTraits::getDescriptionVector(); }  //! Feasibility boolean  /**   * Can be specified anywhere in fitness evaluation   * as an indicator if the individual is in some feasible range.   */  bool feasible;  //! Failed boolean  /**   * Can be specified anywhere in fitness evaluation   * as an indicator if the evaluation of the individual failed   */  bool failed;  //! Message  /**   * Can be specified anywhere in fitness evaluation.   * Typically used to store some sort of error messages, if evaluation of individual failed.   */  std::string msg;  // Scalar type access  operator ScalarType(void) const {    if ( empty() )      return 0.0;    else      return front();  }  //! Print term values and descriptions  void printAll(std::ostream& os) const {    for (size_type i=0; i < size(); ++i )      os << FitnessTraits::getDescription(i) << " = " << operator[](i) << " ";  }  //! Comparison, using less by default  bool operator<(const eoScalarFitnessAssembled& other) const{    if ( empty() || other.empty() )      return false;    else      return Compare()( front() , other.front() );  }  //! Comparison with ScalarTypes. Explicit definition needed to compile with VS 8.0  bool operator<(ScalarType x) const{  	eoScalarFitnessAssembled ScalarFitness(x);  	return this->operator<(ScalarFitness);  }    // implementation of the other operators  bool operator>( const eoScalarFitnessAssembled<ScalarType, Compare, FitnessTraits>& y ) const  { return y < *this; }  // implementation of the other operators  bool operator<=( const eoScalarFitnessAssembled<ScalarType, Compare, FitnessTraits>& y ) const { return !(*this > y); }  // implementation of the other operators  bool operator>=(const eoScalarFitnessAssembled<ScalarType, Compare, FitnessTraits>& y ) const { return !(*this < y); }};/**Typedefs for fitness comparison, Maximizing Fitness compares with less,and minimizing fitness compares with greater. This because we want ordinaryfitness values (doubles) to be equivalent with Maximizing Fitness, andcomparing with less is the default behaviour.*/typedef eoScalarFitnessAssembled<double, std::less<double>, eoScalarFitnessAssembledTraits >    eoAssembledMaximizingFitness;typedef eoScalarFitnessAssembled<double, std::greater<double>, eoScalarFitnessAssembledTraits > eoAssembledMinimizingFitness;template <class F, class Cmp, class FitnessTraits>std::ostream& operator<<(std::ostream& os, const eoScalarFitnessAssembled<F, Cmp, FitnessTraits>& f){  for (unsigned i=0; i < f.size(); ++i)    os << f[i] << " ";  os << f.feasible << " ";  os << f.failed << " ";  return os;}template <class F, class Cmp, class FitnessTraits>std::istream& operator>>(std::istream& is, eoScalarFitnessAssembled<F, Cmp, FitnessTraits>& f){  for (unsigned i=0; i < f.size(); ++i){    F value;    is >> value;    f[i] = value;  }  is >> f.feasible;  is >> f.failed;  return is;}#endif

⌨️ 快捷键说明

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