EvolvingObjects
eoStandardFlight.h
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 */
 All Classes Namespaces Files Functions Variables Typedefs Friends