00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef MOEOOBJECTIVEVECTORCOMPARATOR_H_
00014 #define MOEOOBJECTIVEVECTORCOMPARATOR_H_
00015
00016 #include <math.h>
00017 #include <eoFunctor.h>
00018
00023 template < class ObjectiveVector >
00024 class moeoObjectiveVectorComparator : public eoBF < const ObjectiveVector &, const ObjectiveVector &, bool >
00025 {};
00026
00027
00031 template < class ObjectiveVector >
00032 class moeoParetoObjectiveVectorComparator : public moeoObjectiveVectorComparator < ObjectiveVector >
00033 {
00034 public:
00035
00041 bool operator()(const ObjectiveVector & _objectiveVector1, const ObjectiveVector & _objectiveVector2)
00042 {
00043 bool dom = false;
00044 for (unsigned i=0; i<ObjectiveVector::nObjectives(); i++)
00045 {
00046
00047 if ( fabs(_objectiveVector1[i] - _objectiveVector2[i]) > ObjectiveVector::Traits::tolerance() )
00048 {
00049
00050 if (ObjectiveVector::minimizing(i))
00051 {
00052 if (_objectiveVector1[i] < _objectiveVector2[i])
00053 {
00054 dom = true;
00055 }
00056 else
00057 {
00058 return false;
00059 }
00060 }
00061
00062 else if (ObjectiveVector::maximizing(i))
00063 {
00064 if (_objectiveVector1[i] > _objectiveVector2[i])
00065 {
00066 dom = true;
00067 }
00068 else
00069 {
00070 return false;
00071 }
00072 }
00073 }
00074 }
00075 return dom;
00076 }
00077
00078 };
00079
00080
00087 template < class ObjectiveVector >
00088 class moeoGDominanceObjectiveVectorComparator : public moeoObjectiveVectorComparator < ObjectiveVector >
00089 {
00090 public:
00091
00096 moeoGDominanceObjectiveVectorComparator(ObjectiveVector _ref) : ref(_ref)
00097 {}
00098
00099
00105 bool operator()(const ObjectiveVector & _objectiveVector1, const ObjectiveVector & _objectiveVector2)
00106 {
00107 unsigned flag1 = flag(_objectiveVector1);
00108 unsigned flag2 = flag(_objectiveVector2);
00109 if (flag1==0)
00110 {
00111
00112 return false;
00113 }
00114 else if ( (flag1==1) && (flag2==0) )
00115 {
00116
00117 return true;
00118 }
00119 else
00120 {
00121
00122 return paretoComparator(_objectiveVector1, _objectiveVector2);
00123 }
00124 }
00125
00126
00127 private:
00128
00130 ObjectiveVector ref;
00132 moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator;
00133
00134
00139 unsigned flag(const ObjectiveVector & _objectiveVector)
00140 {
00141 unsigned result=1;
00142 for (unsigned i=0; i<ref.nObjectives(); i++)
00143 {
00144 if (_objectiveVector[i] > ref[i])
00145 {
00146 result=0;
00147 }
00148 }
00149 if (result==0)
00150 {
00151 result=1;
00152 for (unsigned i=0; i<ref.nObjectives(); i++)
00153 {
00154 if (_objectiveVector[i] < ref[i])
00155 {
00156 result=0;
00157 }
00158 }
00159 }
00160 return result;
00161 }
00162
00163 };
00164
00165 #endif