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
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;
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
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);
00102 dMatrix distMatrix(pSize);
00103
00104
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
00126 for (i = 0; i < _pop.size(); ++i)
00127 value()[i]=_pop[i].fitness()/sim[i];
00128 }
00129
00130 private:
00131 double nicheSize;
00132 eoDistance<EOT> & dist;
00133 };
00134
00135
00136
00137 #endif