00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef MOEOREFERENCEPOINTINDICATORBASEDFITNESSASSIGNMENT_H_
00014 #define MOEOREFERENCEPOINTINDICATORBASEDFITNESSASSIGNMENT_H_
00015
00016 #include <math.h>
00017 #include <eoPop.h>
00018 #include <fitness/moeoFitnessAssignment.h>
00019 #include <metric/moeoNormalizedSolutionVsSolutionBinaryMetric.h>
00020
00024 template < class MOEOT >
00025 class moeoReferencePointIndicatorBasedFitnessAssignment : public moeoFitnessAssignment < MOEOT >
00026 {
00027 public:
00028
00030 typedef typename MOEOT::ObjectiveVector ObjectiveVector;
00031
00037 moeoReferencePointIndicatorBasedFitnessAssignment (ObjectiveVector & _refPoint, moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > & _metric) :
00038 refPoint(_refPoint), metric(_metric)
00039 {}
00040
00041
00046 void operator()(eoPop < MOEOT > & _pop)
00047 {
00048
00049 setup(_pop);
00050
00051 setFitnesses(_pop);
00052 }
00053
00054
00060 void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec)
00061 {
00062
00063 }
00064
00065
00066 protected:
00067
00069 ObjectiveVector & refPoint;
00071 moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > & metric;
00072
00073
00078 void setup(const eoPop < MOEOT > & _pop)
00079 {
00080 double min, max;
00081 for (unsigned int i=0; i<ObjectiveVector::Traits::nObjectives(); i++)
00082 {
00083 min = refPoint[i];
00084 max = refPoint[i];
00085 for (unsigned int j=0; j<_pop.size(); j++)
00086 {
00087 min = std::min(min, _pop[j].objectiveVector()[i]);
00088 max = std::max(max, _pop[j].objectiveVector()[i]);
00089 }
00090
00091 metric.setup(min, max, i);
00092 }
00093 }
00094
00099 void setFitnesses(eoPop < MOEOT > & _pop)
00100 {
00101 for (unsigned int i=0; i<_pop.size(); i++)
00102 {
00103 _pop[i].fitness(- metric(_pop[i].objectiveVector(), refPoint) );
00104 }
00105 }
00106
00107 };
00108
00109 #endif