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 MOEOARCHIVE_H_
00039 #define MOEOARCHIVE_H_
00040
00041 #include <eoPop.h>
00042 #include <comparator/moeoObjectiveVectorComparator.h>
00043 #include <comparator/moeoParetoObjectiveVectorComparator.h>
00044
00048 template < class MOEOT >
00049 class moeoArchive : public eoPop < MOEOT >
00050 {
00051 public:
00052
00053 using eoPop < MOEOT > :: size;
00054 using eoPop < MOEOT > :: resize;
00055 using eoPop < MOEOT > :: operator[];
00056 using eoPop < MOEOT > :: back;
00057 using eoPop < MOEOT > :: pop_back;
00058
00059
00063 typedef typename MOEOT::ObjectiveVector ObjectiveVector;
00064
00065
00070 moeoArchive() : eoPop < MOEOT >(), comparator(paretoComparator)
00071 {}
00072
00073
00078 moeoArchive(moeoObjectiveVectorComparator < ObjectiveVector > & _comparator) : eoPop < MOEOT >(), comparator(_comparator)
00079 {}
00080
00081
00086 bool dominates (const ObjectiveVector & _objectiveVector) const
00087 {
00088 for (unsigned int i = 0; i<size(); i++)
00089 {
00090
00091 if ( comparator(_objectiveVector, operator[](i).objectiveVector()) )
00092 {
00093 return true;
00094 }
00095 }
00096 return false;
00097 }
00098
00099
00104 bool contains (const ObjectiveVector & _objectiveVector) const
00105 {
00106 for (unsigned int i = 0; i<size(); i++)
00107 {
00108 if (operator[](i).objectiveVector() == _objectiveVector)
00109 {
00110 return true;
00111 }
00112 }
00113 return false;
00114 }
00115
00116
00121 void update (const MOEOT & _moeo)
00122 {
00123
00124 for (unsigned int j=0; j<size();)
00125 {
00126
00127 if ( comparator(operator[](j).objectiveVector(), _moeo.objectiveVector()) )
00128 {
00129 operator[](j) = back();
00130 pop_back();
00131 }
00132 else if (_moeo.objectiveVector() == operator[](j).objectiveVector())
00133 {
00134 operator[](j) = back();
00135 pop_back();
00136 }
00137 else
00138 {
00139 j++;
00140 }
00141 }
00142
00143 bool dom = false;
00144 for (unsigned int j=0; j<size(); j++)
00145 {
00146
00147 if ( comparator(_moeo.objectiveVector(), operator[](j).objectiveVector()) )
00148 {
00149 dom = true;
00150 break;
00151 }
00152 }
00153 if (!dom)
00154 {
00155 push_back(_moeo);
00156 }
00157 }
00158
00159
00164 void update (const eoPop < MOEOT > & _pop)
00165 {
00166 for (unsigned int i=0; i<_pop.size(); i++)
00167 {
00168 update(_pop[i]);
00169 }
00170 }
00171
00172
00177 bool equals (const moeoArchive < MOEOT > & _arch)
00178 {
00179 for (unsigned int i=0; i<size(); i++)
00180 {
00181 if (! _arch.contains(operator[](i).objectiveVector()))
00182 {
00183 return false;
00184 }
00185 }
00186 for (unsigned int i=0; i<_arch.size() ; i++)
00187 {
00188 if (! contains(_arch[i].objectiveVector()))
00189 {
00190 return false;
00191 }
00192 }
00193 return true;
00194 }
00195
00196
00197 private:
00198
00200 moeoObjectiveVectorComparator < ObjectiveVector > & comparator;
00202 moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator;
00203
00204 };
00205
00206 #endif