EvolvingObjects
|
00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- 00002 00003 //----------------------------------------------------------------------------- 00004 // eoStandardFlight.h 00005 // (c) OPAC 2007 00006 /* 00007 This library is free software; you can redistribute it and/or 00008 modify it under the terms of the GNU Lesser General Public 00009 License as published by the Free Software Foundation; either 00010 version 2 of the License, or (at your option) any later version. 00011 00012 This library is distributed in the hope that it will be useful, 00013 but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 Lesser General Public License for more details. 00016 00017 You should have received a copy of the GNU Lesser General Public 00018 License along with this library; if not, write to the Free Software 00019 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00020 00021 Contact: thomas.legrand@lifl.fr 00022 */ 00023 //----------------------------------------------------------------------------- 00024 00025 #ifndef EOSTANDARDFLIGHT_H 00026 #define EOSTANDARDFLIGHT_H 00027 00028 //----------------------------------------------------------------------------- 00029 #include <eoFlight.h> 00030 //----------------------------------------------------------------------------- 00031 00032 00033 00040 template < class POT > class eoStandardFlight:public eoFlight < POT > 00041 { 00042 00043 public: 00044 00045 /* 00046 * Each element for the postion evaluation is expected to be of type PositionType. 00047 */ 00048 typedef typename POT::AtomType PositionType; 00049 00050 00054 eoStandardFlight ():bnds (*(new eoRealVectorNoBounds(0))){} 00055 00056 00061 eoStandardFlight (eoRealVectorBounds & _bounds):bnds (_bounds){} 00062 00063 00071 eoStandardFlight (const unsigned _dim,const double & _min,const double & _max ):bnds (*(new eoRealVectorBounds(_dim,_min,_max))){} 00072 00073 00078 void operator () (POT & _po) 00079 { 00080 // need to resize the bounds even if there are dummy because of "isBounded" call 00081 bnds.adjust_size(_po.size()); 00082 00083 for (unsigned j = 0; j < _po.size (); j++) 00084 { 00085 PositionType newPosition; 00086 00087 // tmp position 00088 newPosition = _po[j] + _po.velocities[j]; 00089 00090 /* check bounds */ 00091 if (bnds.isMinBounded(j)) 00092 newPosition=std::max(newPosition,bnds.minimum(j)); 00093 if (bnds.isMaxBounded(j)) 00094 newPosition=std::min(newPosition,bnds.maximum(j)); 00095 00096 _po[j]=newPosition; 00097 } 00098 // invalidate the fitness because the positions have changed 00099 _po.invalidate(); 00100 } 00101 00102 protected: 00103 eoRealVectorBounds & bnds; 00104 }; 00105 00106 00107 00108 00109 #endif /*EOSTANDARDFLIGHT_H */