00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef MOEOSHARINGDIVERSITYASSIGNMENT_H_
00014 #define MOEOSHARINGDIVERSITYASSIGNMENT_H_
00015
00016 #include <eoPop.h>
00017 #include <comparator/moeoDiversityThenFitnessComparator.h>
00018 #include <distance/moeoDistance.h>
00019 #include <distance/moeoDistanceMatrix.h>
00020 #include <distance/moeoEuclideanDistance.h>
00021 #include <diversity/moeoDiversityAssignment.h>
00022
00027 template < class MOEOT >
00028 class moeoSharingDiversityAssignment : public moeoDiversityAssignment < MOEOT >
00029 {
00030 public:
00031
00033 typedef typename MOEOT::ObjectiveVector ObjectiveVector;
00034
00035
00042 moeoSharingDiversityAssignment(moeoDistance<MOEOT,double> & _distance, double _nicheSize = 0.5, double _alpha = 1.0) : distance(_distance), nicheSize(_nicheSize), alpha(_alpha)
00043 {}
00044
00045
00051 moeoSharingDiversityAssignment(double _nicheSize = 0.5, double _alpha = 1.0) : distance(defaultDistance), nicheSize(_nicheSize), alpha(_alpha)
00052 {}
00053
00054
00059 void operator()(eoPop < MOEOT > & _pop)
00060 {
00061
00062 setSimilarities(_pop);
00063
00064 moeoDiversityThenFitnessComparator < MOEOT > divComparator;
00065 double max = std::max_element(_pop.begin(), _pop.end(), divComparator)->diversity();
00066 for (unsigned int i=0 ; i<_pop.size() ; i++)
00067 {
00068 _pop[i].diversity(max - _pop[i].diversity());
00069 }
00070 }
00071
00072
00080 void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec)
00081 {
00082 std::cout << "WARNING : updateByDeleting not implemented in moeoSharingDiversityAssignment" << std::endl;
00083 }
00084
00085
00086 protected:
00087
00089 moeoDistance < MOEOT , double > & distance;
00091 moeoEuclideanDistance < MOEOT > defaultDistance;
00093 double nicheSize;
00095 double alpha;
00096
00097
00102 virtual void setSimilarities(eoPop < MOEOT > & _pop)
00103 {
00104
00105 moeoDistanceMatrix < MOEOT , double > dMatrix (_pop.size(), distance);
00106 dMatrix(_pop);
00107
00108 double sum;
00109 for (unsigned int i=0; i<_pop.size(); i++)
00110 {
00111 sum = 0.0;
00112 for (unsigned int j=0; j<_pop.size(); j++)
00113 {
00114 sum += sh(dMatrix[i][j]);
00115 }
00116 _pop[i].diversity(sum);
00117 }
00118 }
00119
00120
00125 double sh(double _dist)
00126 {
00127 double result;
00128 if (_dist < nicheSize)
00129 {
00130 result = 1.0 - pow(_dist / nicheSize, alpha);
00131 }
00132 else
00133 {
00134 result = 0.0;
00135 }
00136 return result;
00137 }
00138
00139 };
00140
00141
00142 #endif