eoSharing.h

00001 
00024 //-----------------------------------------------------------------------------
00025 
00026 #ifndef eoSharing_h
00027 #define eoSharing_h
00028 
00029 #include <eoPerf2Worth.h>
00030 #include <utils/eoDistance.h>
00031 
00037   class dMatrix : public std::vector<double>
00038   {
00039   public:
00040     // Ctor : sets size
00041     dMatrix(unsigned _s) : std::vector<double>(_s*_s), rSize(_s) {}
00042 
00044     double operator()(unsigned _i, unsigned _j) const
00045     {
00046       return this->operator[](_i*rSize + _j);
00047     }
00048 
00050     double & operator()(unsigned _i, unsigned _j)
00051     {
00052       return this->operator[](_i*rSize + _j);
00053     }
00054 
00056     void printOn(std::ostream & _os)
00057     {
00058       unsigned index=0;
00059       for (unsigned i=0; i<rSize; i++)
00060         {
00061           for (unsigned j=0; j<rSize; j++)
00062             _os << this->operator[](index++) << " " ;
00063           _os << std::endl;
00064         }
00065       _os << std::endl;
00066     }
00067 
00068     private:
00069       unsigned rSize;              // row size (== number of columns!)
00070   };
00071 
00072 
00078 template <class EOT>
00079 class eoSharing : public eoPerf2Worth<EOT>
00080 {
00081 public:
00082 
00083     using eoPerf2Worth<EOT>::value;
00084 
00085 
00086   /* Ctor requires a distance - cannot have a default distance! */
00087   eoSharing(double _nicheSize, eoDistance<EOT> & _dist) : eoPerf2Worth<EOT>("Sharing"),
00088                                              nicheSize(_nicheSize),
00089                                              dist(_dist)
00090   {}
00091 
00094     void operator()(const eoPop<EOT>& _pop)
00095     {
00096       unsigned i, j,
00097         pSize=_pop.size();
00098       if (pSize <= 1)
00099         throw std::runtime_error("Apptempt to do sharing with population of size 1");
00100       value().resize(pSize);
00101       std::vector<double> sim(pSize);      // to hold the similarities
00102       dMatrix distMatrix(pSize*(pSize-1)/2); // to hold the distances
00103 
00104       // compute the similarities (wrong name for distMatrix, I know)
00105       distMatrix(0,0)=1;
00106       for (i=1; i<pSize; i++)
00107         {
00108           distMatrix(i,i)=1;
00109           for (j=0; j<i; j++)
00110             {
00111               double d =  dist(_pop[i], _pop[j]);
00112               distMatrix(i,j) =
00113                 distMatrix(j,i) = ( d>nicheSize ? 0 : 1-(d/nicheSize) );
00114             }
00115         }
00116 
00117       for (i=0; i<pSize; i++)
00118         {
00119           double sum=0.0;
00120           for (j=0; j<pSize; j++)
00121             sum += distMatrix(i,j);
00122           sim[i] = sum;
00123         }
00124 
00125       // now set the worthes values
00126       for (i = 0; i < _pop.size(); ++i)
00127         value()[i]=_pop[i].fitness()/sim[i];
00128     }
00129     // private data of class eoSharing
00130 private:
00131   double nicheSize;
00132   eoDistance<EOT> & dist;            // specific distance
00133 };
00134 
00135 
00136 
00137 #endif

Generated on Thu Oct 19 05:06:38 2006 for EO by  doxygen 1.3.9.1