00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef MOEOARCHIVE_H_
00014 #define MOEOARCHIVE_H_
00015
00016 #include <eoPop.h>
00017 #include <comparator/moeoObjectiveVectorComparator.h>
00018 #include <comparator/moeoParetoObjectiveVectorComparator.h>
00019
00023 template < class MOEOT >
00024 class moeoArchive : public eoPop < MOEOT >
00025 {
00026 public:
00027
00028 using eoPop < MOEOT > :: size;
00029 using eoPop < MOEOT > :: operator[];
00030 using eoPop < MOEOT > :: back;
00031 using eoPop < MOEOT > :: pop_back;
00032
00033
00037 typedef typename MOEOT::ObjectiveVector ObjectiveVector;
00038
00039
00044 moeoArchive() : eoPop < MOEOT >(), comparator(paretoComparator)
00045 {}
00046
00047
00052 moeoArchive(moeoObjectiveVectorComparator < ObjectiveVector > & _comparator) : eoPop < MOEOT >(), comparator(_comparator)
00053 {}
00054
00055
00060 bool dominates (const ObjectiveVector & _objectiveVector) const
00061 {
00062 for (unsigned int i = 0; i<size(); i++)
00063 {
00064
00065 if ( comparator(_objectiveVector, operator[](i).objectiveVector()) )
00066 {
00067 return true;
00068 }
00069 }
00070 return false;
00071 }
00072
00073
00078 bool contains (const ObjectiveVector & _objectiveVector) const
00079 {
00080 for (unsigned int i = 0; i<size(); i++)
00081 {
00082 if (operator[](i).objectiveVector() == _objectiveVector)
00083 {
00084 return true;
00085 }
00086 }
00087 return false;
00088 }
00089
00090
00095 void update (const MOEOT & _moeo)
00096 {
00097
00098 for (unsigned int j=0; j<size();)
00099 {
00100
00101 if ( comparator(operator[](j).objectiveVector(), _moeo.objectiveVector()) )
00102 {
00103 operator[](j) = back();
00104 pop_back();
00105 }
00106 else if (_moeo.objectiveVector() == operator[](j).objectiveVector())
00107 {
00108 operator[](j) = back();
00109 pop_back();
00110 }
00111 else
00112 {
00113 j++;
00114 }
00115 }
00116
00117 bool dom = false;
00118 for (unsigned int j=0; j<size(); j++)
00119 {
00120
00121 if ( comparator(_moeo.objectiveVector(), operator[](j).objectiveVector()) )
00122 {
00123 dom = true;
00124 break;
00125 }
00126 }
00127 if (!dom)
00128 {
00129 push_back(_moeo);
00130 }
00131 }
00132
00133
00138 void update (const eoPop < MOEOT > & _pop)
00139 {
00140 for (unsigned int i=0; i<_pop.size(); i++)
00141 {
00142 update(_pop[i]);
00143 }
00144 }
00145
00146
00151 bool equals (const moeoArchive < MOEOT > & _arch)
00152 {
00153 for (unsigned int i=0; i<size(); i++)
00154 {
00155 if (! _arch.contains(operator[](i).objectiveVector()))
00156 {
00157 return false;
00158 }
00159 }
00160 for (unsigned int i=0; i<_arch.size() ; i++)
00161 {
00162 if (! contains(_arch[i].objectiveVector()))
00163 {
00164 return false;
00165 }
00166 }
00167 return true;
00168 }
00169
00170
00171 private:
00172
00174 moeoObjectiveVectorComparator < ObjectiveVector > & comparator;
00176 moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator;
00177
00178 };
00179
00180 #endif