00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef MOEOSHARINGDIVERSITYASSIGNMENT_H_
00039 #define MOEOSHARINGDIVERSITYASSIGNMENT_H_
00040
00041 #include <eoPop.h>
00042 #include <comparator/moeoDiversityThenFitnessComparator.h>
00043 #include <distance/moeoDistance.h>
00044 #include <distance/moeoDistanceMatrix.h>
00045 #include <distance/moeoEuclideanDistance.h>
00046 #include <diversity/moeoDiversityAssignment.h>
00047
00052 template < class MOEOT >
00053 class moeoSharingDiversityAssignment : public moeoDiversityAssignment < MOEOT >
00054 {
00055 public:
00056
00058 typedef typename MOEOT::ObjectiveVector ObjectiveVector;
00059
00060
00067 moeoSharingDiversityAssignment(moeoDistance<MOEOT,double> & _distance, double _nicheSize = 0.5, double _alpha = 1.0) : distance(_distance), nicheSize(_nicheSize), alpha(_alpha)
00068 {}
00069
00070
00076 moeoSharingDiversityAssignment(double _nicheSize = 0.5, double _alpha = 1.0) : distance(defaultDistance), nicheSize(_nicheSize), alpha(_alpha)
00077 {}
00078
00079
00084 void operator()(eoPop < MOEOT > & _pop)
00085 {
00086
00087 setSimilarities(_pop);
00088
00089 moeoDiversityThenFitnessComparator < MOEOT > divComparator;
00090 double max = std::max_element(_pop.begin(), _pop.end(), divComparator)->diversity();
00091 for (unsigned int i=0 ; i<_pop.size() ; i++)
00092 {
00093 _pop[i].diversity(max - _pop[i].diversity());
00094 }
00095 }
00096
00097
00105 void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec)
00106 {
00107 std::cout << "WARNING : updateByDeleting not implemented in moeoSharingDiversityAssignment" << std::endl;
00108 }
00109
00110
00111 protected:
00112
00114 moeoDistance < MOEOT , double > & distance;
00116 moeoEuclideanDistance < MOEOT > defaultDistance;
00118 double nicheSize;
00120 double alpha;
00121
00122
00127 virtual void setSimilarities(eoPop < MOEOT > & _pop)
00128 {
00129
00130 moeoDistanceMatrix < MOEOT , double > dMatrix (_pop.size(), distance);
00131 dMatrix(_pop);
00132
00133 double sum;
00134 for (unsigned int i=0; i<_pop.size(); i++)
00135 {
00136 sum = 0.0;
00137 for (unsigned int j=0; j<_pop.size(); j++)
00138 {
00139 sum += sh(dMatrix[i][j]);
00140 }
00141 _pop[i].diversity(sum);
00142 }
00143 }
00144
00145
00150 double sh(double _dist)
00151 {
00152 double result;
00153 if (_dist < nicheSize)
00154 {
00155 result = 1.0 - pow(_dist / nicheSize, alpha);
00156 }
00157 else
00158 {
00159 result = 0.0;
00160 }
00161 return result;
00162 }
00163
00164 };
00165
00166
00167 #endif