EvolvingObjects
|
00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- 00002 00003 //----------------------------------------------------------------------------- 00004 // eoDistance.h 00005 // (c) GeNeura Team, 1998, Marc Schoenauer 2001 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: todos@geneura.ugr.es, http://geneura.ugr.es 00022 Marc.Schoenauer@polytechnique.fr 00023 */ 00024 //----------------------------------------------------------------------------- 00025 00026 #ifndef _eoDistance_H 00027 #define _eoDistance_H 00028 00029 #include <eoFunctor.h> 00030 00039 template< class EOT > 00040 class eoDistance : public eoBF<const EOT &, const EOT &, double> 00041 {}; 00042 00043 00048 template< class EOT > 00049 class eoQuadDistance : public eoDistance<EOT> 00050 { 00051 public: 00052 double operator()(const EOT & _v1, const EOT & _v2) 00053 { 00054 double sum=0.0; 00055 for (unsigned i=0; i<_v1.size(); i++) 00056 { 00057 double r = static_cast<double> (_v1[i]) - static_cast<double> (_v2[i]); 00058 sum += r*r; 00059 } 00060 return sqrt(sum); 00061 } 00062 }; 00063 00070 template< class EOT > 00071 class eoHammingDistance : public eoDistance<EOT> 00072 { 00073 public: 00074 double operator()(const EOT & _v1, const EOT & _v2) 00075 { 00076 double sum=0.0; 00077 for (unsigned i=0; i<_v1.size(); i++) 00078 { 00079 double r = static_cast<double> (_v1[i]) - static_cast<double> (_v2[i]); 00080 sum += fabs(r); 00081 } 00082 return sum; 00083 } 00084 }; 00085 00086 /* this distance measures the difference in fitness 00087 * I am not sure it can be of any use, though ... 00088 * except for some testing 00089 */ 00090 template< class EOT > 00091 class eoFitnessDistance : public eoDistance<EOT> 00092 { 00093 public: 00094 double operator()(const EOT & _v1, const EOT & _v2) 00095 { 00096 double d = _v1.fitness() - _v2.fitness(); 00097 return sqrt(d*d); 00098 } 00099 }; 00100 00101 00104 #endif